<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Chris "Atos" Spears · Work Log</title>
    <link>https://catnipgames.net/blog/</link>
    <description>Shroud of the Avatar development at Catnip Games, day by day.</description>
    <language>en-us</language>
    <ttl>60</ttl>
    <generator>tools/blog-rss.ps1 (generated file, do not hand-edit)</generator>
    <lastBuildDate>Tue, 04 Aug 2026 17:44:37 -0500</lastBuildDate>
    <atom:link href="https://catnipgames.net/blog/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Headlines · 2026-08-04</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-headlines</guid>
      <pubDate>Tue, 04 Aug 2026 17:44:37 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Backed up the entire community wiki &mdash; 38,417 pages and 12,700 images, checksum-verified, after its host started failing.</li>
        <li>Experience attenuation is gone. High level characters no longer hit an hourly ceiling on combat experience, and no kill pays zero.</li>
        <li>Tamed pets stopped leash-looping: the tether changed the distance that starts a leash without changing the one that ends it, so pets set and cleared it on alternating ticks and dumped their fight on their handler every time.</li>
        <li>Pet Taunting Training pulls creatures onto the pet. Three separate things were stopping it: no threat move when the buff landed, a buff most pets did not read, and a distance falloff that bottomed out at the range pets fight from.</li>
        <li>The smoke bomb hides you. Obfuscate raised your stealth level but never faded you out, so you stood in plain view. It is now a camouflage that lands while you are targeted, and bleeds cannot strip the stealth you take underneath it.</li>
        <li><b>Interface lockups.</b> Two faults that killed chat focus and every drag for a whole session are fixed, and a watchdog now catches the rest and switches input back on by itself.</li>
        <li>The map now shows every housing lot in town, coloured by whether you can claim it, each drawn as the lot's true boundary rectangle at its real size, rotation and facing.</li>
        <li><b>Bug queue pass.</b> A new automated run works the open bug reports one at a time, from fix through testing task through close, and keeps going until the queue is empty.</li>
        <li><b>Guilds and Guild Wars Deep Dive</b> published: twenty-five proposals open for votes and comments, headlined by war PvP scoped to your actual enemy, a guild vault, negotiated war terms, and each guild's own page on the web.</li>
        <li>Dragging several glyphs at once into a deck slot works: all of them land, the slot stays unlocked, and a stack dropped on a locked slot no longer eats the glyph it displaced.</li>
        <li><b>Player-Owned Towns Deep Dive</b> published: twenty-four proposals open for votes and comments, headlined by a governor's console, an in-game town directory, a placeable town crier, and a donation board for the town square.</li>
        <li>A <b>Player Dungeons</b> deep dive joined the proposals series: 25 proposals to give player-built dungeons an audience, from clear-check publishing and entrance plaques with record times to a Delve Board directory and a prize chest staked with the owner's own gold</li>
      </ul>]]></description>
    </item>
    <item>
      <title>UI: Made the health and focus bars on the new interface status plates thicker, 7 to 12…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-f1a82eb38042</guid>
      <pubDate>Tue, 04 Aug 2026 02:25:51 -0500</pubDate>
      <description><![CDATA[Made the health and focus bars on the new interface status plates thicker, 7 to 12 pixels, so the numbers on them sit inside the bar instead of poking out top and bottom.]]></description>
    </item>
    <item>
      <title>UI: Lined the buff icons up with the left edge of the bars on the player, target, party, pet…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-68f1b4b6b3b4</guid>
      <pubDate>Tue, 04 Aug 2026 02:25:51 -0500</pubDate>
      <description><![CDATA[Lined the buff icons up with the left edge of the bars on the player, target, party, pet and companion plates. They sat 12 pixels to the right, an inset carried over from the old interface layout.]]></description>
    </item>
    <item>
      <title>UI: Removed the colored outline that framed the target plate whenever a target was locked…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-d0868927a43d</guid>
      <pubDate>Tue, 04 Aug 2026 02:25:52 -0500</pubDate>
      <description><![CDATA[Removed the colored outline that framed the target plate whenever a target was locked. Party, pet and companion rows keep theirs, which is what marks the row you have targeted.]]></description>
    </item>
    <item>
      <title>UI: The deck edit window got the polish pass a tester asked for. Dropping several selected…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-d8e8894a639c</guid>
      <pubDate>Tue, 04 Aug 2026 02:43:43 -0500</pubDate>
      <description><![CDATA[The deck edit window got the polish pass a tester asked for. Dropping several selected glyphs onto an empty slot used to lock in one and lose the rest from the deck; all of them now land in the slot and stay listed under In This Deck.]]></description>
    </item>
    <item>
      <title>UI: The stack of glyphs above a deck slot is interactive again: drops aimed at the stack land…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-1c0b2b09cff3</guid>
      <pubDate>Tue, 04 Aug 2026 02:43:43 -0500</pubDate>
      <description><![CDATA[The stack of glyphs above a deck slot is interactive again: drops aimed at the stack land in the slot instead of doing nothing, each glyph in the stack can be dragged out or right clicked on its own, and a slot shows eight or more glyphs by squeezing the stack instead of cutting it off at three.]]></description>
    </item>
    <item>
      <title>UI: Dragging rows out of the game's list windows starts reliably now, even on a quick flick…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-7c4d5c810ef5</guid>
      <pubDate>Tue, 04 Aug 2026 02:43:44 -0500</pubDate>
      <description><![CDATA[Dragging rows out of the game's list windows starts reliably now, even on a quick flick, and selecting several rows no longer loses the selection when the list refreshes.]]></description>
    </item>
    <item>
      <title>UI: Raised the status plate bars again after an in-game look, 12 to 15 pixels, and centered…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-42b16c1af395</guid>
      <pubDate>Tue, 04 Aug 2026 03:46:52 -0500</pubDate>
      <description><![CDATA[Raised the status plate bars again after an in-game look, 12 to 15 pixels, and centered the numbers on them. They sat low, nearly touching the bars bottom edge.]]></description>
    </item>
    <item>
      <title>UI: Tucked the Options and Social window tab rows inside the window frame on the Bastion and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-5a3118065074</guid>
      <pubDate>Tue, 04 Aug 2026 04:12:41 -0500</pubDate>
      <description><![CDATA[Tucked the Options and Social window tab rows inside the window frame on the Bastion and Citadel themes. The row spanned the full window width and sat across the picture-frame border, so the end tabs looked like they hung off the dialog. Tabs also compress to fit a narrow window now instead of poking out of the frame.]]></description>
    </item>
    <item>
      <title>UI: Replaced the deck editor slot lock, a small dark square, with the gold padlock the old…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-dcda239bd8bf</guid>
      <pubDate>Tue, 04 Aug 2026 07:45:24 -0500</pubDate>
      <description><![CDATA[Replaced the deck editor slot lock, a small dark square, with the gold padlock the old interface drew: a bit larger, closed when the slot is locked, open when it is not. The grandmaster arrow on skill cards moved back to the upper right corner with its old art and dark outline, and the apprentice arrow sits upper left again, on deck cards and the hotbar alike.]]></description>
    </item>
    <item>
      <title>UI: The per-window opacity control (right-click a title bar) now thins the panels, list wells…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-b1c2cdf8f975</guid>
      <pubDate>Tue, 04 Aug 2026 10:54:30 -0500</pubDate>
      <description><![CDATA[The per-window opacity control (right-click a title bar) now thins the panels, list wells and text boxes inside the window along with its frame. Before this it moved the outer plate only, so a window set to 15% showed a nearly invisible frame with full-strength panels on top of the world. Dropdown lists and tooltips are still left alone at every setting.]]></description>
    </item>
    <item>
      <title>UI: The per-window opacity control (right-click a window title bar) now reports the opacity…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-8b89eabddb90</guid>
      <pubDate>Tue, 04 Aug 2026 11:01:35 -0500</pubDate>
      <description><![CDATA[The per-window opacity control (right-click a window title bar) now reports the opacity the window is actually drawn at. At the glassiest end of the slider it read out a lower number than the window can reach, because windows are held at a minimum visibility so one can never fade to where it is invisible but still takes clicks.]]></description>
    </item>
    <item>
      <title>UI: Fixed compass quest markers that never appeared. The compass and the world map share the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-aa84b7ddbe43</guid>
      <pubDate>Tue, 04 Aug 2026 13:37:59 -0500</pubDate>
      <description><![CDATA[Fixed compass quest markers that never appeared. The compass and the world map share the same marker code, and the map's rule that a marker needs a label had been applied to the compass too, so anything the compass wanted to point at before its name was known got dropped. The tutorial task to find Edvard the Wanderer in Battle of Solace Bridge now shows its marker from across the bridge.]]></description>
    </item>
    <item>
      <title>UI: The "Show Player Health Bar" option in Options, Interface now works on its own. It used…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-1b165ffcd7c1</guid>
      <pubDate>Tue, 04 Aug 2026 13:59:59 -0500</pubDate>
      <description><![CDATA[The "Show Player Health Bar" option in Options, Interface now works on its own. It used to follow the "Show Player Nameplate" setting, so with your own nameplate hidden the health bar never appeared, and turning it off left the focus bar behind. The two settings are now independent.]]></description>
    </item>
    <item>
      <title>UI: Moved the pet status frame clear of your own: with a title, a guild line and a full row…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-ec1f198eb5eb</guid>
      <pubDate>Tue, 04 Aug 2026 14:20:51 -0500</pubDate>
      <description><![CDATA[Moved the pet status frame clear of your own: with a title, a guild line and a full row of buff icons showing, the pet's name and health bar were drawing on top of the player's buffs. The party list moved down with it, and a pet frame you had already dragged somewhere stays where you put it.]]></description>
    </item>
    <item>
      <title>UI: Equipped items can be dragged out of the character sheet onto the backpack again. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-84746deaa70c</guid>
      <pubDate>Tue, 04 Aug 2026 14:34:03 -0500</pubDate>
      <description><![CDATA[Equipped items can be dragged out of the character sheet onto the backpack again. The drag was being rejected before it started, which left right-click and Unequip as the only way to take a piece off. The same drag was dead on the mannequin, doll cabinet, fish tank and crafting tool slots, and works on all of them now.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Air and Citadel interface themes drawing an empty button frame in place of…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-df2c4522cac3</guid>
      <pubDate>Tue, 04 Aug 2026 14:54:55 -0500</pubDate>
      <description><![CDATA[Fixed the Air and Citadel interface themes drawing an empty button frame in place of small button art. The window close, pin and help buttons, the chat header buttons, the deck reorder arrows and the lot sign gear kept their own icons again, and interact menu rows went back to plain text rows with no frame behind them.]]></description>
    </item>
    <item>
      <title>UI: Vendor listings in a zone show item tooltips on hover again, in the current zone and in…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-aabc8d12a6b0</guid>
      <pubDate>Tue, 04 Aug 2026 15:02:13 -0500</pubDate>
      <description><![CDATA[Vendor listings in a zone show item tooltips on hover again, in the current zone and in the All Zones search, where a result opens with the basic details and fills in the rest a moment later.]]></description>
    </item>
    <item>
      <title>UI: Fixed the two option boxes above the vendor listings table. All Zones and Buy Orders each…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-8a3074a15c23</guid>
      <pubDate>Tue, 04 Aug 2026 15:15:16 -0500</pubDate>
      <description><![CDATA[Fixed the two option boxes above the vendor listings table. All Zones and Buy Orders each drew their check box well to the right of its own words and close to the next option, so it was easy to tick the wrong one. Each box now sits directly in front of the words it belongs to, with a clear gap between the two options.]]></description>
    </item>
    <item>
      <title>UI: Fixed vendor listings in a zone printing colour codes inside item names. A stack of five…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-a5c3584764a8</guid>
      <pubDate>Tue, 04 Aug 2026 15:34:07 -0500</pubDate>
      <description><![CDATA[Fixed vendor listings in a zone printing colour codes inside item names. A stack of five cotton read as "Cotton &lt;color=#7F7F7F&gt;(5)&lt;/color&gt;"; the rows now show the plain name with the count and the "(Dyed)" and "(Empty)" tags coloured as intended.]]></description>
    </item>
    <item>
      <title>UI: Added an Interface option, Close Loot Window When Emptied, that makes Take All close a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-23d00418a6ed</guid>
      <pubDate>Tue, 04 Aug 2026 15:59:23 -0500</pubDate>
      <description><![CDATA[Added an Interface option, Close Loot Window When Emptied, that makes Take All close a loot window once nothing is left in it. It is off by default, it leaves the window open when some of the loot would not fit, and it never touches your own backpack, your bags or lot storage.]]></description>
    </item>
    <item>
      <title>UI: Pointing at a harvest node from out of reach now shows the same "too far to use" cursor…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-7cefc21c6aac</guid>
      <pubDate>Tue, 04 Aug 2026 16:27:25 -0500</pubDate>
      <description><![CDATA[Pointing at a harvest node from out of reach now shows the same "too far to use" cursor as any other object. It used to show the plain arrow, so a cotton bush, ore vein or tree looked like bare ground from a few steps back even though its name still appeared under the pointer. The tool picture still means you are close enough to harvest.]]></description>
    </item>
    <item>
      <title>UI: On the login screen, Enter now logs you in without clicking into a box first. The form…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-d10a22c30855</guid>
      <pubDate>Tue, 04 Aug 2026 16:52:27 -0500</pubDate>
      <description><![CDATA[On the login screen, Enter now logs you in without clicking into a box first. The form only listened for the key while the caret sat in the user name or password box, so pressing Enter after the screen came up, or after clicking elsewhere on the form, did nothing. A Cancel button reached with the Tab key still answers Enter itself.]]></description>
    </item>
    <item>
      <title>UI: Fixed the UI Scale slider in Options &gt; Themes keeping the value a drag was abandoned on…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-8a838e70615d</guid>
      <pubDate>Tue, 04 Aug 2026 17:04:58 -0500</pubDate>
      <description><![CDATA[Fixed the UI Scale slider in Options > Themes keeping the value a drag was abandoned on. Closing the window while still holding the handle left the slider and its percentage sitting on that number even though the interface size had correctly not changed; both now return to the scale actually in force.]]></description>
    </item>
    <item>
      <title>UI: Fixed the crafting station losing its item list after a long run of queued crafts. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-b181e0b5e831</guid>
      <pubDate>Tue, 04 Aug 2026 17:22:52 -0500</pubDate>
      <description><![CDATA[Fixed the crafting station losing its item list after a long run of queued crafts. The queue list now stops at three visible lines and scrolls for the rest, and the Crafting Inventory pane keeps a minimum height so it stays on screen.]]></description>
    </item>
    <item>
      <title>UI: The recipe book's Favorites chapter now opens directly onto your starred recipes instead…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-d04ac9c31f4a</guid>
      <pubDate>Tue, 04 Aug 2026 17:30:46 -0500</pubDate>
      <description><![CDATA[The recipe book's Favorites chapter now opens directly onto your starred recipes instead of a page of text you had to click past. Favorites also stays listed in the table of contents when you have nothing starred, and that page now says so.]]></description>
    </item>
    <item>
      <title>UI: Applying a saved decoration layout no longer stalls: a change that goes quiet for a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-3c73e28d0020</guid>
      <pubDate>Tue, 04 Aug 2026 17:43:37 -0500</pubDate>
      <description><![CDATA[Applying a saved decoration layout no longer stalls: a change that goes quiet for a minute is counted as skipped and the apply moves on, a change that fails is reported instead of ending the run, and Cancel now stops the apply straight away and keeps everything that already landed.]]></description>
    </item>
    <item>
      <title>Performance: The faster loading is confirmed on the test shard rather than just in the editor. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9c23d9d599c1</guid>
      <pubDate>Tue, 04 Aug 2026 02:30:54 -0500</pubDate>
      <description><![CDATA[The faster loading is confirmed on the test shard rather than just in the editor. The fixed pause at the start of a load measured 0.42 seconds against 0.80 before, and the wait at the end of a load dropped from 2.4 seconds to 0.6 at the median. Both match what the change was expected to do. The sample is still small, so the figures will firm up over the next day.]]></description>
    </item>
    <item>
      <title>Tooling: The new load timings were arriving as text rather than numbers, which would have left…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-74100ec3d015</guid>
      <pubDate>Tue, 04 Aug 2026 02:30:54 -0500</pubDate>
      <description><![CDATA[The new load timings were arriving as text rather than numbers, which would have left them unchartable and the averages silently broken. Caught it on the first record from the new build, so exactly one was affected rather than a day of them.]]></description>
    </item>
    <item>
      <title>Community: Filed four items from the forum into the tracker: a multi-destination POT teleporter…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-b2e50a91176a</guid>
      <pubDate>Tue, 04 Aug 2026 03:21:48 -0500</pubDate>
      <description><![CDATA[Filed four items from the forum into the tracker: a multi-destination POT teleporter idea, distinct buff icons, an optional double-press-to-cast targeting option for placeable skills, and a bug report about time-machine devices in a Player Owned Town over-triggering the comet meteor shower.]]></description>
    </item>
    <item>
      <title>Community: Took a complete local backup of the community wiki at sotawiki.net after its hosting…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-541e678bdedd</guid>
      <pubDate>Tue, 04 Aug 2026 07:38:57 -0500</pubDate>
      <description><![CDATA[Took a complete local backup of the community wiki at sotawiki.net after its hosting turned unreliable this week. The archive holds all 38,417 pages across every namespace, the 12,700 uploaded images at full resolution, and a browsable copy that opens with no network connection, alongside a dump that could restore the whole wiki into a fresh install. Every page and every image was checked against the wiki&rsquo;s own checksums. This is a backup and nothing more &mdash; the content belongs to the players who wrote it, and we are not republishing it.]]></description>
    </item>
    <item>
      <title>Community: Put a second copy of the wiki archive on separate hardware, and checked all 38,417 pages…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-e17fc06c1f0e</guid>
      <pubDate>Tue, 04 Aug 2026 08:24:57 -0500</pubDate>
      <description><![CDATA[Put a second copy of the wiki archive on separate hardware, and checked all 38,417 pages and 12,700 images against the wiki&rsquo;s own checksums again once they landed there. One copy on one drive is not a backup.]]></description>
    </item>
    <item>
      <title>Client: Starting the game with no scene name set, which is what an unsaved or scratch scene gives…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-85a552f399ce</guid>
      <pubDate>Tue, 04 Aug 2026 03:47:26 -0500</pubDate>
      <description><![CDATA[Starting the game with no scene name set, which is what an unsaved or scratch scene gives you, threw during startup instead of reporting the problem. That startup path caches its failure for the rest of the session, so every later call into it threw again, once per frame per caller. One editor session recorded 699,708 of those and left a 4.1 GB log file. Startup now falls back to an empty scene id and reports the missing name once.]]></description>
    </item>
    <item>
      <title>Client: The offline character load ran its completion callback inside its own error handler, so…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-93362faa6fd2</guid>
      <pubDate>Tue, 04 Aug 2026 03:47:26 -0500</pubDate>
      <description><![CDATA[The offline character load ran its completion callback inside its own error handler, so an exception raised by that callback was caught by the same handler and the callback ran a second time reporting no character found. It now picks a result first and calls back exactly once.]]></description>
    </item>
    <item>
      <title>Client: Health, Focus, Gold and Weight on the character sheet now explain themselves on hover…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-e40dbd6c3a2f</guid>
      <pubDate>Tue, 04 Aug 2026 09:02:00 -0500</pubDate>
      <description><![CDATA[Health, Focus, Gold and Weight on the character sheet now explain themselves on hover. They were the only rows on the Character tab with no tooltip at all, while Str, Dex, Int, Resist and Avoid all had one. Health, focus and weight each list where the number came from: the base value, what Strength or Intelligence adds and at what rate, the Adventurer Level multiplier, and a line for anything else moving the total. In a scene that caps your level, the tooltip names the cap and your real level, which is the only account a player gets of their maximums dropping when they zone in.]]></description>
    </item>
    <item>
      <title>Client: The max health, max focus and carry capacity formulas now hand back their own terms, and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-c0186c2f1294</guid>
      <pubDate>Tue, 04 Aug 2026 09:02:09 -0500</pubDate>
      <description><![CDATA[The max health, max focus and carry capacity formulas now hand back their own terms, and the game and the tooltip read the same result from one implementation. A tooltip carrying its own copy of the constants is what put a weapon damage range twice as wide as the game rolled in front of players for several releases. Twelve tests pin the explanation and the formula together, and pin that the printed terms add back up to the total.]]></description>
    </item>
    <item>
      <title>Client: One point of interest changing used to refresh every marker on the map, which was fine…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-2596125a7356</guid>
      <pubDate>Tue, 04 Aug 2026 10:25:03 -0500</pubDate>
      <description><![CDATA[One point of interest changing used to refresh every marker on the map, which was fine for a scene with a dozen and expensive for a town with hundreds of lots. Each marker now refreshes only itself, and lot names are cached instead of being rebuilt every time.]]></description>
    </item>
    <item>
      <title>Client: Fixed a meteor storm in towns that hold more than one time or weather device. A device…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-6400eb12619e</guid>
      <pubDate>Tue, 04 Aug 2026 11:19:33 -0500</pubDate>
      <description><![CDATA[Fixed a meteor storm in towns that hold more than one time or weather device. A device that forces the time of day could leave the sky clock flipping between two hours, and the meteor timer read that as a fresh moment on every frame, so streaks crossed the sky several times a second. The timer now holds a real gap between meteors whatever the clock does. Covered by five new editor tests.]]></description>
    </item>
    <item>
      <title>Client: Cat mounts (lion, black panther, jaguar, snow leopard) rode in silence because their…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-f8071b0904da</guid>
      <pubDate>Tue, 04 Aug 2026 11:56:21 -0500</pubDate>
      <description><![CDATA[Cat mounts (lion, black panther, jaguar, snow leopard) rode in silence because their mounted animations carried no footstep events. Added the missing steps so they now sound at walk, jog and run speed, and change with the ground surface like every other mount.]]></description>
    </item>
    <item>
      <title>Client: Fixed a saved decoration layout going missing after it was put in a container. A layout…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-67c96ff570b2</guid>
      <pubDate>Tue, 04 Aug 2026 12:24:12 -0500</pubDate>
      <description><![CDATA[Fixed a saved decoration layout going missing after it was put in a container. A layout recorded from a very heavily decorated lot was written but never came back down to the client, so it was in the container and in no list the player could see. Recording now refuses up front when a lot holds more decorations than one layout document can carry, and layouts already saved that way show up in their container again, with their title and decoration count.]]></description>
    </item>
    <item>
      <title>Client: Fixed the Dash skill playing its cast sound twice at once, which made it about twice as…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-c69f667772ce</guid>
      <pubDate>Tue, 04 Aug 2026 15:27:08 -0500</pubDate>
      <description><![CDATA[Fixed the Dash skill playing its cast sound twice at once, which made it about twice as loud as every other skill. It now plays once, at the same level as other casts.]]></description>
    </item>
    <item>
      <title>Client: Fixed harvesting with a worn tool: pointing at an ore vein, tree, cotton bush or garlic…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-11d7b153e72f</guid>
      <pubDate>Tue, 04 Aug 2026 15:52:20 -0500</pubDate>
      <description><![CDATA[Fixed harvesting with a worn tool: pointing at an ore vein, tree, cotton bush or garlic plant from a distance no longer left the pointer stuck and the node unclickable once your pickaxe, sickle or harvest axe dropped below full condition. Skinning with a worn skinning knife was affected the same way.]]></description>
    </item>
    <item>
      <title>Client: NPC voice-over no longer speaks a different word than the line on screen. Spoken lines…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-22b75821d6cd</guid>
      <pubDate>Tue, 04 Aug 2026 16:38:16 -0500</pubDate>
      <description><![CDATA[NPC voice-over no longer speaks a different word than the line on screen. Spoken lines are recorded ahead of time and cannot say a player name, so a greeting written as "Well met, &lt;name&gt;." was read aloud as "Well met, outlander". Lines that show your character name are now left unspoken; the far more common lines that address you by the NPC's general term still play.]]></description>
    </item>
    <item>
      <title>Client: Steepened the distance fade on NPC voices. A voice now drops off clearly as you walk away…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-edb35e47bce3</guid>
      <pubDate>Tue, 04 Aug 2026 16:38:22 -0500</pubDate>
      <description><![CDATA[Steepened the distance fade on NPC voices. A voice now drops off clearly as you walk away instead of holding near full volume most of the way out, and still goes silent at the same range.]]></description>
    </item>
    <item>
      <title>Rendering: Fixed an editor-side shader error on the world-space nameplate material. The shader was…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-4f83600f900d</guid>
      <pubDate>Tue, 04 Aug 2026 07:19:04 -0500</pubDate>
      <description><![CDATA[Fixed an editor-side shader error on the world-space nameplate material. The shader was copied from the stock TextMesh Pro distance field shader and kept include paths that only resolve for shaders stored alongside TextMesh Pro's own files, so it failed to compile whenever the editor imported it. Player builds were unaffected.]]></description>
    </item>
    <item>
      <title>Interface: A tester asked whether the three window opacity sliders work independently of each other…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-2139a5e23392</guid>
      <pubDate>Tue, 04 Aug 2026 09:35:39 -0500</pubDate>
      <description><![CDATA[A tester asked whether the three window opacity sliders work independently of each other. They do not. The theme's own solidity, the Window Opacity slider in Options and the per window slider on a title bar all multiply together, so a window set to 100 percent could still look glassy because the Options slider sat at 60. All three controls were also called Opacity, and the per window popup used the same title text as the Options row. The Theme Editor's is now <b>Surface Opacity</b>, the popup is <b>This Window Only</b> and reports what the window actually ends up at, and the tip under the Options slider says the two multiply.]]></description>
    </item>
    <item>
      <title>Interface: The per window opacity slider stopped at 100 percent while the global one reached 120, so…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-a7d91f384023</guid>
      <pubDate>Tue, 04 Aug 2026 09:35:48 -0500</pubDate>
      <description><![CDATA[The per window opacity slider stopped at 100 percent while the global one reached 120, so a single window could only be made more see-through than the rest and never more solid. It now matches at 120. At the other end the two sliders combined could drive a window to 1.5 percent solidity on the Air theme, invisible but still catching clicks with no title bar left to right-click, so the composed value now floors at 5 percent. The popup also previewed by writing to disk on every frame of a drag, and now commits when you let go.]]></description>
    </item>
    <item>
      <title>Interface: Found the cause of the Theme Editor throwing settings back to an earlier state whenever…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-ce08c0c5c1b4</guid>
      <pubDate>Tue, 04 Aug 2026 09:35:57 -0500</pubDate>
      <description><![CDATA[Found the cause of the Theme Editor throwing settings back to an earlier state whenever you clicked anything. The colour boxes on the Simple tab saved their contents on every loss of keyboard focus rather than only on Enter, and edits made on the Advanced tab never refreshed those boxes. So one click after an Advanced edit wrote the stale colour back over the new one. Boxes now save only when they have been typed into, and every Advanced edit and tab switch refreshes the Simple side.]]></description>
    </item>
    <item>
      <title>Interface: The attenuated experience icon and its tooltip are gone from the Skills window along with…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-3c55869d43f2</guid>
      <pubDate>Tue, 04 Aug 2026 10:00:26 -0500</pubDate>
      <description><![CDATA[The attenuated experience icon and its tooltip are gone from the Skills window along with the system behind them.]]></description>
    </item>
    <item>
      <title>Interface: Two faults could leave the whole interface dead for the rest of a session while the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9c2c981a69d8</guid>
      <pubDate>Tue, 04 Aug 2026 10:22:40 -0500</pubDate>
      <description><![CDATA[Two faults could leave the whole interface dead for the rest of a session while the world, the camera and the keyboard kept working. Chat would not take focus so you could not type, and nothing would drag out of inventory, containers or the deck lists. The only way out was to restart the client.]]></description>
    </item>
    <item>
      <title>Interface: The first was dragging an item or a glyph out of one of the rebuilt list windows. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-4f8c0f149768</guid>
      <pubDate>Tue, 04 Aug 2026 10:22:41 -0500</pubDate>
      <description><![CDATA[The first was dragging an item or a glyph out of one of the rebuilt list windows. The drag-start code still wrote to a piece of per-event state that only exists when the click comes through the old UI layer, so a drag that started in a rebuilt window threw every time and took the whole window layer down with it. Eight of these turned up across six player sessions and four builds in a 36 hour window of logs.]]></description>
    </item>
    <item>
      <title>Interface: The second was dropping an item back onto the row it came from. Picking an item up takes…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9ed0602d5b5a</guid>
      <pubDate>Tue, 04 Aug 2026 10:22:42 -0500</pubDate>
      <description><![CDATA[The second was dropping an item back onto the row it came from. Picking an item up takes it out of the container, so that row is already out of date, and dropping there raised an error that ended the drag system for the rest of the session. Both cases now put the item back where it was.]]></description>
    </item>
    <item>
      <title>Interface: Hardened five more places where a single error could switch the interface off and leave…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-3d3da3915ade</guid>
      <pubDate>Tue, 04 Aug 2026 10:22:43 -0500</pubDate>
      <description><![CDATA[Hardened five more places where a single error could switch the interface off and leave it off: the old UI layer's recursion guard, the stuck-cursor recovery, the modal input gate, the shared event system check, and the cooperative task loop. Any one of them could turn a one-off error into a session-long lockup.]]></description>
    </item>
    <item>
      <title>Interface: Added a UI input watchdog. It samples the state that decides whether the interface can…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-7059600fd93d</guid>
      <pubDate>Tue, 04 Aug 2026 10:22:44 -0500</pubDate>
      <description><![CDATA[Added a UI input watchdog. It samples the state that decides whether the interface can receive input at all, twice a second, and when it finds input switched off with nothing holding it that way it switches it back on and writes one line to the logs. Reticle mode, a held right mouse button, an open dialog and HUD-less mode all switch input off on purpose, so each one has a test proving the watchdog leaves it alone. 33 tests in all.]]></description>
    </item>
    <item>
      <title>Balance: Removed experience attenuation. Characters above adventurer level 110 used to have their…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-17688cdd6ab0</guid>
      <pubDate>Tue, 04 Aug 2026 10:00:19 -0500</pubDate>
      <description><![CDATA[Removed experience attenuation. Characters above adventurer level 110 used to have their combat experience shrink once they had earned 15 million in the past hour, and a kill paid nothing at all past 30 million. Every kill now pays its full amount no matter how long the session runs.]]></description>
    </item>
    <item>
      <title>Taming: Tamed pets stopped leash-looping. The Pet Range tether changed the distance that starts a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-6d827e6875a3</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:14 -0500</pubDate>
      <description><![CDATA[Tamed pets stopped leash-looping. The Pet Range tether changed the distance that <em>starts</em> a leash without changing the one that ends it, so a pet set and cleared its leash on alternating ticks forever, dumping whatever it was fighting onto its handler two or three times a second. The two distances are now derived from one number and the release always lands inside the tether, pinned by test across the whole skill curve and all three follow bands.]]></description>
    </item>
    <item>
      <title>Taming: Pet Taunting Training pulls creatures onto the pet. There was a hook for the buff ending…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-abc463e60f44</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:29 -0500</pubDate>
      <description><![CDATA[Pet Taunting Training pulls creatures onto the pet. There was a hook for the buff ending and none for it starting, so nothing ever pointed a creature at the pet, and a buff that scales future threat cannot out-earn a target that has been collecting attention for the last thirty seconds. Casting it now matches the handler threat the pet has to beat and commits the switch on the same tick.]]></description>
    </item>
    <item>
      <title>Taming: Two more reasons the taunt read as doing nothing. The buff raised a value that nine of…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-e5c41304e930</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:30 -0500</pubDate>
      <description><![CDATA[Two more reasons the taunt read as doing nothing. The buff raised a value that nine of the ten pet basic attacks did not read, so it multiplied nothing for a bear, wolf or boar simply swinging at something. And the distance falloff on pet threat hit its floor at exactly the range a pet fights from, cutting every pet in every ordinary fight to a tenth of its threat.]]></description>
    </item>
    <item>
      <title>Taming: Pet tether numbers loosened on top of the fix: 5m untrained, 8m at Pet Range 80, 12m at…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9de7fcc21a72</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:30 -0500</pubDate>
      <description><![CDATA[Pet tether numbers loosened on top of the fix: 5m untrained, 8m at Pet Range 80, 12m at 150, up from 2m, 5m and 10m. Two meters put the pet inside its handler. Pet Range also moved up a tier, from behind Combat Training to a sibling of the other pet trainings under Summon Tamed Creature. Price unchanged.]]></description>
    </item>
    <item>
      <title>Subterfuge: The smoke bomb hides you now. Obfuscate raised your stealth level, which stopped others…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-51ad04e2451a</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:46 -0500</pubDate>
      <description><![CDATA[The smoke bomb hides you now. Obfuscate raised your stealth level, which stopped others selecting you and shrank how far creatures could notice you, but the fade and the per-observer visibility check both hung off the real stealth effect, so your character stood there in plain view. It cannot be a real stealth effect either: that path refuses to apply while somebody has you targeted, which is the only time you would throw a smoke bomb.]]></description>
    </item>
    <item>
      <title>Subterfuge: Split the stealth effect in two. The concealment half (the dissolve, the fade, the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-87a7dcabca75</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:46 -0500</pubDate>
      <description><![CDATA[Split the stealth effect in two. The concealment half (the dissolve, the fade, the per-observer visibility channel) moved to a shared base, and stealth kept what it always was, the list of things that break it. Camouflage is the same concealment with none of them, so the smoke lands while you are targeted and being hit, and only its own timer ends it.]]></description>
    </item>
    <item>
      <title>Subterfuge: Bleeds no longer strip the stealth you take inside your own smoke. While the smoke holds…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-45177e601c4f</guid>
      <pubDate>Tue, 04 Aug 2026 10:21:47 -0500</pubDate>
      <description><![CDATA[Bleeds no longer strip the stealth you take inside your own smoke. While the smoke holds, a poison or bleed tick and a fresh target acquisition both stop breaking stealth, so you get a window to clear the damage and reposition. Narrow on purpose: a direct hit still gives you away, and a bleed still breaks a stealth taken anywhere else. The window runs 2 seconds untrained, 3.5 at Subterfuge Specialization 80 and 5.75 at 200.]]></description>
    </item>
    <item>
      <title>Housing: The map you open with M now shows every housing lot in the town you are standing in…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-f513890d5e21</guid>
      <pubDate>Tue, 04 Aug 2026 10:24:44 -0500</pubDate>
      <description><![CDATA[The map you open with M now shows every housing lot in the town you are standing in. Green means nobody owns it and you could claim it, amber means it is empty but locked to you, grey means someone else owns it, and a lot you own stays the blue it always was.]]></description>
    </item>
    <item>
      <title>Housing: Lot markers are sized by tier, so a City lot draws larger than a Row lot and you can pick…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-96ffebc2ccf0</guid>
      <pubDate>Tue, 04 Aug 2026 10:24:52 -0500</pubDate>
      <description><![CDATA[Lot markers are sized by tier, so a City lot draws larger than a Row lot and you can pick the size you want out of a crowded street. Hovering one names the tier and either its availability or its owner.]]></description>
    </item>
    <item>
      <title>Housing: The map's "..." menu switches lot markers between all lots, only the ones available to…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-e590b6525f30</guid>
      <pubDate>Tue, 04 Aug 2026 10:24:53 -0500</pubDate>
      <description><![CDATA[The map's "..." menu switches lot markers between all lots, only the ones available to you, and off. A lot you own and a lot you have set as a compass destination stay on the map in every setting.]]></description>
    </item>
    <item>
      <title>Housing: Player owned towns took the most work here, because a lot in one is a decoration the town…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-b07edab6f620</guid>
      <pubDate>Tue, 04 Aug 2026 10:25:03 -0500</pubDate>
      <description><![CDATA[Player owned towns took the most work here, because a lot in one is a decoration the town owner places at runtime. Markers now appear and disappear as the owner adds and removes lots, without you reloading the area, and a lot on the far side of a town reads its real owner instead of showing as available while its data is still arriving.]]></description>
    </item>
    <item>
      <title>Housing: The map's housing lot markers changed from tier-sized house icons to the lot's actual…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-92eec25b60dc</guid>
      <pubDate>Tue, 04 Aug 2026 15:46:56 -0500</pubDate>
      <description><![CDATA[The map's housing lot markers changed from tier-sized house icons to the lot's actual boundary: a rectangle at the lot's real size and rotation, drawn with the same green overlay a town owner sees when placing a lot, tinted by the same claim-state colours. The overlay's arrows sit on the lot's front edge, so the map also shows which way each lot faces.]]></description>
    </item>
    <item>
      <title>Housing: A Row lot now reads as a narrow strip and a Castle as a large field, in true proportion…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-c1533c3f4b5e</guid>
      <pubDate>Tue, 04 Aug 2026 15:46:56 -0500</pubDate>
      <description><![CDATA[A Row lot now reads as a narrow strip and a Castle as a large field, in true proportion, and the rectangles rotate with angled lots and scale with map zoom. Tooltips answer anywhere inside a lot's rectangle, and the lot filter menu carries over unchanged.]]></description>
    </item>
    <item>
      <title>Tools: Added an unattended pass over the open bug queue. It takes the newest report, works out a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-e1e24dd4b6bb</guid>
      <pubDate>Tue, 04 Aug 2026 10:28:01 -0500</pubDate>
      <description><![CDATA[Added an unattended pass over the open bug queue. It takes the newest report, works out a fix, tests it, commits it, files a testing task and closes the report, then moves to the next one and keeps going until the queue is empty.]]></description>
    </item>
    <item>
      <title>Tools: Fixed a fault in the unattended bug-queue runner that made it quit on the first bug it…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-3730b75607c7</guid>
      <pubDate>Tue, 04 Aug 2026 10:38:30 -0500</pubDate>
      <description><![CDATA[Fixed a fault in the unattended bug-queue runner that made it quit on the first bug it picked up: the claim step reported success but the runner read a leftover status value and treated it as a failure. It now reports its result explicitly, and the runner starts a fresh read each time.]]></description>
    </item>
    <item>
      <title>Tools: The unattended bug runner allows one instance at a time, and it judged that by how…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-c3ab0b3300a7</guid>
      <pubDate>Tue, 04 Aug 2026 11:02:46 -0500</pubDate>
      <description><![CDATA[The unattended bug runner allows one instance at a time, and it judged that by how recently the lock file had been touched. A run that was killed rather than stopped cleanly left its lock behind, so the next start refused for two hours over a process that had already exited. It now asks whether the recorded process is actually alive, and reports a stale lock as stale.]]></description>
    </item>
    <item>
      <title>Tools: Fixed the in-game Oracle answering "the knowledge base doesn't contain that" to every…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-e675e8a5e32e</guid>
      <pubDate>Tue, 04 Aug 2026 16:09:23 -0500</pubDate>
      <description><![CDATA[Fixed the in-game Oracle answering "the knowledge base doesn't contain that" to every question. When its reference library failed to load, the Oracle could not tell that apart from a genuine gap in the docs, so it denied every question with no sign anything was wrong. It now says its library is temporarily unreachable and offers to take a report instead, the service health check reports whether the library can actually answer, and an update that leaves it unable to answer is refused.]]></description>
    </item>
    <item>
      <title>Content: Town criers were greeting players with the wrong place name. The greeting is baked ahead…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9ae8205ddcf9</guid>
      <pubDate>Tue, 04 Aug 2026 10:58:12 -0500</pubDate>
      <description><![CDATA[Town criers were greeting players with the wrong place name. The greeting is baked ahead of time, and it was keyed to the folder a conversation lives in rather than the town the crier actually stands in, so the generic crier used by around 426 player towns had one greeting that fit none of them and played silent. The zone now comes from where the crier is placed, and a line that names the town is baked once per town.]]></description>
    </item>
    <item>
      <title>Content: When a town crier or guard lists the free lots in an area, that sentence is composed at…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-bf3a3610c1a4</guid>
      <pubDate>Tue, 04 Aug 2026 10:58:13 -0500</pubDate>
      <description><![CDATA[When a town crier or guard lists the free lots in an area, that sentence is composed at runtime, which meant it could never match a pre-recorded line. It now sits on its own segment so the text around it keeps its audio and the sentence can carry its own. No audio has been generated yet.]]></description>
    </item>
    <item>
      <title>Content: Rewrote the New Player Handbook's help chapter. It pointed at a help site that no longer…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-97b2695ee039</guid>
      <pubDate>Tue, 04 Aug 2026 14:41:34 -0500</pubDate>
      <description><![CDATA[Rewrote the New Player Handbook's help chapter. It pointed at a help site that no longer exists and treated a player-run wiki page as the place to go for new player help, so a player who arrived while that site was down read a blank page. The chapter now sends players to in-game chat and the official Discord first, and says plainly that the community wiki is run by players and is sometimes unavailable.]]></description>
    </item>
    <item>
      <title>Combat: Fixed a dead safety check in the skill experience spend math: the overflow guard around…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-656ab5243fd5</guid>
      <pubDate>Tue, 04 Aug 2026 11:29:13 -0500</pubDate>
      <description><![CDATA[Fixed a dead safety check in the skill experience spend math: the overflow guard around the experience multiply could never actually run, so a runaway value would have wrapped around instead of being capped. The multiply now trips the guard, and new tests cover both the extreme case and an ordinary skill.]]></description>
    </item>
    <item>
      <title>Combat: Fixed 64-bit math in the retired skill decay path, where a pooled experience balance…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-d3f1d267b710</guid>
      <pubDate>Tue, 04 Aug 2026 12:01:32 -0500</pubDate>
      <description><![CDATA[Fixed 64-bit math in the retired skill decay path, where a pooled experience balance above roughly 2.1 billion could wrap and take far more skill experience than the pool was meant to cover. Decay is still switched off, so nothing changes in game today; added tests so the arithmetic holds if decay ever comes back.]]></description>
    </item>
    <item>
      <title>Combat: A Chaotic Clone now puts its weapon away and takes it back out whenever the player who…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-3b01dab5d236</guid>
      <pubDate>Tue, 04 Aug 2026 12:56:44 -0500</pubDate>
      <description><![CDATA[A Chaotic Clone now puts its weapon away and takes it back out whenever the player who cast it does, and a stowed weapon is no longer drawn on the clone. The state is worked out on every player's screen instead of only the caster's, so an onlooker sees the clone match the caster's stance and weapon. The clone still changes over without playing the draw or put-away motion; that half needs an animation change.]]></description>
    </item>
    <item>
      <title>Guilds: Published a guilds and guild wars improvement plan: twenty-five proposals, from surfacing…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-51062d268d4e</guid>
      <pubDate>Tue, 04 Aug 2026 13:08:06 -0500</pubDate>
      <description><![CDATA[Published a guilds and guild wars improvement plan: twenty-five proposals, from surfacing what the servers already know (join dates, an activity log you can read in game, scheduled war starts) to a guild vault with per-rank withdrawal caps, a guild finder with applications, alliances, negotiated war terms with counter-offers, war PvP scoped to your actual enemy instead of the whole world, persistent war history with craftable victory plaques, mercenary enlistment, guild PvE hunts, a quarterly ladder, and a bridge to each guild's own page on the web. The illustrated version is public at <a href="https://catnipgames.net/blog/proposals/guilds/">catnipgames.net/blog/proposals/guilds/</a> with a comment thread and vote arrows on every proposal.]]></description>
    </item>
    <item>
      <title>Images: The three composed surfaces from the guilds proposal, as mockups: the Guild Ledger, the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-c7efbf4ebf86</guid>
      <pubDate>Tue, 04 Aug 2026 13:08:16 -0500</pubDate>
      <description><![CDATA[The three composed surfaces from the guilds proposal, as mockups: the Guild Ledger, the War Council, and a guild's page on the web: <span class="gallery"><img src="https://catnipgames.net/blog/images/proposal-guilds-ledger-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-guilds-ledger-mockup.png" data-cap="The proposed Guild Ledger: identity header, six tabs, a roster with join dates, last online, and officer notes" alt="Guild Ledger mockup"><img src="https://catnipgames.net/blog/images/proposal-guilds-war-council-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-guilds-war-council-mockup.png" data-cap="The proposed War Council: wars with terms, counter-offers, a per-member scoreboard, and a persistent honor roll" alt="War Council mockup"><img src="https://catnipgames.net/blog/images/proposal-guilds-webpage-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-guilds-webpage-mockup.png" data-cap="Each guild's page on the web: crest, listing, war history, and calendar, delivered by the planned web companion" alt="Guild web page mockup"></span>]]></description>
    </item>
    <item>
      <title>Images: Two composed surfaces from the towns proposal, as mockups: the Town Console and the Town…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-ffa344e9f268</guid>
      <pubDate>Tue, 04 Aug 2026 14:17:50 -0500</pubDate>
      <description><![CDATA[Two composed surfaces from the towns proposal, as mockups: the Town Console and the Town Directory: <span class="gallery"><img src="https://catnipgames.net/blog/images/proposal-towns-console-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-towns-console-mockup.png" data-cap="The proposed Town Console: one window for lots, citizens, message, spawn and projects, with lot space and claim policy in view" alt="Town Console mockup"><img src="https://catnipgames.net/blog/images/proposal-towns-directory-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-towns-directory-mockup.png" data-cap="The proposed Town Directory: every town browsable with activity, open lots and an identity tag, sorted by who is actually home" alt="Town Directory mockup"></span>]]></description>
    </item>
    <item>
      <title>Images: Two composed surfaces from the player dungeons proposal, as mockups: the upgraded Dungeon…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-5038f5460186</guid>
      <pubDate>Tue, 04 Aug 2026 15:47:23 -0500</pubDate>
      <description><![CDATA[Two composed surfaces from the player dungeons proposal, as mockups: the upgraded Dungeon Entrance window with its plaque and owner ledger, and the Delve Board directory: <span class="gallery"><img src="https://catnipgames.net/blog/images/proposal-dungeons-composed-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-dungeons-composed-mockup.png" data-cap="The upgraded Dungeon Entrance window: plaque header with first clear and record times, the bounty line, and the owner ledger tab."><img src="https://catnipgames.net/blog/images/proposal-dungeons-delveboard-mockup.png" data-full="https://catnipgames.net/blog/images/proposal-dungeons-delveboard-mockup.png" data-cap="The Delve Board: an in-game directory of published player dungeons with tags, danger grades and a compass hand-off."></span>]]></description>
    </item>
    <item>
      <title>Developer Portal: Added a Resource Atlas card to the developer portal landing page, so the public per-zone…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-fd2f81f0fca6</guid>
      <pubDate>Tue, 04 Aug 2026 13:33:53 -0500</pubDate>
      <description><![CDATA[Added a <strong>Resource Atlas</strong> card to the developer portal landing page, so the public per-zone resource map is reachable from the portal instead of only by typing the URL.]]></description>
    </item>
    <item>
      <title>Deck Building: Dragging several glyphs at once into a deck slot now puts all of them in the slot and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-df4c8973a194</guid>
      <pubDate>Tue, 04 Aug 2026 13:40:00 -0500</pubDate>
      <description><![CDATA[Dragging several glyphs at once into a deck slot now puts all of them in the slot and leaves it unlocked. Only the first glyph of a selection was landing, and the slot locked itself around that one glyph.]]></description>
    </item>
    <item>
      <title>Deck Building: A multiple selection dragged from the Glyphs list into In This Deck now adds every glyph…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-687ad8433bf4</guid>
      <pubDate>Tue, 04 Aug 2026 13:40:08 -0500</pubDate>
      <description><![CDATA[A multiple selection dragged from the Glyphs list into In This Deck now adds every glyph in it rather than one at a time. Dropping a multiple selection on a locked slot does nothing now; before it swapped the locked glyph out and the displaced one was lost.]]></description>
    </item>
    <item>
      <title>Deck Building: The deck slot padlock moved back under the slot at the size the live game draws it, 12…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-22ee7bf24ec2</guid>
      <pubDate>Tue, 04 Aug 2026 13:40:08 -0500</pubDate>
      <description><![CDATA[The deck slot padlock moved back under the slot at the size the live game draws it, 12 pixels instead of 18, off the card art it had been sitting on since the window was ported.]]></description>
    </item>
    <item>
      <title>Deck Building: Slots holding two or more glyphs now carry a small arrow button that opens a list of…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-6cf1c726155b</guid>
      <pubDate>Tue, 04 Aug 2026 13:40:17 -0500</pubDate>
      <description><![CDATA[Slots holding two or more glyphs now carry a small arrow button that opens a list of every glyph in the slot, with name and school, each row hoverable, right-clickable and draggable. In a 13-glyph stack the last glyph showed about 0.7 pixels of itself, and the 16th shrank to nothing at all; the stack also stops shrinking its tail away now.]]></description>
    </item>
    <item>
      <title>Website: Added a Resources link to the work log header, on the current week and every archived…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9b709bb34ef3</guid>
      <pubDate>Tue, 04 Aug 2026 13:46:09 -0500</pubDate>
      <description><![CDATA[Added a <strong>Resources</strong> link to the work log header, on the current week and every archived week page, pointing at the public per-zone resource map at /resources/.]]></description>
    </item>
    <item>
      <title>Tester Tools: The tester panel's Set ALL Skills button is now Buff ALL Skills : a level field and an…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-bb9d64b82b63</guid>
      <pubDate>Tue, 04 Aug 2026 14:03:25 -0500</pubDate>
      <description><![CDATA[The tester panel's <b>Set ALL Skills</b> button is now <b>Buff ALL Skills</b>: a level field and an hours field (4 by default), and for that long every skill reads as the level you typed. It lapses on its own and your real character sheet is exactly where it was, so a tester can jump into high-level content and then go back to testing progression on the same character.]]></description>
    </item>
    <item>
      <title>Tester Tools: The old button spent the experience pool, so a fresh tester character had to grant…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-727a23e8db72</guid>
      <pubDate>Tue, 04 Aug 2026 14:03:34 -0500</pubDate>
      <description><![CDATA[The old button spent the experience pool, so a fresh tester character had to grant experience first and skills still stopped short of the level they asked for. The buff has neither limit: it works on a brand new character, always reaches the level typed, and costs nothing. The single-skill Set Skill is unchanged for anyone who wants a permanent change.]]></description>
    </item>
    <item>
      <title>Tester Tools: The buff survives changing scenes and logging out, and it never writes to the character…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-9f8db7b63cad</guid>
      <pubDate>Tue, 04 Aug 2026 14:03:41 -0500</pubDate>
      <description><![CDATA[The buff survives changing scenes and logging out, and it never writes to the character sheet: the levels live in a read-only layer the save path cannot see, so nothing about it reaches the server. Zone skill caps still apply to it exactly as they do to a genuinely trained skill.]]></description>
    </item>
    <item>
      <title>Towns: Published a player-owned towns improvement plan: twenty-four proposals, from a message of…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-5622b12127f6</guid>
      <pubDate>Tue, 04 Aug 2026 14:17:37 -0500</pubDate>
      <description><![CDATA[Published a player-owned towns improvement plan: twenty-four proposals, from a message of the day with a real editor and an arrival welcome to a governor's console that runs the whole town from one window, an in-game town directory sorted by who is actually home, a placeable town crier who speaks the town's message aloud, named townsfolk, district signposts, multi-destination town teleporters, town banners and citizen titles, lot applications, a donation board that upgrades the town square and never downgrades it, market row vendor stalls, and shipping the five finished bespoke town maps that currently ship to nobody. The illustrated version is public at <a href="https://catnipgames.net/blog/proposals/towns/">catnipgames.net/blog/proposals/towns/</a> with a comment thread and vote arrows on every proposal.]]></description>
    </item>
    <item>
      <title>Dungeons: Published a player dungeons improvement plan: twenty-five proposals, from a doorway that…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-04-c48985b7bf25</guid>
      <pubDate>Tue, 04 Aug 2026 15:47:06 -0500</pubDate>
      <description><![CDATA[Published a player dungeons improvement plan: twenty-five proposals, from a doorway that finally says why a piece will not place, to publishing a dungeon by clearing it yourself, an entrance plaque that remembers first clears and record times, a live map of your own halls, pressure plates and dart walls, new creature families, blueprints on booksellers, and a prize chest the owner stakes with their own gold that the first clean run claims. Every proposal has its own comment thread and vote arrows: <a href="https://catnipgames.net/blog/proposals/dungeons/">the full write-up</a>.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-08-03</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-headlines</guid>
      <pubDate>Mon, 03 Aug 2026 18:55:39 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>A two-second escape skill turned out to be the biggest melee opener in the Subterfuge tree. <b>Sneak Attack</b> read the hidden-ness stat as an unbounded damage multiplier, and stealth effects stack, so layering a smoke bomb on top of Camouflage nearly doubled the hit. The term is now capped at fully hidden.</li>
        <li>The <b>Cave Wrasse</b> fights like a wrasse instead of a crocodile: its own bite, a cinder spit and a sulfur roar, built on three attack IDs that had been reserved for it and left unused since 2015. It also ambushes now, crouching without a nameplate until it springs.</li>
        <li>The launcher can <strong>keep a copy of a build</strong> and run it later. Players asked for it, and there was no way back to an old build before now.</li>
        <li><b>Skill decay is retired.</b> Dying no longer takes experience off any skill, at any level, in any scene.</li>
        <li>Zone loads after the first are about <strong>2.4 seconds faster</strong>. Most of what was left in a 10 second load turned out to be fixed waiting, not loading.</li>
        <li>Pet Range was in the taming tree but no trainer taught it, so every tamer in the game has been stuck at a two metre pet tether. Trainers offer it now.</li>
        <li>Four of the game's best-known artifacts finally count as artifacts in your inventory: the Scepter of Dread, the Heart of Sorrows, the Bonesteel Crown and the Shroud of the Avatar.</li>
        <li>A public <b>Resource Atlas</b> went up at catnipgames.net/resources/: every harvestable node in the game, mapped per zone, with the zone tier and a lookup for which zones carry a given resource.</li>
        <li>The <b>50% experience loss on unlearning a skill is gone</b>. Every school now returns everything you drain, and the time it takes is the only cost of changing your build.</li>
        <li>The Skills window <b>shows its numbers</b>. Experience in a skill, what the next level costs, what unlearning gives back, and a school total: all of it was computed on your client and printed nowhere, so players were buying unlearn scrolls just to read a figure off the confirmation box.</li>
        <li>Buffs no longer wear off when you switch scenes. A bug reported since 2020: buff time was recalculated from your attunement during loading, when buffs and gear are not counted yet, and anything judged expired was deleted. Duration is now locked in when the buff is cast.</li>
        <li>The encumbrance warning is readable now: the yellow and red marks draw large, bold and centered on the icon, and the icon no longer loses its picture when you log in light and get heavy later.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Filed 10 tracker entries from the nightly forum sweep: nine wishlist ideas (skill…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-7495c384eec2</guid>
      <pubDate>Mon, 03 Aug 2026 06:48:26 -0500</pubDate>
      <description><![CDATA[Filed 10 tracker entries from the nightly forum sweep: nine wishlist ideas (skill reworks, Lua localization APIs, NPC dialogue/faction depth, character customization, quest-item QoL) and one quest-flow bug the team already flagged in a forum reply.]]></description>
    </item>
    <item>
      <title>Community: Added a card to the SQUIRREL! page on why untraining no longer destroys experience…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-ec300749cf5a</guid>
      <pubDate>Mon, 03 Aug 2026 13:00:06 -0500</pubDate>
      <description><![CDATA[Added a card to the SQUIRREL! page on why untraining no longer destroys experience, including the part where the only way around the loss was to buy the item that skipped it.]]></description>
    </item>
    <item>
      <title>Build: Fixed the Mac update channel being left behind by the nightly release. The Mac launcher…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-c6b95e5c5a8e</guid>
      <pubDate>Mon, 03 Aug 2026 07:15:17 -0500</pubDate>
      <description><![CDATA[Fixed the Mac update channel being left behind by the nightly release. The Mac launcher shipped on July 30 but the release pipeline still only published Windows and Linux, so Mac stayed on build 76 while the shard moved to 87 and Mac players could not log in. Build 87 is now published for Mac and every release carries all three platforms.]]></description>
    </item>
    <item>
      <title>Build: When the Mac build agent is offline at release time, the release now ships Windows and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-6b020f8bd86b</guid>
      <pubDate>Mon, 03 Aug 2026 07:15:18 -0500</pubDate>
      <description><![CDATA[When the Mac build agent is offline at release time, the release now ships Windows and Linux as usual but flags itself so the missing Mac update gets noticed and re-run instead of sitting stale.]]></description>
    </item>
    <item>
      <title>Build: The Mac build machine dropped off the build farm on the 2nd and stayed off. The disk…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-e9b7e7858768</guid>
      <pubDate>Mon, 03 Aug 2026 08:53:51 -0500</pubDate>
      <description><![CDATA[The Mac build machine dropped off the build farm on the 2nd and stayed off. The disk image that holds its build tree lost contact with the drive underneath it, which unmounted the volume but left the image loaded, so every attempt to reconnect the machine failed at that same step. Reattaching the image brought it back, and the build tree came through intact.]]></description>
    </item>
    <item>
      <title>Build: Rewrote the Mac machine startup step so it recovers from that fault on its own: it clears…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-9b05cd104a20</guid>
      <pubDate>Mon, 03 Aug 2026 08:53:57 -0500</pubDate>
      <description><![CDATA[Rewrote the Mac machine startup step so it recovers from that fault on its own: it clears a stuck image before reattaching, and does nothing when the build tree is already mounted. Tested by unmounting the volume and reconnecting the machine, which came back up without anyone touching it.]]></description>
    </item>
    <item>
      <title>Build: Corrected the Mac build notes while checking that machine over. They still said Mac…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-48edf893cfb7</guid>
      <pubDate>Mon, 03 Aug 2026 08:58:10 -0500</pubDate>
      <description><![CDATA[Corrected the Mac build notes while checking that machine over. They still said Mac builds had to skip the pre-build refresh because the machine kept no local copy of the large game files. It has held a full copy for a while now, and the nightly release has been refreshing normally the whole time.]]></description>
    </item>
    <item>
      <title>Combat: Capped the stealth term in Sneak Attack's damage formula. It was the only place in the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-cc40401e8b6c</guid>
      <pubDate>Mon, 03 Aug 2026 07:26:38 -0500</pubDate>
      <description><![CDATA[Capped the stealth term in Sneak Attack's damage formula. It was the only place in the game that read the hidden-ness stat as an unbounded multiplier, and that stat routinely goes past its intended maximum because stealth effects add together. A fully specialized Camouflage opener from behind drops from 312.5 to 275 damage at 100 melee damage, and the same opener with <b>Obfuscate</b> layered on top drops from 462.5 to 275. An unhidden Sneak Attack is unchanged.]]></description>
    </item>
    <item>
      <title>Combat: Fixed timed buffs wearing off on scene changes and relogs, reported on the old forums as…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-a27617bcf357</guid>
      <pubDate>Mon, 03 Aug 2026 17:18:31 -0500</pubDate>
      <description><![CDATA[Fixed timed buffs wearing off on scene changes and relogs, reported on the old forums as far back as 2020 (Strength of Earth was the usual victim). The saved buff record kept only a start time, and the loader recalculated total duration from current attunement, which dips while a scene loads because other buffs are not reapplied yet. Long buffs came back judged expired and were deleted. The duration resolved at cast time is now saved with the buff and reused on load.]]></description>
    </item>
    <item>
      <title>Combat: The same fix covers potion buffs, whose elixir extension bonus was re-read from current…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-bbcaf3c3ac07</guid>
      <pubDate>Mon, 03 Aug 2026 17:18:33 -0500</pubDate>
      <description><![CDATA[The same fix covers potion buffs, whose elixir extension bonus was re-read from current gear on load, and the buff icons other players see on you, which could vanish the same way. Multi-tick heals and damage-over-time keep their tick rhythm across the load, and pre-fix saves fall back to the old behavior until they expire.]]></description>
    </item>
    <item>
      <title>Infrastructure: Fixed the client frame-rate dashboard, where most panels had been showing "Could not…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-f9a54283aa1b</guid>
      <pubDate>Mon, 03 Aug 2026 07:55:46 -0500</pubDate>
      <description><![CDATA[Fixed the client frame-rate dashboard, where most panels had been showing "Could not locate that index-pattern-field" instead of charts. The telemetry was arriving fine the whole time; the log viewer caches each index pattern's field list inside its saved object, and that cache was written three days before the newer frame-timing fields started flowing, so every panel built on them failed to resolve.]]></description>
    </item>
    <item>
      <title>Infrastructure: Added a script that rebuilds those field caches for all four log index patterns, and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-b5b8fd6b7122</guid>
      <pubDate>Mon, 03 Aug 2026 07:55:54 -0500</pubDate>
      <description><![CDATA[Added a script that rebuilds those field caches for all four log index patterns, and wired it into the provisioner so it runs after every saved-object import. The import re-creates the index patterns from files that carry no field list, so each provisioner run used to wipe the cache it had just been handed. Applied to the shard: 595 fields on the debug stream, and the item and metrics patterns went from no cache at all to 50 and 64 fields.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-b87e5ead25c5</guid>
      <pubDate>Mon, 03 Aug 2026 07:56:01 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/client-frame-rate-dashboard-2026-08-03.png" data-full="https://catnipgames.net/blog/images/client-frame-rate-dashboard-2026-08-03.png" data-cap="The client frame-rate dashboard after the field-cache fix: per-scene frame rates, median against 1% lows, and CPU versus GPU frame time over the last seven days."></span>]]></description>
    </item>
    <item>
      <title>Images: The new build archive controls, in the launcher's Show debug panel.</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-237cb9038151</guid>
      <pubDate>Mon, 03 Aug 2026 08:35:36 -0500</pubDate>
      <description><![CDATA[The new build archive controls, in the launcher's Show debug panel. <span class="gallery"><img src="https://catnipgames.net/blog/images/launcher-build-archive-panel.png" data-full="https://catnipgames.net/blog/images/launcher-build-archive-panel.png" data-cap="Keeping a copy of a build from the launcher debug panel, and the list of kept copies." alt="Launcher build archive panel"></span>]]></description>
    </item>
    <item>
      <title>Images: Encumbrance warning marks after the pass, shown at actual size and zoomed:</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-01b91c568d08</guid>
      <pubDate>Mon, 03 Aug 2026 18:43:46 -0500</pubDate>
      <description><![CDATA[Encumbrance warning marks after the pass, shown at actual size and zoomed: <span class="gallery"><img src="https://catnipgames.net/blog/images/encumbrance-warning-marks.png" data-full="https://catnipgames.net/blog/images/encumbrance-warning-marks.png" data-cap="The reworked encumbrance warning: yellow near the limit, red at it, actual size and zoomed" alt="Encumbrance warning marks at actual size and zoomed"></span>]]></description>
    </item>
    <item>
      <title>Creatures: The Cave Wrasse family stopped borrowing the crocodile's attacks. Three attack IDs…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-3dc10c4c1b0f</guid>
      <pubDate>Mon, 03 Aug 2026 07:57:04 -0500</pubDate>
      <description><![CDATA[The <b>Cave Wrasse</b> family stopped borrowing the crocodile's attacks. Three attack IDs reserved for this creature back in 2015 were still sitting unused in the game's tables, so it now has its own bite, a short-range cinder spit, and a sulfur roar that drops a target's Strength by 20 for 15 seconds on up to five people at once. The tier 15 and the Broodmother still escalate into dragon fire, which suits a thing that lives on dragon leavings.]]></description>
    </item>
    <item>
      <title>Creatures: The wrasses ambush now. The behaviour flag that turns it on had never been set, so the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-443944bdfd26</guid>
      <pubDate>Mon, 03 Aug 2026 07:57:12 -0500</pubDate>
      <description><![CDATA[The wrasses ambush now. The behaviour flag that turns it on had never been set, so the ambush tuning on all five did nothing at all. The animation for it was already built and unreachable: the creature crouches, waits, then springs with a roar, and shows no nameplate until it moves. The lower tiers, the ones you would write off as harmless, let you get closest before they go.]]></description>
    </item>
    <item>
      <title>Creatures: Two faults in the same family, both found before anything was play-tested. Both of its…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-a4d3d91fda50</guid>
      <pubDate>Mon, 03 Aug 2026 07:57:12 -0500</pubDate>
      <description><![CDATA[Two faults in the same family, both found before anything was play-tested. Both of its sound sources named a bone belonging to the crocodile it was copied from, one the wrasse skeleton does not have, so its audio played from the wrong place on all five creatures. Its gaits were tuned to between 1.2 and 3.5 metres per second against an animation whose feet only carry it 0.65, so it slid across the floor at up to five times its own stride. Measured the animation and matched the numbers to it, then checked the method against the crocodile, which sits within 14 percent of its own.]]></description>
    </item>
    <item>
      <title>Creatures: The wrasse family's guard test ran for the first time since it was written. It had been…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-f02d010f950c</guid>
      <pubDate>Mon, 03 Aug 2026 07:57:19 -0500</pubDate>
      <description><![CDATA[The wrasse family's guard test ran for the first time since it was written. It had been blocked by another session on the day it was added, so its checks were confirmed by hand and never actually executed. It passes, and grew from 44 checks to 60 to cover the new attacks, the sound bones and the ambush tiers.]]></description>
    </item>
    <item>
      <title>Creatures: Pet Range, the taming skill that sets how far your pet will chase a target before…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-8e3b1edb3727</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:07 -0500</pubDate>
      <description><![CDATA[Pet Range, the taming skill that sets how far your pet will chase a target before breaking off, was in the skill tree but no trainer taught it. Every tamer was pinned at the untrained two metre tether, so pets disengaged almost as soon as they left your side. Taming trainers now offer it, and training it widens the tether to about ten metres at the top of the skill.]]></description>
    </item>
    <item>
      <title>Creatures: Follow Close, Follow Near and Follow Far set the distance without putting the pet into…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-ca8444a74d7c</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:08 -0500</pubDate>
      <description><![CDATA[Follow Close, Follow Near and Follow Far set the distance without putting the pet into follow mode. A pet told to stay put would acknowledge the order and keep standing there. All three now start the pet following as well as setting the distance, the choice survives a zone change, and the matching chat commands work instead of doing nothing. Companions get the same fix.]]></description>
    </item>
    <item>
      <title>Creatures: Four problems in how a taming attempt resolves. If the creature died or you left the area…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-63dc38016f24</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:17 -0500</pubDate>
      <description><![CDATA[Four problems in how a taming attempt resolves. If the creature died or you left the area as the attempt finished, the attempt could fail to resolve at all. A creature not on the tameable list could report success, take your collar and give you nothing. A tame that succeeded but could not hand you the pet cost you both the creature and the collar. The chance on the cast bar could also read above 100 percent or below zero, and a creature with no real chance could still be tamed on a lucky roll. All four are fixed.]]></description>
    </item>
    <item>
      <title>Creatures: A pet emote item that could not be redeemed was rejected and then destroyed anyway, so…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-ae9e3d16f284</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:18 -0500</pubDate>
      <description><![CDATA[A pet emote item that could not be redeemed was rejected and then destroyed anyway, so the item was gone and nothing was unlocked. The item now stays in your inventory.]]></description>
    </item>
    <item>
      <title>Creatures: Wrote up the whole pet, summon and taming system as a single audit, covering tamed pets…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-343bf641fe6a</guid>
      <pubDate>Mon, 03 Aug 2026 11:21:25 -0500</pubDate>
      <description><![CDATA[Wrote up the whole pet, summon and taming system as a single audit, covering tamed pets, the taming tree, magic summons, companions and deco pets. Five defects fixed, a set of hardening fixes in the summon path, and a dozen balance and intent questions recorded with the evidence for each rather than guessed at.]]></description>
    </item>
    <item>
      <title>Creatures: Fixed a case where a room full of test bots could take over simulating the creatures in a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-3e45397a53b1</guid>
      <pubDate>Mon, 03 Aug 2026 12:49:17 -0500</pubDate>
      <description><![CDATA[Fixed a case where a room full of test bots could take over simulating the creatures in a scene. Bots do not run creature behaviour, so every creature there would freeze for the next real player to arrive. Bots now hand that role straight back when a player joins.]]></description>
    </item>
    <item>
      <title>Creatures: Creatures could never see a test bot standing in front of them. Bots were missing one…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-dd93779ac2c6</guid>
      <pubDate>Mon, 03 Aug 2026 13:28:16 -0500</pubDate>
      <description><![CDATA[Creatures could never see a test bot standing in front of them. Bots were missing one piece of the data a real player publishes on arrival, and without it every creature treated them as still spawning in, forever. They are visible to wildlife now, take real damage, and stop wandering off mid-fight.]]></description>
    </item>
    <item>
      <title>Client: Tracked down why the draw-call panels on that dashboard were empty: no shipped client had…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-a8c20281e72b</guid>
      <pubDate>Mon, 03 Aug 2026 08:10:30 -0500</pubDate>
      <description><![CDATA[Tracked down why the draw-call panels on that dashboard were empty: no shipped client had ever reported a draw-call number. Across 27,471 frame-rate heartbeats there was not one, and the client has been trying to send them since mid-July.]]></description>
    </item>
    <item>
      <title>Client: The cause was timing. The engine registers those render counters lazily, and the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-3a19cda75b9c</guid>
      <pubDate>Mon, 03 Aug 2026 08:10:39 -0500</pubDate>
      <description><![CDATA[The cause was timing. The engine registers those render counters lazily, and the frame-rate meter asked for them at startup, so it bound to counters that did not exist yet and stayed broken for the rest of the session. It never showed up in the editor, which has them ready before anything asks. The meter now re-asks on a five-second cooldown for the first few minutes, and says so in the log if it gives up.]]></description>
    </item>
    <item>
      <title>Client: The Journal opened itself on every login, whatever you had done with it beforehand. It…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-9a93e474b5f8</guid>
      <pubDate>Mon, 03 Aug 2026 08:24:58 -0500</pubDate>
      <description><![CDATA[The Journal opened itself on every login, whatever you had done with it beforehand. It now opens only if you left it open, keeps the position and size you gave it, and stays put when you cross a zone line. Closing it with the X, the J key, or Escape all count as closing it.]]></description>
    </item>
    <item>
      <title>Client: A tester reported the Journal was still doing it after the first attempt at a fix in…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-72d7c9429d0b</guid>
      <pubDate>Mon, 03 Aug 2026 08:25:14 -0500</pubDate>
      <description><![CDATA[A tester reported the Journal was still doing it after the first attempt at a fix in July, and they were right. Two separate startup paths could each open a HUD window without consulting the other, and that first fix turned off the one that remembers your choice while leaving the one that opens the window outright. A new test rejects any window wired to do both, because that pairing can only ever save as open.]]></description>
    </item>
    <item>
      <title>Client: Retiring Frenzy left a leftover glyph sitting on the hotbar of anyone who had it there…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-a130001e064c</guid>
      <pubDate>Mon, 03 Aug 2026 08:33:27 -0500</pubDate>
      <description><![CDATA[Retiring Frenzy left a leftover glyph sitting on the hotbar of anyone who had it there, looking clickable even though the skill was gone from the tree and its experience refunded. Combat decks already cleaned themselves up in that situation; the hotbar never did. It does now, and only for skills actually retired from the game, so potions, scrolls, tools and emotes on the bar are untouched. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Client: The character sheet's Masteries section rounded the mastery value to a whole number, so a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-11964ae23b1d</guid>
      <pubDate>Mon, 03 Aug 2026 18:54:39 -0500</pubDate>
      <description><![CDATA[The character sheet's Masteries section rounded the mastery value to a whole number, so a Blades Mastery of 1.6 showed as 2 on the line while its hover tooltip said 1.6. The line now prints the exact value, matching the tooltip. Reported by a tester with a screenshot.]]></description>
    </item>
    <item>
      <title>Balance: Wrote a deep-dive analysis of the skill specialization system: how each school's…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-586f24947e40</guid>
      <pubDate>Mon, 03 Aug 2026 08:18:48 -0500</pubDate>
      <description><![CDATA[Wrote a deep-dive analysis of the skill specialization system: how each school's Specialization skill works, what it actually grants at level 80, and how the training and switching costs compare to nine other MMOs.]]></description>
    </item>
    <item>
      <title>Balance: The specialization review turned up 13 effects that never apply or that read the wrong…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-22c6c7e27789</guid>
      <pubDate>Mon, 03 Aug 2026 08:18:48 -0500</pubDate>
      <description><![CDATA[The specialization review turned up 13 effects that never apply or that read the wrong school's specialization. All are documented with proposed fixes for a future balance wave; no gameplay changes shipped yet.]]></description>
    </item>
    <item>
      <title>Balance: Fixed summoned Air, Earth, and Fire elementals leveling from Water Magic Specialization…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-56e23c03ca7c</guid>
      <pubDate>Mon, 03 Aug 2026 09:28:41 -0500</pubDate>
      <description><![CDATA[Fixed summoned Air, Earth, and Fire elementals leveling from Water Magic Specialization instead of their own school. Each elemental now scales with its caster's matching specialization.]]></description>
    </item>
    <item>
      <title>Balance: Cleaned up wild elemental attack data that scaled off Fire Magic Specialization for every…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-88fc3066b0d8</guid>
      <pubDate>Mon, 03 Aug 2026 09:30:34 -0500</pubDate>
      <description><![CDATA[Cleaned up wild elemental attack data that scaled off Fire Magic Specialization for every element. The term was inactive for wild creatures; each elemental's data now names its own school.]]></description>
    </item>
    <item>
      <title>Balance: Fixed the summoned Phoenix having zero magic resistance unless its caster had Sun Magic…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-6b48eae68edb</guid>
      <pubDate>Mon, 03 Aug 2026 09:30:50 -0500</pubDate>
      <description><![CDATA[Fixed the summoned Phoenix having zero magic resistance unless its caster had Sun Magic Specialization. It now gets the same base resistance as other summons, with Sun Specialization adding more.]]></description>
    </item>
    <item>
      <title>Balance: Fixed the tamed Wyvern's tail attack ignoring the owner's Taming Specialization. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-c3031e6f6dca</guid>
      <pubDate>Mon, 03 Aug 2026 09:31:17 -0500</pubDate>
      <description><![CDATA[Fixed the tamed Wyvern's tail attack ignoring the owner's Taming Specialization. The bonus hits now apply.]]></description>
    </item>
    <item>
      <title>Balance: Fixed two unreleased Bard songs whose focus and reagent discounts were keyed to Ranged…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-016e411369bb</guid>
      <pubDate>Mon, 03 Aug 2026 09:31:51 -0500</pubDate>
      <description><![CDATA[Fixed two unreleased Bard songs whose focus and reagent discounts were keyed to Ranged Specialization instead of Bard.]]></description>
    </item>
    <item>
      <title>Balance: Looked into the specialization elixirs: their bonus math needs a design pass rather than…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-098c41526543</guid>
      <pubDate>Mon, 03 Aug 2026 09:32:07 -0500</pubDate>
      <description><![CDATA[Looked into the specialization elixirs: their bonus math needs a design pass rather than a quick formula fix. An initial tweak was reverted the same day while that decision is made; the drinks behave exactly as before.]]></description>
    </item>
    <item>
      <title>Balance: Cleaned up four creature attack archetypes that read armor specialization stats no…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-9f77d317f436</guid>
      <pubDate>Mon, 03 Aug 2026 09:32:20 -0500</pubDate>
      <description><![CDATA[Cleaned up four creature attack archetypes that read armor specialization stats no creature has. The data now points at the owner's specialization so it works if these attacks are ever given to pets.]]></description>
    </item>
    <item>
      <title>Balance: Heavy Armor Specialization now raises the damage absorption cap as designed: at…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-eee4be70b609</guid>
      <pubDate>Mon, 03 Aug 2026 09:46:13 -0500</pubDate>
      <description><![CDATA[Heavy Armor Specialization now raises the damage absorption cap as designed: at specialization 80 armor can absorb up to 90 percent of a hit instead of 80. The bonus existed in the design but never applied.]]></description>
    </item>
    <item>
      <title>Balance: The taming success bonus from Taming Specialization now only applies while the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-8bbe359efd09</guid>
      <pubDate>Mon, 03 Aug 2026 09:46:55 -0500</pubDate>
      <description><![CDATA[The taming success bonus from Taming Specialization now only applies while the specialization is set to training or maintaining, matching every other specialization benefit.]]></description>
    </item>
    <item>
      <title>Balance: Chance tooltips no longer display values above 100 percent. Combat rolls are unchanged.</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-6cc9eb7dd9d0</guid>
      <pubDate>Mon, 03 Aug 2026 09:47:01 -0500</pubDate>
      <description><![CDATA[Chance tooltips no longer display values above 100 percent. Combat rolls are unchanged.]]></description>
    </item>
    <item>
      <title>Balance: Removed a leftover Obsidian Mastery entry from the specialization tables. It belonged to…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-970fe63a9683</guid>
      <pubDate>Mon, 03 Aug 2026 09:47:21 -0500</pubDate>
      <description><![CDATA[Removed a leftover Obsidian Mastery entry from the specialization tables. It belonged to a school that was never built and could not be obtained.]]></description>
    </item>
    <item>
      <title>Balance: Hardened the two-specialization limit: promoting a specialization now cleanly demotes the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-9492215e8da7</guid>
      <pubDate>Mon, 03 Aug 2026 09:47:27 -0500</pubDate>
      <description><![CDATA[Hardened the two-specialization limit: promoting a specialization now cleanly demotes the others in every case, and a repair pass fixes characters carrying more than two active specializations from old data.]]></description>
    </item>
    <item>
      <title>Balance: Added automated tests pinning the specialization fixes so the wrong-school and self-stat…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-52ea12e07405</guid>
      <pubDate>Mon, 03 Aug 2026 09:47:32 -0500</pubDate>
      <description><![CDATA[Added automated tests pinning the specialization fixes so the wrong-school and self-stat reads cannot quietly return.]]></description>
    </item>
    <item>
      <title>Balance: Wild elementals' melee strikes now count as their element, so elemental resistances and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-bf2e74a5dd30</guid>
      <pubDate>Mon, 03 Aug 2026 09:53:16 -0500</pubDate>
      <description><![CDATA[Wild elementals' melee strikes now count as their element, so elemental resistances and wards reduce the whole attack instead of only part of it.]]></description>
    </item>
    <item>
      <title>Balance: Skill decay on death is gone. Dying no longer removes experience from any skill, at any…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-ceb6bd23fe58</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:12 -0500</pubDate>
      <description><![CDATA[Skill decay on death is gone. Dying no longer removes experience from any skill, at any level, in any scene. Decay had been running at the full rate from level 40 up to a scene level cap while characters at or above the cap lost almost nothing, because the rate was scaled by a ratio built from two different experience tables.]]></description>
    </item>
    <item>
      <title>Balance: A specialization now switches all of its bonuses off when you stop training it. Only the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-0f18265b6d59</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:13 -0500</pubDate>
      <description><![CDATA[A specialization now switches all of its bonuses off when you stop training it. Only the mastery bonus itself was gated before, so the school attunement a mastery grants, worth up to 16 points at mastery 80, kept applying to a specialization that had been parked. Levelling every magic mastery and parking them all granted attunement in nine schools at once while occupying two specialization slots.]]></description>
    </item>
    <item>
      <title>Balance: Parties fighting in player basements were collecting the 25% open PVP experience bonus…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-3cff8a5c58b5</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:14 -0500</pubDate>
      <description><![CDATA[Parties fighting in player basements were collecting the 25% open PVP experience bonus that basements are meant to be excluded from. The exclusion compared a whole set of scene flags against a single flag, so it never matched. 50 scenes carry the basement flag and none of them carry it alone.]]></description>
    </item>
    <item>
      <title>Balance: Party experience is no longer dropped partway through a group kill in a scene missing…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-0b7873cc916d</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:15 -0500</pubDate>
      <description><![CDATA[Party experience is no longer dropped partway through a group kill in a scene missing from the scene records on the server. Members earlier in the list kept their share and everyone after them got none.]]></description>
    </item>
    <item>
      <title>Balance: Unlearning Lightning Storm returns all of its experience instead of half. It was the one…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-0200bcd9dd35</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:16 -0500</pubDate>
      <description><![CDATA[Unlearning Lightning Storm returns all of its experience instead of half. It was the one implemented Air skill left out of the full refund list, which cost about 1.2 million experience on a respec at level 100 while the other fourteen Air skills refunded in full.]]></description>
    </item>
    <item>
      <title>Balance: Verdantis Shardfall no longer caps producer skills. The zone holds adventurer level and…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-558d99f5ab4b</guid>
      <pubDate>Mon, 03 Aug 2026 12:06:54 -0500</pubDate>
      <description><![CDATA[Verdantis Shardfall no longer caps producer skills. The zone holds adventurer level and adventuring skills to 110 so fights there stay close, but it was applying the same 110 ceiling to production skills, which clamped the bonuses those skills grant and showed the wrong level in their tooltips. Production skills now count at their real level inside the zone. The adventuring caps are unchanged, and it was the only scene in the game capping production.]]></description>
    </item>
    <item>
      <title>Launcher: Added a way to keep a copy of the build you have installed, and to run a kept copy later…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-0434d0b79a18</guid>
      <pubDate>Mon, 03 Aug 2026 08:35:27 -0500</pubDate>
      <description><![CDATA[Added a way to keep a copy of the build you have installed, and to run a kept copy later. Both live in the launcher's Show debug panel: one button keeps the current build, and a dropdown beside it lists your kept copies with a Play this build button. Players asked for this; until now an update overwrote the old build and there was no way back to it.]]></description>
    </item>
    <item>
      <title>Launcher: Kept copies go in a folder you pick. On the same drive as the game a copy takes seconds…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-f5591a71ea49</guid>
      <pubDate>Mon, 03 Aug 2026 08:35:27 -0500</pubDate>
      <description><![CDATA[Kept copies go in a folder you pick. On the same drive as the game a copy takes seconds and no extra disk space, because it shares its files with the installed build until a patch replaces them. On another drive it does a real copy, with progress and a cancel button. Running a kept copy leaves your normal install alone, so the launcher goes on patching and playing the current build.]]></description>
    </item>
    <item>
      <title>Launcher: Released launcher build 26 for Windows and Linux, carrying the build archive. Installed…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-2286334c91b8</guid>
      <pubDate>Mon, 03 Aug 2026 08:49:01 -0500</pubDate>
      <description><![CDATA[Released launcher build 26 for Windows and Linux, carrying the build archive. Installed launchers pick it up on their next start. The Mac launcher stays on 25 until its bundle is rebuilt, which has to happen on a Mac.]]></description>
    </item>
    <item>
      <title>Launcher: The Mac launcher is on build 26 as well, built and signed on a Mac and published to the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-d448c59d2753</guid>
      <pubDate>Mon, 03 Aug 2026 09:12:03 -0500</pubDate>
      <description><![CDATA[The Mac launcher is on build 26 as well, built and signed on a Mac and published to the same channel. All three platforms now carry the build archive.]]></description>
    </item>
    <item>
      <title>Crafting: The batch crafting experience penalty holds at half again across the whole curve. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-2258516a5505</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:24 -0500</pubDate>
      <description><![CDATA[The batch crafting experience penalty holds at half again across the whole curve. The halved value and the lower floor were computed from different numbers, so the penalty faded from ten prior crafts of a recipe and was worth nothing from thirty on, where a batch paid exactly what single crafting paid.]]></description>
    </item>
    <item>
      <title>Crafting: Crafting and gathering bonuses now use the production skill cap in the four scenes that…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-0ffa6ccaea4d</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:25 -0500</pubDate>
      <description><![CDATA[Crafting and gathering bonuses now use the production skill cap in the four scenes that cap adventuring at 100 while leaving production at 200. The cap was being read and then discarded, so a miner at 140 in those scenes had every mining bonus evaluated at 100 while the character sheet showed 140.]]></description>
    </item>
    <item>
      <title>Crafting: Repairing an artifact at a crafting table now counts everything you put on the table…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-4ec9f3f88db2</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:37 -0500</pubDate>
      <description><![CDATA[Repairing an artifact at a crafting table now counts everything you put on the table, including items inside a bag sitting on it. Before, only the top layer of the table was checked, so an artifact or a gold crown tucked into a bag was missed.]]></description>
    </item>
    <item>
      <title>Crafting: Enchanting, masterworking, collecting a brew and pulling ingredients from a lot chest…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-5dbeec6298dc</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:38 -0500</pubDate>
      <description><![CDATA[Enchanting, masterworking, collecting a brew and pulling ingredients from a lot chest stopped dragging the chat window in front of the table you are standing at.]]></description>
    </item>
    <item>
      <title>UI: The rune card list updates the right way round when a skill changes. Unlearning a rune…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-a19ab074a17b</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:24 -0500</pubDate>
      <description><![CDATA[The rune card list updates the right way round when a skill changes. Unlearning a rune used to leave its row on the list, and lowering a rune skill with an unlearn item removed the row even though copies remained.]]></description>
    </item>
    <item>
      <title>UI: Turning a specialization off now rechecks your decks straight away. The extra card a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-b82584c21589</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:25 -0500</pubDate>
      <description><![CDATA[Turning a specialization off now rechecks your decks straight away. The extra card a specialization grants at mastery 80 stayed in the equipped deck until an unrelated later event removed it.]]></description>
    </item>
    <item>
      <title>UI: Starting a third specialization now gives up the lower level of the two you already hold…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-acb5fbd7c8cc</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:26 -0500</pubDate>
      <description><![CDATA[Starting a third specialization now gives up the lower level of the two you already hold. It had been picking whichever the server happened to send first, so it could drop a level 100 specialization in place of a level 80 one.]]></description>
    </item>
    <item>
      <title>UI: The daily pooled experience bonus compares whole dates, so a player returning exactly a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-0c0f20106dda</guid>
      <pubDate>Mon, 03 Aug 2026 10:23:27 -0500</pubDate>
      <description><![CDATA[The daily pooled experience bonus compares whole dates, so a player returning exactly a year later on the same calendar date is no longer refused the bonus for that day. Both records of the last claim now update together.]]></description>
    </item>
    <item>
      <title>UI: The pet status bar only wired up its stance icon and movement letter when the pet was…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-4cbcb22dcf9d</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:18 -0500</pubDate>
      <description><![CDATA[The pet status bar only wired up its stance icon and movement letter when the pet was first summoned. A pet that came back with you through a zone change showed blank or stale indicators and stopped updating for the rest of the session. Both now fill in and keep updating however the pet arrives.]]></description>
    </item>
    <item>
      <title>UI: The Scepter of Dread, the Heart of Sorrows, the Bonesteel Crown and the Shroud of the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-496628bf97fc</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:38 -0500</pubDate>
      <description><![CDATA[The Scepter of Dread, the Heart of Sorrows, the Bonesteel Crown and the Shroud of the Avatar now appear under the Artifact category in your inventory and render in the same bronze as every other artifact. Their tooltips already called them artifacts; the filter and the name colour did not agree. How you repair them is unchanged.]]></description>
    </item>
    <item>
      <title>UI: The encumbrance warning in the top right corner draws its yellow and red exclamation…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-c6a004b91d63</guid>
      <pubDate>Mon, 03 Aug 2026 18:43:36 -0500</pubDate>
      <description><![CDATA[The encumbrance warning in the top right corner draws its yellow and red exclamation marks large and centered on the rune icon now, in bold with a black outline. They used to draw at the 16px body size with no outline over 32px of busy art, and players reported them as hard to see.]]></description>
    </item>
    <item>
      <title>UI: Fixed the encumbrance icon losing its picture. The rune art only becomes available once a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-fad936584778</guid>
      <pubDate>Mon, 03 Aug 2026 18:43:36 -0500</pubDate>
      <description><![CDATA[Fixed the encumbrance icon losing its picture. The rune art only becomes available once a character is over capacity, and the corner asked for it a single time at startup, so logging in with a light load left the warning drawing as a small bare exclamation mark for the whole session. The corner now keeps asking until the art arrives.]]></description>
    </item>
    <item>
      <title>Performance: Zone loads after the first are about 2.4 seconds faster. Two fixed delays were being…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-b44332da6e11</guid>
      <pubDate>Mon, 03 Aug 2026 10:42:19 -0500</pubDate>
      <description><![CDATA[Zone loads after the first are about 2.4 seconds faster. Two fixed delays were being charged to every scene change after the real loading work had already finished: a two second pause at the end so creatures would complete their spawn-in effect out of sight, and a half second pause at the start on top of a loading screen fade that had already completed.]]></description>
    </item>
    <item>
      <title>Performance: Measured the load against 1,784 real loads on the test shard rather than one development…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-59508f655bb9</guid>
      <pubDate>Mon, 03 Aug 2026 10:42:19 -0500</pubDate>
      <description><![CDATA[Measured the load against 1,784 real loads on the test shard rather than one development machine, which moved the target. The median load was 10.1 seconds and the phases accounted for all of it, so the largest remaining slice was fixed waiting rather than asset or engine work. Two earlier conclusions from the development machine were wrong: garbage collection costs 0.22 seconds, not about a second, and 2.2 seconds of apparently missing time was one phase being reported twice.]]></description>
    </item>
    <item>
      <title>Performance: The end of the load was the biggest phase and reported a single opaque number. It now…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-79b46b1c45f2</guid>
      <pubDate>Mon, 03 Aug 2026 10:42:19 -0500</pubDate>
      <description><![CDATA[The end of the load was the biggest phase and reported a single opaque number. It now breaks out shader warmup, the creature spawn wait, level finalize and the scene checksum separately, and it also measures the screen hide and fade that the old total stopped short of, so the reported figure now matches what a player actually waits through.]]></description>
    </item>
    <item>
      <title>Performance: Wrote up four load-time ideas that were measured and rejected, with the reason each one…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-a35ba2822c73</guid>
      <pubDate>Mon, 03 Aug 2026 10:42:19 -0500</pubDate>
      <description><![CDATA[Wrote up four load-time ideas that were measured and rejected, with the reason each one fails, so the next pass does not spend the time on them again. One of them would have looked like a free second and would instead have left the master volume stuck partway up.]]></description>
    </item>
    <item>
      <title>Performance: Measured the load changes in the editor: the fixed pause at the start of a load dropped…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-6666cd495608</guid>
      <pubDate>Mon, 03 Aug 2026 15:02:27 -0500</pubDate>
      <description><![CDATA[Measured the load changes in the editor: the fixed pause at the start of a load dropped from 0.8 to 0.2 seconds and held steady across a cold and a warm load. The new timing also showed that the old figure stopped counting 0.9 seconds before the player is actually looking at the world, and confirmed that one delay we had considered removing was already costing almost nothing.]]></description>
    </item>
    <item>
      <title>Performance: One measurement is still owed. The part of the saving that applies to creatures finishing…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-9e891f1d4743</guid>
      <pubDate>Mon, 03 Aug 2026 15:02:28 -0500</pubDate>
      <description><![CDATA[One measurement is still owed. The part of the saving that applies to creatures finishing their spawn-in needs a scene with creatures in it, and the test shard was not reachable from the development machine, so that number will come from the shard once the change is deployed.]]></description>
    </item>
    <item>
      <title>Performance: Checked two ideas for making loads faster by keeping more in memory, and rejected both on…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-5b11126d50bc</guid>
      <pubDate>Mon, 03 Aug 2026 15:23:49 -0500</pubDate>
      <description><![CDATA[Checked two ideas for making loads faster by keeping more in memory, and rejected both on the numbers. Returning to a scene you had already visited is barely cheaper than arriving fresh, and re-reading a map from disk costs nothing at the median because the operating system has already cached it, so neither trade was worth the memory.]]></description>
    </item>
    <item>
      <title>Performance: The same measurement found a much larger target. Time spent loading art during a zone…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-10a2bc433b66</guid>
      <pubDate>Mon, 03 Aug 2026 15:23:49 -0500</pubDate>
      <description><![CDATA[The same measurement found a much larger target. Time spent loading art during a zone change tracks the decoration phase almost exactly: about a second on a map with no decorations, and nineteen seconds on a heavily decorated one, inside a load of thirty-six. One town template spends 41 percent of its entire load there. That is now the top candidate for the next pass.]]></description>
    </item>
    <item>
      <title>Items: Your chat log now tells you when an item takes durability damage, naming the item and the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-51451943ca38</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:37 -0500</pubDate>
      <description><![CDATA[Your chat log now tells you when an item takes durability damage, naming the item and the points lost. The matching lines for repairs already worked; the damage lines had never once reached a player.]]></description>
    </item>
    <item>
      <title>Items: Artifact system deep dive: the combining ladder, the tier data and the ancient essence…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-94489e2ec4d9</guid>
      <pubDate>Mon, 03 Aug 2026 11:35:03 -0500</pubDate>
      <description><![CDATA[Artifact system deep dive: the combining ladder, the tier data and the ancient essence loop read end to end, with the results written up so the parts that look wrong from a distance and are not do not get re-investigated. Four player-facing fixes came out of it, and the artifact repair rules now live in one place for both online and offline play.]]></description>
    </item>
    <item>
      <title>Bug Fixes: The effect that plays when you find an artifact now plays once for the container you…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-e290f7aab887</guid>
      <pubDate>Mon, 03 Aug 2026 10:49:38 -0500</pubDate>
      <description><![CDATA[The effect that plays when you find an artifact now plays once for the container you opened rather than once per artifact inside it, so a container paying out several no longer stacks the visual on you and everyone nearby.]]></description>
    </item>
    <item>
      <title>Gathering: Added a public Resource Atlas at catnipgames.net/resources/. It lists every zone that has…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-af4e6172e478</guid>
      <pubDate>Mon, 03 Aug 2026 11:18:41 -0500</pubDate>
      <description><![CDATA[Added a public Resource Atlas at catnipgames.net/resources/. It lists every zone that has harvestable resources with its tier and node count, and each zone opens a map showing where those nodes stand, seen from above. You can also pick a resource and see which zones carry it, ranked by how many.]]></description>
    </item>
    <item>
      <title>Gathering: Each resource on the atlas lists both its placed spots and how many of those spots the…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-bc1222768997</guid>
      <pubDate>Mon, 03 Aug 2026 11:18:41 -0500</pubDate>
      <description><![CDATA[Each resource on the atlas lists both its placed spots and how many of those spots the zone keeps filled at once. A zone with 40 emerald spots and 23 live never has all 40 up together, which is worth knowing before you plan a gathering route.]]></description>
    </item>
    <item>
      <title>Gathering: </title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-7e932c7bc0e1</guid>
      <pubDate>Mon, 03 Aug 2026 11:18:50 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><button type="button" class="thumb"><img src="https://catnipgames.net/blog/images/resource-atlas-zone-map.png" data-full="https://catnipgames.net/blog/images/resource-atlas-zone-map.png" data-cap="The Resource Atlas view of one zone: emerald crystal picked out against every other node, with the per-resource maps below it." alt="A top-down map of resource nodes in a mine, with one resource highlighted and a panel of per-resource maps beneath"></span>]]></description>
    </item>
    <item>
      <title>Gathering: The atlas is live with the full world baked in: 221 zones carry resources, holding 16,260…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-de7a4bbee489</guid>
      <pubDate>Mon, 03 Aug 2026 13:37:48 -0500</pubDate>
      <description><![CDATA[The atlas is live with the full world baked in: 221 zones carry resources, holding 16,260 placed nodes across 29 resource types. Copper veins are the most common thing in the game at 1,961 spots, with cotton close behind at 1,908.]]></description>
    </item>
    <item>
      <title>Gathering: </title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-1023854f433a</guid>
      <pubDate>Mon, 03 Aug 2026 13:37:48 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><button type="button" class="thumb"><img src="https://catnipgames.net/blog/images/resource-atlas-world-totals.png" data-full="https://catnipgames.net/blog/images/resource-atlas-world-totals.png" data-cap="Every resource in the game ranked by how many spots carry it, across all 221 zones that have any." alt="A bar chart ranking every resource type in the game by the number of placed nodes"></span>]]></description>
    </item>
    <item>
      <title>Tooling: New editor tests for the pet system pin the things that broke: that every taming skill a…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-b9a1f75e7478</guid>
      <pubDate>Mon, 03 Aug 2026 11:21:25 -0500</pubDate>
      <description><![CDATA[New editor tests for the pet system pin the things that broke: that every taming skill a player is meant to buy is actually offered by a trainer, and that every pet command in the command list does something when issued. Both defects this pass found were invisible to the old tests because no individual piece was wrong.]]></description>
    </item>
    <item>
      <title>Tooling: Test bots that populate a scene now walk around instead of standing in one spot. Each bot…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-cb342d6c813d</guid>
      <pubDate>Mon, 03 Aug 2026 12:49:04 -0500</pubDate>
      <description><![CDATA[Test bots that populate a scene now walk around instead of standing in one spot. Each bot is given the scene's own walkable ground, exported from the map data, and picks its way across it with real pathfinding, so it rounds corners and follows the terrain rather than sliding through walls.]]></description>
    </item>
    <item>
      <title>Tooling: Added a check that guards the data channels those bots use to appear in the world. The…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-d74dc140f97b</guid>
      <pubDate>Mon, 03 Aug 2026 12:49:10 -0500</pubDate>
      <description><![CDATA[Added a check that guards the data channels those bots use to appear in the world. The channel numbers are positions in a list, so an unrelated change elsewhere could silently shift them and leave bots invisible or under the ground. That now fails a test instead.]]></description>
    </item>
    <item>
      <title>Tooling: The walkable ground for the bots' default gathering scene is now shipped with them, so…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-7df8a26eb1bb</guid>
      <pubDate>Mon, 03 Aug 2026 13:12:04 -0500</pubDate>
      <description><![CDATA[The walkable ground for the bots' default gathering scene is now shipped with them, so they wander it for real. Running the new checks against it caught two things: long routes across a large area were being abandoned partway, and the documented channel numbers the bots publish through had quietly drifted by one.]]></description>
    </item>
    <item>
      <title>Tooling: Bots that have arrived somewhere now bow, clap, wave and dance instead of standing to…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-c0b97f0a70ac</guid>
      <pubDate>Mon, 03 Aug 2026 13:18:16 -0500</pubDate>
      <description><![CDATA[Bots that have arrived somewhere now bow, clap, wave and dance instead of standing to attention. They only do it while stopped, so nobody bows their way across a courtyard.]]></description>
    </item>
    <item>
      <title>Tooling: Bots can also speak ambient lines now, though it stays off unless asked for: a large…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-02e447631feb</guid>
      <pubDate>Mon, 03 Aug 2026 13:22:38 -0500</pubDate>
      <description><![CDATA[Bots can also speak ambient lines now, though it stays off unless asked for: a large group talking would bury the local channel for anyone standing nearby.]]></description>
    </item>
    <item>
      <title>Tooling: Ran the bots against a real server for the first time, which found three things reading…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-e9a6dec888e7</guid>
      <pubDate>Mon, 03 Aug 2026 13:59:51 -0500</pubDate>
      <description><![CDATA[Ran the bots against a real server for the first time, which found three things reading the code had not. Their path smoothing was inverted, so every route was about twice as long as it needed to be and bots minced instead of walking. The setting meant to keep a group together was being ignored on any large map. And a message the server sends back on arrival was going unhandled.]]></description>
    </item>
    <item>
      <title>Skills: Unlearning a skill now returns all of its experience to your pool. It used to return half…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-91488f172bd2</guid>
      <pubDate>Mon, 03 Aug 2026 11:30:45 -0500</pubDate>
      <description><![CDATA[Unlearning a skill now returns all of its experience to your pool. It used to return half for most schools and everything for Air, Fire and Bard, a split left over from old school reworks that was never explained anywhere in game: walking away from a specialization at level 80 destroyed 1,801,380 experience in one school and nothing in another. Unlearning speed is unchanged, so switching builds still costs the same play time, and unlearn items still do it instantly.]]></description>
    </item>
    <item>
      <title>Skills: The Skills window shows the experience numbers it always had and never printed. Hovering…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-ec8367f63ea0</guid>
      <pubDate>Mon, 03 Aug 2026 11:44:10 -0500</pubDate>
      <description><![CDATA[The Skills window shows the experience numbers it always had and never printed. Hovering a skill gives the experience in it, what the next level wants, what unlearning would return, and how far it moved this session; hovering a school sigil gives that school levels and experience. The header shows both experience pools at once instead of only the tab you are on. A new Interface option, Show Skill Experience Numbers, turns the figures off for anyone who would rather not read them.]]></description>
    </item>
    <item>
      <title>Skills: A skill set to unlearning now reports what it is losing each time you earn experience…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-b846f953f569</guid>
      <pubDate>Mon, 03 Aug 2026 11:44:16 -0500</pubDate>
      <description><![CDATA[A skill set to unlearning now reports what it is losing each time you earn experience, and about how many more experience gains it needs to reach its lowest level. The estimate is in experience gains rather than minutes because the drain ticks on each award rather than on a clock.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote down why the editor cannot connect to the test shard: the old fallback ports were…</title>
      <link>https://catnipgames.net/blog/</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-03-d0d65a6185e0</guid>
      <pubDate>Mon, 03 Aug 2026 15:23:49 -0500</pubDate>
      <description><![CDATA[Wrote down why the editor cannot connect to the test shard: the old fallback ports were retired in July and the replacement network stack is compiled out of a plain editor build. The port reference still described only the old scheme, so it now carries a warning and a pointer to the current one.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-08-02</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-headlines</guid>
      <pubDate>Sun, 02 Aug 2026 19:56:44 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Nightly chaos release is building again after two empty nights. The Linux build machine was crashing in its graphics driver; the build editor is back on OpenGL while the shipped client keeps Vulkan.</li>
        <li>The Theme Editor has a real colour picker now: click any swatch, drag, and watch the interface change under the cursor.</li>
        <li>Tester reports were going unread overnight. The nightly pass that reads them shared a lock with a job running every fifteen minutes and started on the same quarter hour, so it lost the race and skipped the night while reporting success. It now waits for the lock, starts off the quarter hour, and runs again four hours later.</li>
        <li>Two new window looks, <b>Citadel</b> and <b>Bastion</b>: carved wood and metal, pick either one in Options under Themes.</li>
        <li><b>A container holding a big saved decoration layout</b> would open empty and stay that way. One oversized item made the whole container unreadable, and the same flaw sat under mail, bank, lot contents and the friends list.</li>
        <li>A tester spotted that our report automation was only reading his most recent comment on each task. He was right, and the marker that records a report as handled then hid the rest for good. 96 skipped comments across 56 tasks have been read and answered, eight of which held real findings nobody had seen.</li>
        <li>A day on the new bug reports: <b>twenty-four interface bugs</b> came in from testers and the in-game Oracle in twenty-four hours, and most of them turned out to be four shared faults wearing different hats.</li>
        <li><b>Untouchable wolves.</b> A creature that could not finish walking back to its spawn point stayed invulnerable and deaf to attacks for good. That walk now times out.</li>
        <li><b>Italian filled back in.</b> 458 interface strings had never been translated, so those windows fell back to English for anyone playing in Italian. All 458 are done and the language is back to 99.5 percent.</li>
        <li>The <b>Chaotic Clone</b> stops giving itself away when it moves: its fighting stance now follows the caster instead of the pet AI, which counted running back to you as leaving combat.</li>
        <li><b>Tamer rebalance.</b> The taming tree splits in two, five innates go to 4x experience, and Pet Speed, Strength and Taunting Training become pet commands you cast rather than passives you forget. Only two run at once, each costs the pet something, and letting the taunt lapse sends the fight at you. DO NOT PANIC! (just experimenting)</li>
        <li>Tracked down the avatar that <b>stops dead while you hold the forward key</b>: one shared speed value, three separate copies of the latch that decides when to move it, and a spell cast writing the speed behind all of them.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Bug Fixes: A wall switch on the castle gates in Castle Atos put an error in the client log for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-0ddebe11065b</guid>
      <pubDate>Sun, 02 Aug 2026 01:42:45 -0500</pubDate>
      <description><![CDATA[A wall switch on the castle gates in Castle Atos put an error in the client log for everyone who walked into the scene, without anyone touching it. The switch was set to open a door but pointed at a group of holiday decorations, which has no door on it. Using the switch also turned those decorations off, which was never the intent. It now pulls its handle and does nothing else.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Switches now report a setup problem once instead of every few seconds. A switch that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-183064d41a48</guid>
      <pubDate>Sun, 02 Aug 2026 01:42:45 -0500</pubDate>
      <description><![CDATA[Switches now report a setup problem once instead of every few seconds. A switch that cannot run one of its actions disables itself, and the code driving it kept going and tried to start new work on the now-disabled object, so the pair of errors repeated every time the server sent that switch a state update. The failure is recorded once and the switch stops being driven.]]></description>
    </item>
    <item>
      <title>Bug Fixes: The wall switch template that new switches are placed from shipped with open-door and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-8cc50b146636</guid>
      <pubDate>Sun, 02 Aug 2026 01:42:45 -0500</pubDate>
      <description><![CDATA[The wall switch template that new switches are placed from shipped with open-door and close-door actions pointing at nothing, so any switch built from it without a door wired in hit the same failure the first time it ran. Both actions are now blank.]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed 6 tracker entries: skill-balance asks for Blind, Tactics…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-ff830291b9fb</guid>
      <pubDate>Sun, 02 Aug 2026 03:22:17 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed 6 tracker entries: skill-balance asks for Blind, Tactics Healthy/Train Strength, and Heavy Armor's Provoking Shout/Taunt; a monthly-replenish request for LB birthday cakes and fireworks boxes; a bundled wishlist from a player covering an aggro meter and a Tinkering crafting tree; and a bug blocking wall/ceiling deco placement in the Stone Dungeon Rotunda.]]></description>
    </item>
    <item>
      <title>Community: Cleared the tester report backlog by hand while the nightly was down: fifteen reports…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-8f37ad0bd211</guid>
      <pubDate>Sun, 02 Aug 2026 09:09:35 -0500</pubDate>
      <description><![CDATA[Cleared the tester report backlog by hand while the nightly was down: fifteen reports read, ten acted on. Nine new bugs went on the tracker, one closed issue reopened, one report added to an issue already open, and one tester suggestion went to the wishlist.]]></description>
    </item>
    <item>
      <title>Community: What testers found this round: claiming a lot from its sign fails on the first attempt…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-5d15e8ce6ba1</guid>
      <pubDate>Sun, 02 Aug 2026 09:09:35 -0500</pubDate>
      <description><![CDATA[What testers found this round: claiming a lot from its sign fails on the first attempt and works on the second, every time; the crafted decoration layout item cannot be named, reopened or applied once a layout is recorded on it; Use lot storage stays selectable at crafting stations that are not on your lot; clicking through a creature name plate does not reach a harvestable behind it; and a handful of interface strings are still English with Italian selected.]]></description>
    </item>
    <item>
      <title>Community: Five reports were held for a decision rather than acted on, because a FAIL is not always…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-22d251c31a7d</guid>
      <pubDate>Sun, 02 Aug 2026 09:09:35 -0500</pubDate>
      <description><![CDATA[Five reports were held for a decision rather than acted on, because a FAIL is not always a failure. Two are checks the tester could not exercise, one is a checklist that describes something the game does not do, one is blocked on other work, and the oldest has been waiting eleven days as a design objection to event trophies being no-trade rather than a test result.]]></description>
    </item>
    <item>
      <title>Community: A tester noticed the automation was only answering his most recent comment on a task and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-838d30fb0214</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[A tester noticed the automation was only answering his most recent comment on a task and ignoring the rest. He was right. The tool that collects tester reports handed over just the newest comment, so when someone posted a checklist and then a follow-up a couple of minutes later, only the follow-up was read.]]></description>
    </item>
    <item>
      <title>Community: The second half was worse. The marker that records a report as handled names one comment…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a24c70711eed</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[The second half was worse. The marker that records a report as handled names one comment, so answering the follow-up made the whole task look done and the checklist underneath became invisible to every later run. On one task that meant replying "please run through the Expected list" to a tester who had posted that list two minutes earlier.]]></description>
    </item>
    <item>
      <title>Community: A sweep of all 873 tasks in the project found 96 comments that were never marked as read…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-495970e47ea5</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[A sweep of all 873 tasks in the project found 96 comments that were never marked as read, across 56 tasks, 49 of them carrying PASS or FAIL lines. Every one has now been read and answered on its task.]]></description>
    </item>
    <item>
      <title>Community: Most of those turned out to have reached the tracker anyway, because whoever triaged them…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-219045207a72</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[Most of those turned out to have reached the tracker anyway, because whoever triaged them at the time read the task rather than trusting the tool. Eight did not, and those were real: kobold archers in three locations using a genteel voice instead of a growl, an entire scene where creatures never leave their spawn points and no pet or summon can be called, dungeon map reveals clearing on relog, and merchant items not coming back to your inventory when you cancel a sale.]]></description>
    </item>
    <item>
      <title>Community: Two of the replies that went out had told testers their checks "were not reported" when…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-2db15dcd52a2</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[Two of the replies that went out had told testers their checks "were not reported" when they had been reported, in the comment that was skipped. Both tasks have been corrected and the results recorded as the passes they were.]]></description>
    </item>
    <item>
      <title>Build: The nightly chaos release failed two nights running and produced nothing. The Linux…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-9a573df3d1c9</guid>
      <pubDate>Sun, 02 Aug 2026 05:16:18 -0500</pubDate>
      <description><![CDATA[The nightly chaos release failed two nights running and produced nothing. The Linux client build was crashing inside the graphics driver on the build machine, and because the release cancels every platform the moment one leg fails, the Windows build was stopped before it ever compiled.]]></description>
    </item>
    <item>
      <title>Build: The trigger was the change that moved the Linux client to Vulkan. On Linux the editor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-4be5e4c39653</guid>
      <pubDate>Sun, 02 Aug 2026 05:16:19 -0500</pubDate>
      <description><![CDATA[The trigger was the change that moved the Linux client to Vulkan. On Linux the editor picks its graphics backend from the same list the shipped game uses, so pointing players at Vulkan also pointed the build machine at it, and that machine faults there. Build machines now run the editor on OpenGL. The shipped Linux client keeps Vulkan.]]></description>
    </item>
    <item>
      <title>Build: The client that comes out the other end is unchanged. Asset bundles still carry shader…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-4bd9f7ee3c50</guid>
      <pubDate>Sun, 02 Aug 2026 05:16:19 -0500</pubDate>
      <description><![CDATA[The client that comes out the other end is unchanged. Asset bundles still carry shader variants for both backends, 403 of each, and the last passing build before the outage had used exactly this setup.]]></description>
    </item>
    <item>
      <title>Build: Two separate driver faults turned up while narrowing it down: one on the threaded render…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-8461860f2614</guid>
      <pubDate>Sun, 02 Aug 2026 05:16:19 -0500</pubDate>
      <description><![CDATA[Two separate driver faults turned up while narrowing it down: one on the threaded render worker during the player build, one uploading a texture array during the asset bundle pass. Basic Vulkan works fine on that machine, and giving its display a fake attached monitor changed nothing, so both are filed with repro steps for a maintenance window.]]></description>
    </item>
    <item>
      <title>Build: The profiler client build no longer runs on a nightly schedule. It is a large download…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-6de4a728115c</guid>
      <pubDate>Sun, 02 Aug 2026 07:27:17 -0500</pubDate>
      <description><![CDATA[The profiler client build no longer runs on a nightly schedule. It is a large download for a specific job, on a machine that is often disconnected, so it now builds on request instead of every night.]]></description>
    </item>
    <item>
      <title>Client: The Windows client now runs on DirectX 11 for everyone, and DirectX 12 is gone. DirectX…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-db0006715d61</guid>
      <pubDate>Sun, 02 Aug 2026 07:27:16 -0500</pubDate>
      <description><![CDATA[The Windows client now runs on DirectX 11 for everyone, and DirectX 12 is gone. DirectX 11 has been the default for new installs since mid-July, so most people are already on it and will not notice. It also stays the version that works under Linux compatibility layers.]]></description>
    </item>
    <item>
      <title>Client: Two ways to end up on DirectX 12 are now closed: the launcher Graphics dropdown, which is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-af6c567c61d8</guid>
      <pubDate>Sun, 02 Aug 2026 07:27:16 -0500</pubDate>
      <description><![CDATA[Two ways to end up on DirectX 12 are now closed: the launcher Graphics dropdown, which is hidden on Windows since there is nothing left to pick, and the game's own preference order, which applied to anyone starting the game without the launcher. An old saved DirectX 12 choice needs no action and will start on 11.]]></description>
    </item>
    <item>
      <title>UI: The UI Scale slider in Options, Themes tab now applies when you release the mouse instead…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-437cdac717ce</guid>
      <pubDate>Sun, 02 Aug 2026 07:28:33 -0500</pubDate>
      <description><![CDATA[The <strong>UI Scale</strong> slider in Options, Themes tab now applies when you release the mouse instead of on every frame of the drag. Applying it live resized the Options window under the pointer, which moved the handle away from the mouse and sent the value bouncing. The percentage readout still tracks the drag, and arrow keys on a focused slider apply right away.]]></description>
    </item>
    <item>
      <title>UI: Drop-down lists now keep a solid backing at any window transparency setting. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-49eff8acc278</guid>
      <pubDate>Sun, 02 Aug 2026 08:07:31 -0500</pubDate>
      <description><![CDATA[Drop-down lists now keep a solid backing at any window transparency setting. The transparency slider was thinning the list plate along with the windows, so at the low end a drop-down opened as floating text over whatever was behind it. Windows still fade as before; the list keeps the density its theme authored, and it now wears the same bracket frame as the other floating panels.]]></description>
    </item>
    <item>
      <title>UI: Theme Editor label fixes: the "Ambient motion" and "Search" labels were having their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-ac7c58ef7cf4</guid>
      <pubDate>Sun, 02 Aug 2026 08:07:40 -0500</pubDate>
      <description><![CDATA[Theme Editor label fixes: the "Ambient motion" and "Search" labels were having their bottoms clipped by a fixed row height, and the Advanced tab search box could be squeezed to a few pixels wide on a narrow window. Both labels now size to their text, and the toolbar buttons drop to their own line instead of crowding the field.]]></description>
    </item>
    <item>
      <title>UI: The Theme Editor got a colour picker. Every colour swatch in it is now a button that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a5dccc7844c9</guid>
      <pubDate>Sun, 02 Aug 2026 08:25:30 -0500</pubDate>
      <description><![CDATA[The Theme Editor got a colour picker. Every colour swatch in it is now a button that opens a saturation and brightness square with a hue bar, a transparency bar on the Advanced tab, and the hex box still there for anyone who prefers typing a code. Colours apply while you drag, so the interface re-themes under the cursor.]]></description>
    </item>
    <item>
      <title>UI: Gave the UI Toolkit window title bar its own art slot, so a theme can draw a dedicated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-64bf854cc996</guid>
      <pubDate>Sun, 02 Aug 2026 08:36:48 -0500</pubDate>
      <description><![CDATA[Gave the UI Toolkit window title bar its own art slot, so a theme can draw a dedicated top bar rather than leaning on the window frame's top edge. The slot ships empty, so every current theme looks exactly as it did.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Theme Editor turning up empty. The data file that carries the skins, backing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-6632ca4c0efe</guid>
      <pubDate>Sun, 02 Aug 2026 08:42:20 -0500</pubDate>
      <description><![CDATA[Fixed the Theme Editor turning up empty. The data file that carries the skins, backing patterns, ornaments and fonts is loaded a few seconds into a session, and if that one load came up empty the game gave up on it until you restarted, so the editor offered nothing and read every colour as white. The load retries now, and the editor refills its lists if the data arrives after you opened it.]]></description>
    </item>
    <item>
      <title>UI: Added two new window looks, Citadel and Bastion , both carved wood with metal corner…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a58abcce5d55</guid>
      <pubDate>Sun, 02 Aug 2026 09:25:12 -0500</pubDate>
      <description><![CDATA[Added two new window looks, <b>Citadel</b> and <b>Bastion</b>, both carved wood with metal corner pieces. Citadel runs a lion-head title bar across the top of each window and Bastion leaves it plain. Both are in Options under Themes.]]></description>
    </item>
    <item>
      <title>UI: The wooden frame art arrived with its window interior painted solid, which would have…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-c1380dd6ceca</guid>
      <pubDate>Sun, 02 Aug 2026 09:25:18 -0500</pubDate>
      <description><![CDATA[The wooden frame art arrived with its window interior painted solid, which would have left the window opacity slider doing nothing on that look. The interior is now cut out during art prep, so the slider works there the same as everywhere else.]]></description>
    </item>
    <item>
      <title>UI: Opening a doll cabinet, mannequin, jukebox or automated phonograph a second time did…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-88a9d94d7622</guid>
      <pubDate>Sun, 02 Aug 2026 11:04:06 -0500</pubDate>
      <description><![CDATA[Opening a doll cabinet, mannequin, jukebox or automated phonograph a second time did nothing until you changed zones. The window was still being tracked from the first time, and the code that hands one back only ran when it was creating a fresh one, so the second request got nothing at all.]]></description>
    </item>
    <item>
      <title>UI: That same gap explains two more phonograph reports: the wax cylinder limit was never…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-74076ffd259b</guid>
      <pubDate>Sun, 02 Aug 2026 11:04:14 -0500</pubDate>
      <description><![CDATA[That same gap explains two more phonograph reports: the wax cylinder limit was never re-read, so a reopened phonograph insisted it could hold none at all, and its window had no way to close other than its own range check, so anything else that ended the interaction left it on screen.]]></description>
    </item>
    <item>
      <title>UI: Selecting a recipe at a crafting station and then re-sorting the list kept the same row…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-b6961f57b734</guid>
      <pubDate>Sun, 02 Aug 2026 11:04:57 -0500</pubDate>
      <description><![CDATA[Selecting a recipe at a crafting station and then re-sorting the list kept the same row highlighted rather than the same recipe. That was worse than it looked: Craft and Queue read the selected row, so they acted on whichever recipe had slid into that slot. Every list built on the shared roster keeps its selection on the row now.]]></description>
    </item>
    <item>
      <title>UI: Vendor search results were shifted one column to the left: the date an item was listed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-ceed59618294</guid>
      <pubDate>Sun, 02 Aug 2026 11:05:06 -0500</pubDate>
      <description><![CDATA[Vendor search results were shifted one column to the left: the date an item was listed appeared under Item Name, Time showed the weight, and Location was empty. The row builder was skipping the widest column when filling cells but the table was still drawing it.]]></description>
    </item>
    <item>
      <title>UI: Adding a player to a lot access or banned list needed two quick presses of Enter. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-ac7c87fe78b6</guid>
      <pubDate>Sun, 02 Aug 2026 11:05:54 -0500</pubDate>
      <description><![CDATA[Adding a player to a lot access or banned list needed two quick presses of Enter. The text box was taking the first press as "stop editing" before the window ever saw it. Sixteen other text boxes had the same wiring and are fixed with it, including item search, rename, pick quantity and the chat tab options.]]></description>
    </item>
    <item>
      <title>UI: Turning on the health and focus numbers squashed the two bars together and clipped the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-43780f558a78</guid>
      <pubDate>Sun, 02 Aug 2026 11:07:51 -0500</pubDate>
      <description><![CDATA[Turning on the health and focus numbers squashed the two bars together and clipped the digits. The numbers sit outside the normal layout flow, so the rows only ever reserved the height of the bar itself and the focus bar painted over the health figures. The rows now make room while the numbers are on.]]></description>
    </item>
    <item>
      <title>UI: Clicking through a creature nameplate to a tree behind it did nothing, even though…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-204615c43238</guid>
      <pubDate>Sun, 02 Aug 2026 11:07:51 -0500</pubDate>
      <description><![CDATA[Clicking through a creature nameplate to a tree behind it did nothing, even though hovering showed the harvest cursor. The plate was taking the press before the world ever saw it, which also skipped double-click detection, and harvesting is a double-click. A plate over open sky still targets what it names.]]></description>
    </item>
    <item>
      <title>UI: Empty equipment slots on the character sheet showed no slot name, only a silhouette, with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-6c74ff019c39</guid>
      <pubDate>Sun, 02 Aug 2026 11:08:02 -0500</pubDate>
      <description><![CDATA[Empty equipment slots on the character sheet showed no slot name, only a silhouette, with the word available on hover. The name is back as a caption across the bottom of the slot art.]]></description>
    </item>
    <item>
      <title>UI: Your own inventory window and an unnamed crafted backpack were both titled "Backpack" and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-55add48b39ce</guid>
      <pubDate>Sun, 02 Aug 2026 11:08:02 -0500</pubDate>
      <description><![CDATA[Your own inventory window and an unnamed crafted backpack were both titled "Backpack" and could not be told apart with both open. Yours now reads "Your Backpack". An NPC dialogue window could also lose its typing box entirely at narrow widths; the box has a minimum size now.]]></description>
    </item>
    <item>
      <title>UI: Merchant window: the Exchange list now empties whenever the window closes. Cancelling a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a35117b07bde</guid>
      <pubDate>Sun, 02 Aug 2026 12:01:04 -0500</pubDate>
      <description><![CDATA[Merchant window: the Exchange list now empties whenever the window closes. Cancelling a sale used to leave the items sitting in the Exchange, so the next merchant you talked to opened with your old proposal still in it, and the items looked like they had never returned to your backpack. Nothing was ever removed from the backpack while items sat there, so no items were lost.]]></description>
    </item>
    <item>
      <title>UI: Right-dragging to swing the camera no longer opens a menu when the drag starts on a name…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-ec043075caba</guid>
      <pubDate>Sun, 02 Aug 2026 12:23:54 -0500</pubDate>
      <description><![CDATA[Right-dragging to swing the camera no longer opens a menu when the drag starts on a name plate. Your own name and health bar sit over the middle of the screen, which is where the swing starts, so the menu opened and the camera did not turn. The plate menu now waits for the button to come up and only opens if the press was a click rather than a swing.]]></description>
    </item>
    <item>
      <title>UI: Typing a slash command with the chat window closed no longer sets off game keys on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-d99ce5f169b8</guid>
      <pubDate>Sun, 02 Aug 2026 12:36:07 -0500</pubDate>
      <description><![CDATA[Typing a slash command with the chat window closed no longer sets off game keys on the way in. The window has to open before its text box can take the keyboard, and until it did, the letters were still being read as key binds, so typing /oracle opened the emote list in passing. Chat now holds the keyboard from the key that opened it until the box is ready, and hands it back if the box never gets there.]]></description>
    </item>
    <item>
      <title>UI: The panel that slides out beside a skill icon when a skill goes up or down is now a size…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-3b0086edf8db</guid>
      <pubDate>Sun, 02 Aug 2026 12:54:40 -0500</pubDate>
      <description><![CDATA[The panel that slides out beside a skill icon when a skill goes up or down is now a size larger, bold, and drawn with a thin black rim, which is what the count beside the icon already had. Thin unrimmed text washed out against bright ground. The panel is the same size and in the same place, so the icons still line up in a column, and a test now holds the text size against the panel it has to fit in.]]></description>
    </item>
    <item>
      <title>UI: New keybind: Close Loot Windows. It shuts every loot window you have open and leaves…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-99276af3d634</guid>
      <pubDate>Sun, 02 Aug 2026 13:00:58 -0500</pubDate>
      <description><![CDATA[New keybind: Close Loot Windows. It shuts every loot window you have open and leaves everything else where it is, which is what Escape does not do. It starts with no key on it, so pick one in Options under Key Bindings; jump is the key it was asked for. Loot means a corpse, a world chest or a dropped container, the same set the take-everything key already works on.]]></description>
    </item>
    <item>
      <title>UI: Dungeon Piece window: the three lines under Dungeon Point Limits were printing on top of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a3c3807bd46a</guid>
      <pubDate>Sun, 02 Aug 2026 13:10:47 -0500</pubDate>
      <description><![CDATA[Dungeon Piece window: the three lines under Dungeon Point Limits were printing on top of each other with the Upgrade Limit button over the last one. Each line now keeps a full line of height to itself. The rows are built while that panel is hidden, and nothing was holding their height up until it opened. Long captions shorten with an ellipsis rather than wrapping, and the numbers on the right are never the part that gets cut.]]></description>
    </item>
    <item>
      <title>UI: Letter tails are back in list rows. The bottom of every p, y, g, j and q was being cut…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-d5a612d8543e</guid>
      <pubDate>Sun, 02 Aug 2026 14:01:06 -0500</pubDate>
      <description><![CDATA[Letter tails are back in list rows. The bottom of every p, y, g, j and q was being cut off flat in the teleport list, the verification window, the backpack, mail and the roster. Rows clip their text so long entries can end in an ellipsis, and the box they clip to was sized from the font's idea of a line, which is a fraction of a pixel shorter than the line actually drawn. That fraction is at the bottom, where the tails are. The box is now measured against what gets drawn, at every text size. Nothing else moved.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-de0b3056b0d4</guid>
      <pubDate>Sun, 02 Aug 2026 08:25:37 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/theme-editor-color-picker.png" data-full="https://catnipgames.net/blog/images/theme-editor-color-picker.png" data-cap="The Theme Editor colour picker, open on the Accent swatch." alt="Theme Editor with the colour picker open"></span>]]></description>
    </item>
    <item>
      <title>Tooling: The nightly pass that reads tester reports had gone two nights without doing anything. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-942bfd1e861f</guid>
      <pubDate>Sun, 02 Aug 2026 09:09:19 -0500</pubDate>
      <description><![CDATA[The nightly pass that reads tester reports had gone two nights without doing anything. It shares a single lock with the verify sweep that runs every fifteen minutes, so the two can never act on the same report at once, and its start time sat on the same quarter hour that sweep ticks on. They raced for the lock every night. Last night it lost by four seconds, exited with a success code, and skipped the night.]]></description>
    </item>
    <item>
      <title>Tooling: The nightly now waits up to ten minutes for that lock instead of giving up on it, and it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-922659e80e43</guid>
      <pubDate>Sun, 02 Aug 2026 09:09:19 -0500</pubDate>
      <description><![CDATA[The nightly now waits up to ten minutes for that lock instead of giving up on it, and it checks twice, because the report scan between the two checks takes minutes on its own. Its start time moved off the quarter hour, and a second run four hours later picks up anything the first one misses.]]></description>
    </item>
    <item>
      <title>Tooling: Every run now writes a line to its log before it can fail. A missing line means the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-d7531ed9196a</guid>
      <pubDate>Sun, 02 Aug 2026 09:09:19 -0500</pubDate>
      <description><![CDATA[Every run now writes a line to its log before it can fail. A missing line means the schedule never fired, which previously could not be told apart from a run that died before it logged anything. Errors carry their message into the same log, and the run's own summary is written there too, so one file answers whether last night did any work.]]></description>
    </item>
    <item>
      <title>Tooling: The collector now hands over every unread comment on a task as one report, oldest first…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-f6aec19b3d07</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[The collector now hands over every unread comment on a task as one report, oldest first, and writes a separate handled marker for each so a partial answer cannot bury the rest. The skill that does the judging carries the rule and guidance for reading a report split across several posts.]]></description>
    </item>
    <item>
      <title>Tooling: New supersede sweep for stale tasks. When a fix is revised and a second verify task is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-d85e064b1bd6</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[New supersede sweep for stale tasks. When a fix is revised and a second verify task is filed, the first one sits there asking testers to check a build that no longer behaves that way. The sweep links the old task to the new one, notes where the work moved, and closes it. Nothing is deleted, so a wrong pair costs a reopen.]]></description>
    </item>
    <item>
      <title>Tooling: Building it turned up its own trap worth recording: two bugs filed from one tester report…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-503997e39674</guid>
      <pubDate>Sun, 02 Aug 2026 11:01:29 -0500</pubDate>
      <description><![CDATA[Building it turned up its own trap worth recording: two bugs filed from one tester report are linked to each other, and treating that link as "these are the same bug" would have closed a live bug filed an hour earlier. The sweep now only treats two tasks as the same when they name the same issue directly.]]></description>
    </item>
    <item>
      <title>Inventory: A container holding a large saved decoration layout would open empty and answer with an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-5254c091e98f</guid>
      <pubDate>Sun, 02 Aug 2026 10:33:21 -0500</pubDate>
      <description><![CDATA[A container holding a large saved decoration layout would open empty and answer with an error. A layout saved from a lot with a couple of hundred decorations on it was too big for the container listing to carry, and one such item made the whole container unreadable for good. Containers of any size now read normally, and the same fix covers mail, bank listings, lot contents and the friends list.]]></description>
    </item>
    <item>
      <title>Inventory: Consolidate Stacks now works on a stack kept inside a pouch. It was sending the merge to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-d77bd05dffb8</guid>
      <pubDate>Sun, 02 Aug 2026 10:33:29 -0500</pubDate>
      <description><![CDATA[Consolidate Stacks now works on a stack kept inside a pouch. It was sending the merge to your backpack rather than to the pouch the stack was really in, so the server refused it and your inventory refreshed itself. Consolidating past the maximum stack size now merges what fits instead of failing outright.]]></description>
    </item>
    <item>
      <title>Inventory: A container that failed to refresh used to blank itself, leaving a window of items that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-58e6c54e8fbe</guid>
      <pubDate>Sun, 02 Aug 2026 10:33:29 -0500</pubDate>
      <description><![CDATA[A container that failed to refresh used to blank itself, leaving a window of items that could not be clicked or dragged. It now keeps what it had, so a hiccup costs you slightly stale contents instead of a dead window. Dropping an item onto a container in that state no longer breaks the drag.]]></description>
    </item>
    <item>
      <title>Crafting: Recipes you starred did not show up under Favorites in the recipe book contents until you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-0da4f11fef1e</guid>
      <pubDate>Sun, 02 Aug 2026 11:05:07 -0500</pubDate>
      <description><![CDATA[Recipes you starred did not show up under Favorites in the recipe book contents until you closed and reopened the book. The contents page now picks up pending stars on the way in. Obsidian Forge was also listed twice, the second entry holding only a Miscellaneous section; the single-player forge now folds into the one chapter.]]></description>
    </item>
    <item>
      <title>Crafting: Use lot storage was selectable at crafting tables that are not on your lot, anywhere in a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-af49df806783</guid>
      <pubDate>Sun, 02 Aug 2026 11:06:55 -0500</pubDate>
      <description><![CDATA[Use lot storage was selectable at crafting tables that are not on your lot, anywhere in a player-owned town, and did nothing when ticked. It was only asking whether the table stood on a lot, not whether it was a lot you may use. The reverse was true of printing presses, which were greyed out even on your own property.]]></description>
    </item>
    <item>
      <title>Crafting: Recipe rows at a crafting station overlapped each other, and at the smallest window size…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-dee454492097</guid>
      <pubDate>Sun, 02 Aug 2026 11:09:23 -0500</pubDate>
      <description><![CDATA[Recipe rows at a crafting station overlapped each other, and at the smallest window size the Durability heading and the inventory filter were cut off the right edge. Two separate sums that were wrong: a row shorter than the card it holds, and a minimum window width narrower than the three panes inside it. Both are worked out from their contents now.]]></description>
    </item>
    <item>
      <title>Housing: The lot marker window set no text heights anywhere, so on a claimed lot its rows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-3cb2ed0af220</guid>
      <pubDate>Sun, 02 Aug 2026 11:05:55 -0500</pubDate>
      <description><![CDATA[The lot marker window set no text heights anywhere, so on a claimed lot its rows collapsed and drew over each other: "claimed by" across "claim expires", the house icon across the lot size and buttons. It now sizes its rows properly, scrolls, and can be resized.]]></description>
    </item>
    <item>
      <title>Housing: List For Sale appeared to do nothing. It was sending fine, but an empty or out-of-range…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-d37273a52121</guid>
      <pubDate>Sun, 02 Aug 2026 11:06:02 -0500</pubDate>
      <description><![CDATA[List For Sale appeared to do nothing. It was sending fine, but an empty or out-of-range price only wrote its complaint into a line that had been clipped off the bottom of the window. The price box now has a label saying what belongs in it, and the refusal says so out loud. The two option buttons that drew as "..." are cogs again.]]></description>
    </item>
    <item>
      <title>Housing: Regenerated the scene server's network interface so the lot sale messages match their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-5bcc1bcb0524</guid>
      <pubDate>Sun, 02 Aug 2026 11:33:39 -0500</pubDate>
      <description><![CDATA[Regenerated the scene server's network interface so the lot sale messages match their definition again. The client's copy of that generated code was updated in the same change, so both sides send and expect the same messages, and the check that watches for generated-code drift is green again.]]></description>
    </item>
    <item>
      <title>Decorations: A crafted Decoration Layout document stayed blank after you recorded a layout onto it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-58c1f078427c</guid>
      <pubDate>Sun, 02 Aug 2026 11:06:43 -0500</pubDate>
      <description><![CDATA[A crafted Decoration Layout document stayed blank after you recorded a layout onto it. The recording reached the server, but the client never updated its own copy of the item, so the title never changed and clicking it asked for a name all over again.]]></description>
    </item>
    <item>
      <title>Decorations: Flip, roll and scale refused on any decoration with something resting on it. They were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-3185095b8360</guid>
      <pubDate>Sun, 02 Aug 2026 11:06:44 -0500</pubDate>
      <description><![CDATA[Flip, roll and scale refused on any decoration with something resting on it. They were counting the stacked item as a piece of the one you were holding. Ordinary rotate never had that restriction, and now these three match it.]]></description>
    </item>
    <item>
      <title>Decorations: The decoration layout apply-changes view had its buttons hanging off the bottom edge…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-550629c7ab98</guid>
      <pubDate>Sun, 02 Aug 2026 11:06:56 -0500</pubDate>
      <description><![CDATA[The decoration layout apply-changes view had its buttons hanging off the bottom edge. Fifth window to meet the same layout rule about a scrolling list squeezing the fixed rows around it.]]></description>
    </item>
    <item>
      <title>Localization: Chat tab names stayed English no matter what language you picked, even though the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-863421eab2e4</guid>
      <pubDate>Sun, 02 Aug 2026 11:08:43 -0500</pubDate>
      <description><![CDATA[Chat tab names stayed English no matter what language you picked, even though the translations were already in the table. The names were being flattened to plain text and then saved that way, so the first session you ever played locked them in. Existing characters heal on the next load.]]></description>
    </item>
    <item>
      <title>Localization: Two different strings were sharing one translation id, so the Options window toggle for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-f775176730f4</guid>
      <pubDate>Sun, 02 Aug 2026 11:08:44 -0500</pubDate>
      <description><![CDATA[Two different strings were sharing one translation id, so the Options window toggle for the original title screen was one translation away from reading as an unrelated scene name. Twenty-eight more strings were declared in code but had no record to translate against at all. A new test now fails the build if one id is ever given two different strings.]]></description>
    </item>
    <item>
      <title>Localization: A tester playing in Italian found several windows still coming up in English. 458 strings…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a85a121a2f27</guid>
      <pubDate>Sun, 02 Aug 2026 12:22:17 -0500</pubDate>
      <description><![CDATA[A tester playing in Italian found several windows still coming up in English. 458 strings had no Italian text at all, most of them from windows added or rebuilt since the last translation pass, and the game was falling back to English for them. All 458 are translated now: the Report Bug label, the inventory and options tabs, the decoration placement messages, decoration layouts, the deck, glyph and mail windows, book writing, the lot sale sign, six loading tips and a batch of store and recipe names. Italian is back to 99.5 percent overall, with NPC dialogue at 100.]]></description>
    </item>
    <item>
      <title>Combat: Creatures walking back to their spawn point cannot be hurt while they do it. On broken…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-b8061dcebe41</guid>
      <pubDate>Sun, 02 Aug 2026 12:00:00 -0500</pubDate>
      <description><![CDATA[Creatures walking back to their spawn point cannot be hurt while they do it. On broken ground that walk could never finish, so wolf packs in Jotungrund kept slow-walking, took no damage and ignored every attack. The walk back now gives up after a minute and puts the creature back in play.]]></description>
    </item>
    <item>
      <title>Combat: Whether a creature flies was being decided by whether its attack is a ranged one. Those…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-55e6478cd624</guid>
      <pubDate>Sun, 02 Aug 2026 14:26:02 -0500</pubDate>
      <description><![CDATA[Whether a creature flies was being decided by whether its attack is a ranged one. Those are different questions, and a flying creature with a close-range attack could only stay in the air by claiming a minimum range it did not want, which then made it back away from a target it could already hit. Creatures can now be told to stay airborne while they chase, on its own, without touching how close they will come.]]></description>
    </item>
    <item>
      <title>Combat: A Chaotic Clone now holds the same fighting stance you are holding while it moves…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-4ed659fc92fd</guid>
      <pubDate>Sun, 02 Aug 2026 15:26:51 -0500</pubDate>
      <description><![CDATA[A Chaotic Clone now holds the same fighting stance you are holding while it moves. Testers watching one run back to its caster saw it drop the stance to run and take it back the moment it arrived, weapon drawn the whole way, which picked the decoy out of the pair for anyone who waited for them to move. The stance was still on the pet AI clock, and running back to the caster counts there as leaving combat.]]></description>
    </item>
    <item>
      <title>Combat: Pet Speed, Pet Strength and Pet Taunting Training are now abilities you cast on your pet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-581e3317d837</guid>
      <pubDate>Sun, 02 Aug 2026 17:25:46 -0500</pubDate>
      <description><![CDATA[Pet Speed, Pet Strength and Pet Taunting Training are now abilities you cast on your pet instead of passive skills, replacing Frenzy. Each gives the pet something and costs it something else: Quicken trades accuracy for speed and crit, Embolden trades damage resistance for strength and crit damage, Goad trades attack speed for holding everything on the pet. Only two can run at once, charging the glyph extends the duration, and letting Goad lapse sends everything it was holding at you. Auditing this turned up that four of the five pet training passives were doing nothing at all in combat: the stats they granted were written to the owner and read by no combat code, so Pet Strength, Pet Taunting and Pet Hide Toughness Training have never affected a pet. Three are now abilities; Pet Hide Toughness is wired to the damage resistance it always claimed to give. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Combat: New taming skill, Pet Range, tethers your pet to you. Untrained it fights within about 2…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-1f61fdef89a9</guid>
      <pubDate>Sun, 02 Aug 2026 17:31:42 -0500</pubDate>
      <description><![CDATA[New taming skill, Pet Range, tethers your pet to you. Untrained it fights within about 2 meters of you, 5 meters at skill 80 and 10 meters at 150. Walk further than that during a fight and the pet breaks off and comes back, and everything it was fighting comes after you instead. Your pet also holds less of a creature attention the further it strays, so hanging back while it fights across the room no longer works. Every existing tamer starts this skill at zero, so pets will stay very close until it is trained. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Combat: Resurrect Creature now brings a pet back in better shape the higher the skill: about 10…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-0878262d74c1</guid>
      <pubDate>Sun, 02 Aug 2026 17:37:13 -0500</pubDate>
      <description><![CDATA[Resurrect Creature now brings a pet back in better shape the higher the skill: about 10 percent health at skill 1, 50 percent at 80 and 75 percent at 100, where before every pet came back at a flat 20 percent no matter how good the tamer was. The summon cooldown now comes from Summoning instead of the retired Refresh skill: 120 seconds at Summoning 20, 10 seconds at 80 and 3 seconds at 150, and it never reaches zero the way Refresh did at level 120. Experience spent in Frenzy and Refresh comes back to your unspent adventurer pool on next login. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Interface: The weight in the over-encumbrance popover was always yellow, while the character sheet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-e8884d0aeea6</guid>
      <pubDate>Sun, 02 Aug 2026 12:07:42 -0500</pubDate>
      <description><![CDATA[The weight in the over-encumbrance popover was always yellow, while the character sheet turned the same number red past twice your capacity. Both readouts now use the same colour bands. The popover also stopped printing a "You" heading over lines nobody else could have applied.]]></description>
    </item>
    <item>
      <title>Interface: Search All My Stuff could get stuck. The window turns its Search button off while a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-e2f4d7352894</guid>
      <pubDate>Sun, 02 Aug 2026 12:40:58 -0500</pubDate>
      <description><![CDATA[Search All My Stuff could get stuck. The window turns its Search button off while a search runs and back on when it finishes, but a search lost on the way out never finished, so the button stayed off and the line stayed on "Searching..." until you changed zone. It now gives up after thirty seconds, says so, and lets you search again.]]></description>
    </item>
    <item>
      <title>Interface: Escape now closes an open menu before it closes anything else. Opening the Skills…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-94a8061cd48e</guid>
      <pubDate>Sun, 02 Aug 2026 12:47:40 -0500</pubDate>
      <description><![CDATA[Escape now closes an open menu before it closes anything else. Opening the Skills window's Options menu and pressing Escape used to close the window and leave the menu sitting there with nothing under it. This covers every right-click menu and every window Options menu, not just that one.]]></description>
    </item>
    <item>
      <title>Interface: The Linked Equipment strip in Edit Deck now names a piece when you hover it, and says so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-a47ac715b1da</guid>
      <pubDate>Sun, 02 Aug 2026 12:53:56 -0500</pubDate>
      <description><![CDATA[The Linked Equipment strip in Edit Deck now names a piece when you hover it, and says so when you hover the red box of one you are not carrying. Both had hover text written for them, drawn by a mechanism that never reached the screen. The strip also keeps up while the window is open, so getting rid of a linked piece turns its icon red straight away instead of only after a close and reopen, and the two ring slots now sit next to each other.]]></description>
    </item>
    <item>
      <title>Interface: Pinning a window is meant to make it immune to Escape, and one of the two things Escape…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-132d4f9edaec</guid>
      <pubDate>Sun, 02 Aug 2026 13:00:13 -0500</pubDate>
      <description><![CDATA[Pinning a window is meant to make it immune to Escape, and one of the two things Escape does was not checking the pin. That one closes everything it is allowed to in a single press, so closing a loot window with Escape took a pinned character sheet with it. Pinned windows now stay put.]]></description>
    </item>
    <item>
      <title>Maps: Dungeon map bake: a large prop standing on the floor is a hole in the walkable surface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-71b0beaeccd8</guid>
      <pubDate>Sun, 02 Aug 2026 12:08:39 -0500</pubDate>
      <description><![CDATA[Dungeon map bake: a large prop standing on the floor is a hole in the walkable surface, and the bake was turning that hole into a dark square punched through the map floor. Enclosed pockets up to 16 square metres now fill back in, which covers furniture and statuary while leaving a pit or an interior courtyard open. Four tests pin the limit in both directions. The shipped maps carry the change once the dungeon fleet is rebaked.]]></description>
    </item>
    <item>
      <title>Gathering: The dirt piles in Tanglemire came back as craters. A harvested node is meant to return to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-e72b8a2a3e2a</guid>
      <pubDate>Sun, 02 Aug 2026 12:32:30 -0500</pubDate>
      <description><![CDATA[The dirt piles in Tanglemire came back as craters. A harvested node is meant to return to its untouched look when it becomes gatherable again, but two parts of the code disagreed about which of a node's looks counted as the resting one, and the half that rebuilds a node with no saved state picked the worked-out one. Both halves now agree, so a node that can be gathered again looks like it.]]></description>
    </item>
    <item>
      <title>Audio: Two NPC voices were re-cast. Scholar Vivienne Grava was speaking with a man's voice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-202f6c278dd6</guid>
      <pubDate>Sun, 02 Aug 2026 13:56:02 -0500</pubDate>
      <description><![CDATA[Two NPC voices were re-cast. Scholar Vivienne Grava was speaking with a man's voice because her character record said male, which is what the voice is picked from; the record is corrected and she has a suitable voice. Edvard the Wanderer was reported as sounding too young, and the look at it found something bigger: his seven separate conversations had each been given a different voice, so he changed voice between Solace Bridge, Highvale and Blood River. All seven now use one older, gravelly voice.]]></description>
    </item>
    <item>
      <title>Audio: A character whose name is also an ordinary word was losing NPC voice on lines that had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-cf50841380e2</guid>
      <pubDate>Sun, 02 Aug 2026 14:13:43 -0500</pubDate>
      <description><![CDATA[A character whose name is also an ordinary word was losing NPC voice on lines that had nothing to do with them. Spoken lines have the player's name swapped for the word the voice was recorded with, so the line still matches its recording, but that swap was being applied to every line rather than only the ones that name you. A character called Hero heard silence on "You are no hero yet." and one called Rose lost the lines about roses. Lines that never name you are now left alone.]]></description>
    </item>
    <item>
      <title>Quests: Ten lines of NPC dialogue named a gesture that does not exist, so the character said the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-f9842c43aa90</guid>
      <pubDate>Sun, 02 Aug 2026 14:07:38 -0500</pubDate>
      <description><![CDATA[Ten lines of NPC dialogue named a gesture that does not exist, so the character said the line and stood still. The names were near misses: a trailing full stop, a short form, an old name. Neese DelaRaven reads her paper again, Rykesh waves goodbye, the students of Courage and Truth salute, and three taunts land. Eight more lines the checker had flagged turned out to be fine: the Oracle uses that same field to mark which virtue you chose, so the checker now leaves those alone.]]></description>
    </item>
    <item>
      <title>World: Kingsport townspeople call out to each other again. Fifteen exchanges were addressed to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-b5715528df63</guid>
      <pubDate>Sun, 02 Aug 2026 14:11:39 -0500</pubDate>
      <description><![CDATA[Kingsport townspeople call out to each other again. Fifteen exchanges were addressed to names nobody in town answers to, written the old way round, so neither side ever spoke and you would never have known the conversation existed. Eight pairs are back: Harry and Powell the Guard, Innkeeper Abbott and Guyon the Bard, Justin and Julia the Alchemist, Marian and Jeremy the Tailor, Martin and Nahche the Farmer. No lines were written or reworded, they were being handed to the wrong name.]]></description>
    </item>
    <item>
      <title>Balance: Split the Taming skill tree into two branches under Tame Creature: Collar Recovery holds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-f572904bbc25</guid>
      <pubDate>Sun, 02 Aug 2026 17:00:25 -0500</pubDate>
      <description><![CDATA[Split the Taming skill tree into two branches under Tame Creature: Collar Recovery holds Heal and Resurrect, and Summoning holds the three pet trainings, Taming Specialization and Combat Training, with Precision and Hide Toughness below it. Tame Creature, Summoning, Combat Training, Pet Attack Precision Training and Pet Hide Toughness Training now cost 4x experience per level instead of 1x, matching the Focus tree, whose equivalent pet innates have been 4x since they shipped. Existing skill levels are untouched; only the next level costs more. Frenzy and Refresh are retired. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Balance: Rebanded all 178 tameable creatures onto seven summoning tiers, needing Summoning 1, 30…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-df8df641d150</guid>
      <pubDate>Sun, 02 Aug 2026 17:41:56 -0500</pubDate>
      <description><![CDATA[Rebanded all 178 tameable creatures onto seven summoning tiers, needing Summoning 1, 30, 80, 100, 120, 140 and 150. Most requirements went up: a creature that needed Summoning 79 now needs 100, and the top creatures moved from 99 to 150. Combined with Summoning costing 4x experience per level, this is the gate that keeps new characters off the strongest pets. Taming and collaring are unchanged; this only affects fielding a creature. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Testing: Added 55 EditMode tests pinning the tamer rebalance: the whole prerequisite graph against…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-5d3b709c8a25</guid>
      <pubDate>Sun, 02 Aug 2026 17:51:09 -0500</pubDate>
      <description><![CDATA[Added 55 EditMode tests pinning the tamer rebalance: the whole prerequisite graph against the design diagram, the 4x pricing, each command carrying its drawback and sitting on the two-slot channel, both burst windows staying shorter than their cooldowns, the taunt not gaining power from charging, and the pet range, resurrect and cooldown curves at their anchor points. Also pinned that the pet manifest agrees with the prefabs, since the built client reads the manifest and only falls back to the prefabs in the editor. DO NOT PANIC! (just experimenting)]]></description>
    </item>
    <item>
      <title>Movement: Fixed an avatar that could stop dead while you held the forward key, where letting go and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-af527365e72f</guid>
      <pubDate>Sun, 02 Aug 2026 19:55:27 -0500</pubDate>
      <description><![CDATA[Fixed an avatar that could stop dead while you held the forward key, where letting go and pressing again gave you a few feet and then another stop. The client only changes your speed under an acceleration ramp, and it only starts a new ramp when its idea of your target speed changes. A spell cast that locks you in place was setting the speed straight to zero without telling the part that decides whether a new ramp is needed, so once those two disagreed nothing started you moving again until you released the key. Reported by a tester who had been hitting it about once a day with no pattern.]]></description>
    </item>
    <item>
      <title>Movement: Added a watchdog underneath that fix. If your avatar is asking to move at a normal speed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-03fdeb4baff5</guid>
      <pubDate>Sun, 02 Aug 2026 19:55:35 -0500</pubDate>
      <description><![CDATA[Added a watchdog underneath that fix. If your avatar is asking to move at a normal speed but has not moved for half a second, the client corrects itself and writes one record of what was happening at that moment. Roots, stuns, knockdowns, casts and being over-encumbered cannot trip it, because those all work by lowering your speed or by blocking the movement request outright, and there is a test for each one. Since nobody can reproduce this on demand, the record is how we find out whether any version of it is still out there.]]></description>
    </item>
    <item>
      <title>Movement: A review pass over the first version caught that the diagnostic record was being written…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-02-f3536e6e0a79</guid>
      <pubDate>Sun, 02 Aug 2026 19:55:44 -0500</pubDate>
      <description><![CDATA[A review pass over the first version caught that the diagnostic record was being written at a level the log triage does not read, so every record would have landed in the index and never been looked at. Also split the position into separate fields, since the ingest would have stored it as one opaque string, and pinned the number formatting to a fixed locale so a tester on a comma-decimal machine does not emit values the index rejects. Two of the three problems only showed up by reading the ingest rules rather than the client.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-08-01</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-headlines</guid>
      <pubDate>Sat, 01 Aug 2026 19:18:25 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Test bots now appear in the world as real characters, and running two hundred of them showed the game client hits its limit long before the server does.</li>
        <li>Searching all your stuff now reaches your <strong>bank</strong> from anywhere, with no trip to a banker first, and the window stopped swallowing its own "type at least three characters" message.</li>
        <li>The <b>encumbrance warning</b> appears the moment you go over your carry capacity again, with a yellow exclamation mark as you near the weight that blocks pickup and a red one at it.</li>
        <li>A player report of poor performance on an <b>AMD Ryzen AI MAX+ 395</b> laptop turned into a measured finding: on Linux, OpenGL was costing about <b>four times</b> the processor time per frame that Vulkan does. Same machines, both drivers, 1,700 samples. The Linux client now defaults to Vulkan.</li>
        <li>Texture streaming was <b>off across every quality level</b>, so the client uploaded every texture at full detail with no memory budget. That is why one Linux session logged 13,184 low-memory warnings from the graphics driver and then sat at 11 frames per second. Streaming is on now, with 3,964 world textures swept onto it.</li>
        <li>Distant players are simulated cheaply again, and the client now caps <b>how many</b> other players get full physics rather than only how far away they are. A crowd of 500 costs what a crowd of 15 costs.</li>
        <li>Stealth now actually hides you. Other players saw a shimmering outline of every stealthed character; they now see nothing unless they are within about 3 meters and facing you.</li>
        <li>Quest reset stopped eating your travel list. Resetting a character's quest state kept clearing every map and arrival point that character had discovered, so a reset character could not teleport anywhere it had already been. Places you have found now survive the reset.</li>
        <li>Stealth got its escape back: break line of sight and hide, and whatever was chasing you loses you. It never worked before.</li>
        <li>Riposte and Opportunity Strike say "immediately after" a parry or dodge. The windows were around 11 seconds. They are 2 now.</li>
        <li>Obfuscate: throw a smoke bomb, break line of sight, vanish. New Subterfuge skill with a craftable bomb behind it.</li>
        <li>A new testers-only <code>/reactions</code> readout finally makes reaction-skill timing visible: how long the window really is, how far into it you pressed, and whether the bonus landed.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Combat: A Chaotic Clone now reads as the player who cast it. Its name plate carries the caster's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-b5ab21084af3</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:37 -0500</pubDate>
      <description><![CDATA[A Chaotic Clone now reads as the player who cast it. Its name plate carries the caster's title line, the caster's name with whatever PVP and faction tags are on it, the caster's guild line, and the same name colour. Before, it printed the caster's name once plain and once in angle brackets, which is where a guild name goes, with no title and an NPC colour.]]></description>
    </item>
    <item>
      <title>Combat: The clone takes the caster's health pool instead of a flat 28 hit points. The old value…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-3eb73864da7b</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:37 -0500</pubDate>
      <description><![CDATA[The clone takes the caster's health pool instead of a flat 28 hit points. The old value meant the numbers under its name read 14 out of 28 beside a real avatar's 1400 out of 1751 the moment anyone hit it, so the deception ended at the first blow however well the text matched.]]></description>
    </item>
    <item>
      <title>Combat: It only wears what the caster is wearing. A helmet or cloak you have hidden stayed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-fa6485b24989</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:38 -0500</pubDate>
      <description><![CDATA[It only wears what the caster is wearing. A helmet or cloak you have hidden stayed visible on the clone, because the code deciding whether to draw a piece of an outfit asked whether the entity was a player and drew everything when it was not.]]></description>
    </item>
    <item>
      <title>Combat: It sheathes and draws its weapon when the caster does. It used to stand around with the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-eea022985bc8</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:38 -0500</pubDate>
      <description><![CDATA[It sheathes and draws its weapon when the caster does. It used to stand around with the weapon out permanently, which is what a summoned creature does and no avatar does.]]></description>
    </item>
    <item>
      <title>Combat: Its run speed went from 5 to 5.5, matching an avatar, so the pair no longer drifts apart…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-f2eafea324f9</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:38 -0500</pubDate>
      <description><![CDATA[Its run speed went from 5 to 5.5, matching an avatar, so the pair no longer drifts apart over a few seconds of running.]]></description>
    </item>
    <item>
      <title>Combat: Right-clicking somebody else's clone offers the menu that player's character offers. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-962a3a81eb18</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:38 -0500</pubDate>
      <description><![CDATA[Right-clicking somebody else's clone offers the menu that player's character offers. It used to offer a pet sheet, so one click identified the decoy. Right-clicking your own clone still gives you the pet controls.]]></description>
    </item>
    <item>
      <title>Combat: All of this is one idea: a new identity lookup that answers "which player is this entity…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-f06ca5616167</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:38 -0500</pubDate>
      <description><![CDATA[All of this is one idea: a new identity lookup that answers "which player is this entity presenting itself as". A player is itself, a clone is its caster, everything else is nobody. The name plate, the party typeface, the guild leader and grandmaster marks, the outfit visibility checks and the context menu all read through it. Combat, aggro and pet ownership deliberately do not, so a clone is still a summoned creature everywhere the rules are concerned.]]></description>
    </item>
    <item>
      <title>Combat: The clone follows the caster for as long as it lives, so changing your title, joining or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-b1714f61d233</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:39 -0500</pubDate>
      <description><![CDATA[The clone follows the caster for as long as it lives, so changing your title, joining or leaving a guild, or flagging for PVP while one is out updates its name plate too.]]></description>
    </item>
    <item>
      <title>Combat: Nineteen tests cover the decision rules: when the owner-name format applies, which player…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-c8d889114243</guid>
      <pubDate>Sat, 01 Aug 2026 07:47:39 -0500</pubDate>
      <description><![CDATA[Nineteen tests cover the decision rules: when the owner-name format applies, which player a plate speaks for when the caster has walked away, which health pool wins, and which right-click menu is offered.]]></description>
    </item>
    <item>
      <title>Combat: Stealth now hides you from other players. A stealthed character was still drawn for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-2747eb5bd1c4</guid>
      <pubDate>Sat, 01 Aug 2026 12:36:37 -0500</pubDate>
      <description><![CDATA[Stealth now hides you from other players. A stealthed character was still drawn for everyone else as a shimmering, body-shaped outline that followed them exactly, so stealth gave away the position it was there to conceal. Other players now see nothing at all unless they are within about 3 meters and facing you, which is the same range at which they could already target you. Party members and Game Masters still see you, and stealthed creatures keep their existing faint shimmer so ambushes still read.]]></description>
    </item>
    <item>
      <title>Combat: Fixed two related problems found while tracing that one. A stealthed player could be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-0b9b7337ac73</guid>
      <pubDate>Sat, 01 Aug 2026 12:36:45 -0500</pubDate>
      <description><![CDATA[Fixed two related problems found while tracing that one. A stealthed player could be moused over and click-selected from any distance, where the reticle had always blocked it past a few meters. Stealth ending during a scene change also left that character&apos;s lights switched off permanently.]]></description>
    </item>
    <item>
      <title>Combat: Breaking line of sight while hidden now works. A creature that had already spotted you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-01511f3c9187</guid>
      <pubDate>Sat, 01 Aug 2026 17:43:33 -0500</pubDate>
      <description><![CDATA[Breaking line of sight while hidden now works. A creature that had already spotted you kept tracking you no matter how well you hid, so re-hiding could never shake anything already chasing you. Get out of its sight and hide, and it loses you.]]></description>
    </item>
    <item>
      <title>Combat: Camouflage promised a higher stealth level from Subterfuge Specialization and delivered…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-bac6d8f70d8c</guid>
      <pubDate>Sat, 01 Aug 2026 17:43:42 -0500</pubDate>
      <description><![CDATA[Camouflage promised a higher stealth level from Subterfuge Specialization and delivered none of it. The bonus was reading Tactics specialization instead, so a Subterfuge specialist saw no change in the tooltip or in play. It reads the right one now. Silent Movement and Camouflage cooldowns also came down, from 30 and 15 seconds to 20 and 10.]]></description>
    </item>
    <item>
      <title>Combat: Riposte and Opportunity Strike are both described as following immediately after a parry…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-041eb10e38eb</guid>
      <pubDate>Sat, 01 Aug 2026 17:43:42 -0500</pubDate>
      <description><![CDATA[Riposte and Opportunity Strike are both described as following immediately after a parry or a dodge. Riposte's window was 11.25 seconds at Blades 100, and Opportunity Strike's armor-piercing bonus was guaranteed for about 11 seconds after a dodge. Both are 2 seconds now, still widened by specialization. Damage is unchanged until the shorter windows have been played with.]]></description>
    </item>
    <item>
      <title>Combat: Sneak Attack now requires a melee weapon. It had no weapon requirement at all and used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-1e64f540bbde</guid>
      <pubDate>Sat, 01 Aug 2026 17:43:52 -0500</pubDate>
      <description><![CDATA[Sneak Attack now requires a melee weapon. It had no weapon requirement at all and used your weapon's range, so a bow got the full stealth opener from bow range with none of the risk of closing in. Poison coating duration now grows with Subterfuge Specialization on top of the existing chance to save the potion, Smelling Salts takes 1.5 seconds to use instead of 0.5, and Distract covers more ground when specialized.]]></description>
    </item>
    <item>
      <title>Combat: Pugilism moved from the Subterfuge tree to Tactics. It had no mechanical tie to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-da361610f326</guid>
      <pubDate>Sat, 01 Aug 2026 17:43:52 -0500</pubDate>
      <description><![CDATA[Pugilism moved from the Subterfuge tree to Tactics. It had no mechanical tie to Subterfuge left: its description claimed Subterfuge Specialization extended unarmed reach, but the reach was a fixed number that specialization never touched. Characters who already trained it keep it at the same level.]]></description>
    </item>
    <item>
      <title>Combat: New Subterfuge skill: Obfuscate. It throws a crafted smoke bomb that hides you sharply…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-f00de672d1e1</guid>
      <pubDate>Sat, 01 Aug 2026 18:40:40 -0500</pubDate>
      <description><![CDATA[New Subterfuge skill: Obfuscate. It throws a crafted smoke bomb that hides you sharply for a couple of seconds, in the open and even while something is hitting you, which is the window you need to break line of sight and get back into stealth. It sits where Pugilism used to be in the tree, behind Engage Opponent. Smoke Bombs are an Alchemy recipe, three per craft.]]></description>
    </item>
    <item>
      <title>Combat: Engage Opponent gives Subterfuge specialists a brief stealth boost while they close the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-219c1aad6b90</guid>
      <pubDate>Sat, 01 Aug 2026 18:40:40 -0500</pubDate>
      <description><![CDATA[Engage Opponent gives Subterfuge specialists a brief stealth boost while they close the distance, on top of the focus discount it already had. Without the specialization it behaves exactly as before.]]></description>
    </item>
    <item>
      <title>Combat: Added a testers-only timing readout for reaction skills. Riposte, Opportunity Strike…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-9d3b8d101b23</guid>
      <pubDate>Sat, 01 Aug 2026 19:17:16 -0500</pubDate>
      <description><![CDATA[Added a testers-only timing readout for reaction skills. Riposte, Opportunity Strike, Aetheric Feedback and Fortify Defenses all give a bonus for acting quickly after a parry, dodge or critical hit, and until now there was no way to see whether you made the window or missed it. <code>/reactions</code> shows the window that is open with a countdown, then logs each cast: how long the window was, how far into it you pressed, how long the answer took to come back, and whether the bonus applied.]]></description>
    </item>
    <item>
      <title>Combat: The readout also drops a one-line summary into chat after each reaction cast, so a tester…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-8e4e8fa04318</guid>
      <pubDate>Sat, 01 Aug 2026 19:17:24 -0500</pubDate>
      <description><![CDATA[The readout also drops a one-line summary into chat after each reaction cast, so a tester can paste it straight into a verification task instead of describing what they saw. It carries the window length, the time of the press, the round trip, and the result.]]></description>
    </item>
    <item>
      <title>Combat: Reaction skills are detected from the skill data itself rather than by name, so a new one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-d7745c85770c</guid>
      <pubDate>Sat, 01 Aug 2026 19:17:25 -0500</pubDate>
      <description><![CDATA[Reaction skills are detected from the skill data itself rather than by name, so a new one is covered automatically, and a test fails if the set ever changes without anyone noticing. That test immediately caught Opportunity Strike being wired one level deeper than the other three, which is why its listed chance has always read 100%.]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed 10 wishlist suggestions from the community to the tracker: more…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-2bdebf492666</guid>
      <pubDate>Sat, 01 Aug 2026 03:24:01 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed 10 wishlist suggestions from the community to the tracker: more tameable mounts, a Crown Store dye preview tool, a PvP pickpocket/combat-deck idea, deco placement on city-home windowsills and railings, a per-player FX mute option, reviving the monthly fishing contest, custom boss names in player dungeons, a new Castle Atos child quest, a feathers turn-in bin, and a Death Magic aura ability.]]></description>
    </item>
    <item>
      <title>Build pipeline: The profiling client builds and downloads. Getting there turned up a real repo bug: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-e6ef5cca8384</guid>
      <pubDate>Sat, 01 Aug 2026 06:22:56 -0500</pubDate>
      <description><![CDATA[The profiling client builds and downloads. Getting there turned up a real repo bug: the ignore rule meant to skip a package-restore folder had no path anchor, so it also matched the plugins folder holding the spline library the game compiles against. Anyone building from a fresh copy of the source got a wall of compile errors on types that were simply absent. The plugin is now tracked, so a clean checkout compiles.]]></description>
    </item>
    <item>
      <title>Build pipeline: Both builds ran at the same time on the one machine and both passed: the profiling client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-64f05d85a2c0</guid>
      <pubDate>Sat, 01 Aug 2026 06:23:02 -0500</pubDate>
      <description><![CDATA[Both builds ran at the same time on the one machine and both passed: the profiling client on its own copy of the source, the nightly release on the original, overlapping for about 25 minutes with no interference. The second build also finished in 62 minutes rather than eight hours, since its asset cache was warm by then. First build off a cold tree is the slow one.]]></description>
    </item>
    <item>
      <title>UI: Buff icons on the status bars line up under the bars again. The conversion carried the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-9bc69a7acae4</guid>
      <pubDate>Sat, 01 Aug 2026 07:48:55 -0500</pubDate>
      <description><![CDATA[Buff icons on the status bars line up under the bars again. The conversion carried the authored grid's nine-per-row wrap and 26-pixel cells across but not its position, so the strip drew flush with the health and focus bars instead of 12 pixels in under them. A new test pins the full strip at 246 pixels against the 280 between the player and target plates, which is the overlap a tester reported before last week's wrap fix landed.]]></description>
    </item>
    <item>
      <title>Crafting: The first disagreement the new recipe matching reported on the test shard turned out to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-5e36a23c3f59</guid>
      <pubDate>Sat, 01 Aug 2026 07:59:33 -0500</pubDate>
      <description><![CDATA[The first disagreement the new recipe matching reported on the test shard turned out to be a false alarm, and would have been followed by one for roughly every third craft. Recipes that take a category of ingredient rather than a specific one have several equally valid identity codes, and the two sides were reporting different ones for the same recipe. The check now compares the recipes themselves.]]></description>
    </item>
    <item>
      <title>Tooling: Our test bots now stand in the world as real characters. Getting there needed two more…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-60d32c9ff07b</guid>
      <pubDate>Sat, 01 Aug 2026 06:40:50 -0500</pubDate>
      <description><![CDATA[Our test bots now stand in the world as real characters. Getting there needed two more pieces than expected: a bot has to keep publishing where it is standing, or the world puts it at the map origin underneath the terrain, and it has to say it finished loading, or nobody else ever builds a body for it. Until both were in place the bots were in the player list and setting off fireworks with nothing visible underneath.]]></description>
    </item>
    <item>
      <title>Tooling: Ran the bots up from ten to two hundred in a single town with no dropped connections. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-0f2b4b27607d</guid>
      <pubDate>Sat, 01 Aug 2026 06:40:50 -0500</pubDate>
      <description><![CDATA[Ran the bots up from ten to two hundred in a single town with no dropped connections. The server barely noticed, sitting around 94 percent idle, and each extra character costs it about a sixth of one percent of a processor core. The limit turned out to be the game client instead: with two hundred characters in view it was pinned to a single processor thread while the graphics card sat mostly idle, which is the kind of thing a server-only test would never have shown us.]]></description>
    </item>
    <item>
      <title>Tooling: The Editor report and validate menus stopped popping a dialog to say they finished. Every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-21e742a49c54</guid>
      <pubDate>Sat, 01 Aug 2026 18:40:48 -0500</pubDate>
      <description><![CDATA[The Editor report and validate menus stopped popping a dialog to say they finished. Every one of those stopped the Editor until somebody clicked it, which blocks automated runs and tells you nothing you cannot see when the import stops. 84 of them now write a console line instead. Failure dialogs all stayed.]]></description>
    </item>
    <item>
      <title>Social: Fixed a partner dance that never ended. Ending one only broke the pairing between the two…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-9e93d78c5053</guid>
      <pubDate>Sat, 01 Aug 2026 07:25:02 -0500</pubDate>
      <description><![CDATA[Fixed a partner dance that never ended. Ending one only broke the pairing between the two players, and the dance animation loops with no natural finish, so the character kept dancing afterwards. Worse, nothing checked whether your <em>partner</em> was still dancing, so if they stopped an arm's length away you waltzed on alone with nothing to tell you.]]></description>
    </item>
    <item>
      <title>Social: A dance now ends for both dancers when either one moves, when either stops dancing, when…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-12a129bea74b</guid>
      <pubDate>Sat, 01 Aug 2026 07:25:03 -0500</pubDate>
      <description><![CDATA[A dance now ends for both dancers when either one moves, when either stops dancing, when they drift more than about 7.5 metres apart, or when a partner logs out, and both people get a line saying so. Added <strong>/partner off</strong> to end one on purpose; typing it used to answer "off isn't nearby" as though it were somebody's name.]]></description>
    </item>
    <item>
      <title>UI: The deck name and swap display in the lower right can be moved again. A small grip handle…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-05ee597a7b6b</guid>
      <pubDate>Sat, 01 Aug 2026 07:40:09 -0500</pubDate>
      <description><![CDATA[The deck name and swap display in the lower right can be moved again. A small grip handle above the two deck names drags the names and the swap button together as one piece, and where you drop it is remembered between sessions. It had been pinned in place since an earlier version let the deck names be dragged away from their icon one at a time.]]></description>
    </item>
    <item>
      <title>UI: Reset Positions on the Interface tab now puts that deck display back in the corner as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-0787df5374a2</guid>
      <pubDate>Sat, 01 Aug 2026 07:40:20 -0500</pubDate>
      <description><![CDATA[Reset Positions on the Interface tab now puts that deck display back in the corner as well, and a remembered spot is pulled back on screen whenever the resolution or the UI size changes, so it cannot be left stranded past an edge.]]></description>
    </item>
    <item>
      <title>UI: Searching all your stuff now looks in your bank from anywhere. Before this, a banked item…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-139e8d9f2fab</guid>
      <pubDate>Sat, 01 Aug 2026 08:05:55 -0500</pubDate>
      <description><![CDATA[Searching all your stuff now looks in your <strong>bank</strong> from anywhere. Before this, a banked item only turned up if you had opened a bank window that session, or if you happened to be carrying another one of the same kind.]]></description>
    </item>
    <item>
      <title>UI: The search window also stopped losing its own message. Typing fewer than three characters…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-1a2929f33c52</guid>
      <pubDate>Sat, 01 Aug 2026 08:05:55 -0500</pubDate>
      <description><![CDATA[The search window also stopped losing its own message. Typing fewer than three characters and pressing Enter showed the reminder for a fraction of a second before the previous result count wrote over it, so anyone who had already searched once never saw it.]]></description>
    </item>
    <item>
      <title>UI: Two smaller improvements came with those. Search results now fill the list as they arrive…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-e710a44844c3</guid>
      <pubDate>Sat, 01 Aug 2026 08:05:55 -0500</pubDate>
      <description><![CDATA[Two smaller improvements came with those. Search results now fill the list as they arrive instead of appearing all at once at the end, and a search that matches more kinds of item than one request can carry now says so instead of returning a short list with no explanation.]]></description>
    </item>
    <item>
      <title>UI: Highlighted inventory rows now belong to one window at a time. Clicking anywhere in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-667178cd166f</guid>
      <pubDate>Sat, 01 Aug 2026 09:03:31 -0500</pubDate>
      <description><![CDATA[Highlighted inventory rows now belong to one window at a time. Clicking anywhere in another container window, its title bar included, drops the previous window's highlights, and clicking the world clears them. Before this, a bag, a chest and the backpack could each hold a selection at once with nothing to say which one an action would use. Reported by a tester who also proposed the fix.]]></description>
    </item>
    <item>
      <title>UI: The tester Duplicate tool follows the same rule, so it copies the rows in the window you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-17a6cdb0faa4</guid>
      <pubDate>Sat, 01 Aug 2026 09:03:39 -0500</pubDate>
      <description><![CDATA[The tester Duplicate tool follows the same rule, so it copies the rows in the window you were last working in instead of everything highlighted anywhere. Crafting stations are the deliberate exception: their side-by-side lists keep their own highlights, because moving reagents between them means having rows picked in two lists at once.]]></description>
    </item>
    <item>
      <title>UI: Glyphs on the hotbar were reported as showing no tooltip. A plain hover renders the full…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-95b562a7d8f6</guid>
      <pubDate>Sat, 01 Aug 2026 10:24:21 -0500</pubDate>
      <description><![CDATA[Glyphs on the hotbar were reported as showing no tooltip. A plain hover renders the full tooltip on the current build, and nothing changed between the reported build and this one in how a hover is resolved, so that report stays open until it can be reproduced. The hover path picked up automated coverage in the meantime: the tests mount the bar the way the game does, pick the element under each slot, and follow it to the tooltip that slot should answer with.]]></description>
    </item>
    <item>
      <title>Performance: Profiled the client in a crowd on the chaos shard: stood in Castle Atos and ramped test…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-e8003b0b2e43</guid>
      <pubDate>Sat, 01 Aug 2026 07:42:56 -0500</pubDate>
      <description><![CDATA[Profiled the client in a crowd on the chaos shard: stood in Castle Atos and ramped test avatars 0, 50, 100, 150, capturing at each step. Frame time rises about 0.89 ms per added player, taking the client from 30 fps alone to 6 fps in a crowd of 150.]]></description>
    </item>
    <item>
      <title>Performance: The graphics card is never the hold-up. The counter that measures the main thread waiting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-4a45019297c2</guid>
      <pubDate>Sat, 01 Aug 2026 07:42:56 -0500</pubDate>
      <description><![CDATA[The graphics card is never the hold-up. The counter that measures the main thread waiting on the GPU read 0.002 ms at every population, so the whole cost is on the processor side. A faster graphics card would not move this number.]]></description>
    </item>
    <item>
      <title>Performance: Found two pieces of code whose cost grows with the square of the crowd: doubling the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-1f29e6c5f057</guid>
      <pubDate>Sat, 01 Aug 2026 07:42:57 -0500</pubDate>
      <description><![CDATA[Found two pieces of code whose cost grows with the square of the crowd: doubling the players quadruples the work. One is a player lookup that walks the entire list every time it is asked, hidden behind a property that looks free to call. The other is every visible character running its own search for who is standing near it, including the ones that are just puppets of other players.]]></description>
    </item>
    <item>
      <title>Performance: Re-ran the 150-avatar test with the fireworks switched off to separate the two costs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-075a77051eaf</guid>
      <pubDate>Sat, 01 Aug 2026 07:42:57 -0500</pubDate>
      <description><![CDATA[Re-ran the 150-avatar test with the fireworks switched off to separate the two costs. Fireworks are 20 percent of the frame at that size and almost all of it is drawing, adding 3,365 draw-state changes because each burst brings its own effect that cannot be drawn together with the others. The crowd itself is the other 100 ms, and that part is nearly all code.]]></description>
    </item>
    <item>
      <title>Performance: Fixed the first of the two costs that grew with the square of the crowd. Looking up a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-3f22b91d6dd2</guid>
      <pubDate>Sat, 01 Aug 2026 08:03:21 -0500</pubDate>
      <description><![CDATA[Fixed the first of the two costs that grew with the square of the crowd. Looking up a player by id walked the whole list of everyone in the scene, and it sat behind a property that looked free to call, so it ended up running for every character every frame. It is now a direct lookup. At 150 players that removes about 48,000 list reads and 27,000 comparisons per frame.]]></description>
    </item>
    <item>
      <title>Performance: The second one turned out to be a missing limit rather than a bad design. Each character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-e4048d5c3589</guid>
      <pubDate>Sat, 01 Aug 2026 08:03:21 -0500</pubDate>
      <description><![CDATA[The second one turned out to be a missing limit rather than a bad design. Each character searches for who is standing near it, and that search is meant to run about once a second. The version that runs for other players nearby had no such limit and ran every frame, while the copy that runs for your own character was correctly limited. Restored the limit: at 150 players that is 153 searches per frame down to roughly one per character per second.]]></description>
    </item>
    <item>
      <title>Performance: Resisted the tempting version of that second fix. Skipping the search entirely for other…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-8b6144dc02f7</guid>
      <pubDate>Sat, 01 Aug 2026 08:03:21 -0500</pubDate>
      <description><![CDATA[Resisted the tempting version of that second fix. Skipping the search entirely for other players would have been faster still, but abilities that jump from target to target read the list belonging to whoever cast them, and the caster can be another player. Keeping the list and restoring its limit gets almost the same saving without touching how those abilities pick targets.]]></description>
    </item>
    <item>
      <title>Performance: Next candidate found while measuring: character animation. Non-player characters are told…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-d19b7a5ae51e</guid>
      <pubDate>Sat, 01 Aug 2026 08:03:22 -0500</pubDate>
      <description><![CDATA[Next candidate found while measuring: character animation. Non-player characters are told to skip animation work while off screen, but player characters never were, so every avatar behind you keeps doing full animation. That is about 27 ms of work per frame at 150 players.]]></description>
    </item>
    <item>
      <title>Tools: Added a small harness that triggers a profile capture in a running client from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-2c3aab6972cd</guid>
      <pubDate>Sat, 01 Aug 2026 07:42:58 -0500</pubDate>
      <description><![CDATA[Added a small harness that triggers a profile capture in a running client from the command line, so a measurement run does not need someone typing into chat between waves.]]></description>
    </item>
    <item>
      <title>Tools: Fixed the example test-fleet config, which set the bots up to perform in a private room…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-b2b9109ad270</guid>
      <pubDate>Sat, 01 Aug 2026 07:42:58 -0500</pubDate>
      <description><![CDATA[Fixed the example test-fleet config, which set the bots up to perform in a private room no player could ever reach; its own comments described the opposite behaviour. Also fixed the fleet stop script, which threw an error at the exact moment every bot had shut down cleanly.]]></description>
    </item>
    <item>
      <title>Tools: Caught a test that was passing without testing anything. The new coverage for the player…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-ceb4dfffaaf9</guid>
      <pubDate>Sat, 01 Aug 2026 08:29:16 -0500</pubDate>
      <description><![CDATA[Caught a test that was passing without testing anything. The new coverage for the player lookup needed a live network connection to set up, which does not exist when tests run outside the game, so every case quietly skipped and the run still reported success. Rewrote it to cover the one case it can actually reach, which happens to be the one the change put at risk.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-dc4b061b7582</guid>
      <pubDate>Sat, 01 Aug 2026 07:43:08 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/crowd-150-players-castle-atos.png" data-full="https://catnipgames.net/blog/images/crowd-150-players-castle-atos.png" data-cap="150 test avatars packed into the Castle Atos courtyard, setting off fireworks. At this size the client runs at 6 frames per second, and the profiler says it is the processor, not the graphics card."></span>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-02cbd06acb51</guid>
      <pubDate>Sat, 01 Aug 2026 12:20:11 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/ui-skins-edge-flourish-vs-quill.png" data-full="https://catnipgames.net/blog/images/ui-skins-edge-flourish-vs-quill.png" data-cap="The window corner ornament sheets, tinted white for comparison. The old flourish fills all four corners; the new Quill default keeps the flourish on the bottom corners and quiets the top ones where the window buttons live."></span>]]></description>
    </item>
    <item>
      <title>Images: The new Summon window, filtered to tiers 8 through 12.</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-86c28a8d240f</guid>
      <pubDate>Sat, 01 Aug 2026 12:24:14 -0500</pubDate>
      <description><![CDATA[The new Summon window, filtered to tiers 8 through 12. <span class="gallery"><img src="https://catnipgames.net/blog/images/gm-summon-window-tier-band.png" data-full="https://catnipgames.net/blog/images/gm-summon-window-tier-band.png" data-cap="The GM Summon window with a tier band of 8 to 12 applied: 330 of 1,386 creatures shown, sorted by tier, with the count and placement ring above the list." alt="The GM Summon window listing tier 8 creatures by name, tier and family" /></span>]]></description>
    </item>
    <item>
      <title>Inventory: Container windows no longer open on top of each other. Every bag and chest loaded the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-802df76a90b8</guid>
      <pubDate>Sat, 01 Aug 2026 08:11:37 -0500</pubDate>
      <description><![CDATA[Container windows no longer open on top of each other. Every bag and chest loaded the same saved position, so the second one you opened covered the first completely, title and all. Each additional container now steps 40px right and 32px down from the one before it, and closing one in the middle puts the next container you open back in that gap.]]></description>
    </item>
    <item>
      <title>Inventory: The remembered size and position still belong to the first window you open. The rest…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-8d1292147603</guid>
      <pubDate>Sat, 01 Aug 2026 08:11:44 -0500</pubDate>
      <description><![CDATA[The remembered size and position still belong to the first window you open. The rest match its size and step off it, so every title stays readable and no window has to be dragged aside to find the one behind it.]]></description>
    </item>
    <item>
      <title>Interface: The encumbrance warning in the top right corner now appears as soon as you are carrying…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-837bfa728e42</guid>
      <pubDate>Sat, 01 Aug 2026 09:00:20 -0500</pubDate>
      <description><![CDATA[The encumbrance warning in the top right corner now appears as soon as you are carrying more than your capacity. On the new interface it stayed hidden until you were roughly two and a half times over, so through most of the range where your movement is already slowed there was nothing on screen saying so.]]></description>
    </item>
    <item>
      <title>Interface: The exclamation mark over that warning is yellow as you approach the weight that stops…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-f43bf9b1da38</guid>
      <pubDate>Sat, 01 Aug 2026 09:00:29 -0500</pubDate>
      <description><![CDATA[The exclamation mark over that warning is yellow as you approach the weight that stops you picking anything else up, and red once you reach it. The conversion had carried the mark across but not the colour it was drawn in, so both looked identical.]]></description>
    </item>
    <item>
      <title>Options menu: A tester went looking for a search box in the Options window's Controls tab and reported…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-003e87a6808e</guid>
      <pubDate>Sat, 01 Aug 2026 11:28:42 -0500</pubDate>
      <description><![CDATA[A tester went looking for a search box in the Options window's Controls tab and reported there was none. There never had been one, in the current interface or in the one it replaced. The tab now has the filter that report assumed: the keybinding list carries close to two hundred actions, and typing part of an action name narrows the list to what matches, ignoring capital letters and matching anywhere in the name. Clearing the box, or closing and reopening the window, brings the whole list back.]]></description>
    </item>
    <item>
      <title>Options menu: Building that filter exposed two faults in key rebinding. A row waiting for a key press…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-422836dd7c74</guid>
      <pubDate>Sat, 01 Aug 2026 11:28:42 -0500</pubDate>
      <description><![CDATA[Building that filter exposed two faults in key rebinding. A row waiting for a key press reads the keyboard directly and treats Delete as clear this binding, so clicking into the new box while a row read Press a key would have bound the first letter typed, and Delete would have cleared that action's key. The capture now ends the moment the filter box takes focus. Resetting to defaults also left a capture running against keys that had just changed under it.]]></description>
    </item>
    <item>
      <title>Housing: Fixed Tighter Fit not re-checking the item you are holding when you toggle the mode…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-850f8711a68f</guid>
      <pubDate>Sat, 01 Aug 2026 12:16:15 -0500</pubDate>
      <description><![CDATA[Fixed <strong>Tighter Fit</strong> not re-checking the item you are holding when you toggle the mode. Slide an item against a wall until the ghost turns red, press the key without moving the mouse, and the ghost stayed red until you nudged the item. Turning the mode off while tucked in had the reverse problem and left the ghost green on a spot the item no longer fit.]]></description>
    </item>
    <item>
      <title>Housing: Tighter Fit now says which kind of item it refused. Wall art, containers, display cases…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-d510f525bcad</guid>
      <pubDate>Sat, 01 Aug 2026 12:16:16 -0500</pubDate>
      <description><![CDATA[Tighter Fit now says which kind of item it refused. Wall art, containers, display cases and lot markers all gave the same line about chests, crafting stations and planting beds, which named none of them. Each category has its own message now, and an excluded item held with the mode on says so in the placement status instead of the Tighter Fit line disappearing.]]></description>
    </item>
    <item>
      <title>Housing: Tighter Fit works on a decoration that has something resting on it. A rug with an item on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-52c1c388c56d</guid>
      <pubDate>Sat, 01 Aug 2026 12:16:17 -0500</pubDate>
      <description><![CDATA[Tighter Fit works on a decoration that has something resting on it. A rug with an item on top read as a multi-part decoration and was refused. The rug now gets the narrower placement collision while its passenger keeps full size, so the pair still stops against a wall. The same fix stops a table with a chest on it being treated as a chest.]]></description>
    </item>
    <item>
      <title>Maps: A tester checking the Vauban Pass map reported their marker sitting slightly off the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-9fa1dcf4631c</guid>
      <pubDate>Sat, 01 Aug 2026 09:11:32 -0500</pubDate>
      <description><![CDATA[A tester checking the Vauban Pass map reported their marker sitting slightly off the trail they were standing on. Built a tool that measures the question directly: it puts an object at a known spot in the world, photographs it the same way the map itself was photographed, and compares where it landed against where the map says it should be. Twenty-five spots across the zone, at two different heights.]]></description>
    </item>
    <item>
      <title>Maps: Vauban Pass came back accurate to six centimetres across the whole zone, with no stretch…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-debec71936d7</guid>
      <pubDate>Sat, 01 Aug 2026 09:11:32 -0500</pubDate>
      <description><![CDATA[Vauban Pass came back accurate to six centimetres across the whole zone, with no stretch and no turn in the result. The map picture, the frame it was shot in and the numbers the game uses to place your marker all agree, so the map is not what is wrong. The map edge fix from the day before is cleared too. The search moves to the client.]]></description>
    </item>
    <item>
      <title>Maps: Added two tests that hold the same relationship without needing the editor open, so a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-995740fe80a5</guid>
      <pubDate>Sat, 01 Aug 2026 09:11:33 -0500</pubDate>
      <description><![CDATA[Added two tests that hold the same relationship without needing the editor open, so a future recapture cannot quietly reframe a map and leave every marker on it pointing at the wrong place. One of them covers the case where the map is drawn turned to face north, which had been carrying every rotated zone with nothing checking it.]]></description>
    </item>
    <item>
      <title>Client: Tracked down a report of poor performance on an AMD Ryzen AI MAX+ 395 laptop. The chaos…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-474a949e6a11</guid>
      <pubDate>Sat, 01 Aug 2026 09:21:55 -0500</pubDate>
      <description><![CDATA[Tracked down a report of poor performance on an AMD Ryzen AI MAX+ 395 laptop. The chaos telemetry happened to contain the same physical machines running under both Linux graphics drivers, which made it a controlled comparison: OpenGL averaged 25.7 fps and 78.6 ms of processor time per frame, Vulkan averaged 58.7 fps and 19.8 ms. Roughly four times the processor cost for the same work.]]></description>
    </item>
    <item>
      <title>Client: The Linux client now starts on Vulkan by default. Anyone who already picked a graphics…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-e1df372761e3</guid>
      <pubDate>Sat, 01 Aug 2026 09:21:55 -0500</pubDate>
      <description><![CDATA[The Linux client now starts on Vulkan by default. Anyone who already picked a graphics option in the launcher keeps their choice, OpenGL stays selectable, and it remains the automatic fallback if Vulkan cannot start. Windows and Mac are untouched.]]></description>
    </item>
    <item>
      <title>Client: The per-minute frame rate report now records which graphics driver, quality level and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-3f96e52fd1e1</guid>
      <pubDate>Sat, 01 Aug 2026 09:21:55 -0500</pubDate>
      <description><![CDATA[The per-minute frame rate report now records which graphics driver, quality level and texture detail setting a session is actually running. Without the driver field the OpenGL gap above could only be worked out by reading renderer name suffixes, which is how it stayed hidden this long.]]></description>
    </item>
    <item>
      <title>Client: A fresh install now picks its starting video settings from the machine it is on. Before…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-a79688191826</guid>
      <pubDate>Sat, 01 Aug 2026 09:57:32 -0500</pubDate>
      <description><![CDATA[A fresh install now picks its starting video settings from the machine it is on. Before this, the client read the graphics chip only to write it into a log line, so a new install started on the same preset on a top-end desktop card and on a laptop with built-in graphics. Existing players are left exactly as they are.]]></description>
    </item>
    <item>
      <title>Client: Texture streaming was off across every quality level, so the client uploaded every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-da8e6bba1a7b</guid>
      <pubDate>Sat, 01 Aug 2026 09:57:33 -0500</pubDate>
      <description><![CDATA[Texture streaming was off across every quality level, so the client uploaded every texture at full detail with no memory budget at all. It is on now, with a budget per quality level and a ceiling worked out from the machine, and 3,964 world textures were swept onto it. Interface art, cube maps and textures without mipmaps are deliberately left out.]]></description>
    </item>
    <item>
      <title>Client: Found why one Linux session logged 13,184 low-memory warnings from the graphics driver…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-10b9a2fda7e9</guid>
      <pubDate>Sat, 01 Aug 2026 09:57:33 -0500</pubDate>
      <description><![CDATA[Found why one Linux session logged 13,184 low-memory warnings from the graphics driver and then sat at 11 frames per second: with no texture budget the allocator falls off the fast memory and the processor starts stalling inside the driver. The giveaway is processor and graphics frame times reading the same number, which looks like a processor bottleneck in the charts and is not one.]]></description>
    </item>
    <item>
      <title>Client: The automatic quality adjustment had a check that could never pass, so distant ground…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-cce8daa03840</guid>
      <pubDate>Sat, 01 Aug 2026 09:57:34 -0500</pubDate>
      <description><![CDATA[The automatic quality adjustment had a check that could never pass, so distant ground detail has never once been turned down on a struggling machine while shadows and level of detail have been adjusting for years. Its trigger also only fired below 25 frames per second, so anyone sitting at 30 to 45 got no help at all. It now aims at a target worked out from your own frame rate limit.]]></description>
    </item>
    <item>
      <title>Client: Re-measured the crowd cost in Castle Atos on a build carrying the two fixes from this…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-6d3c6e6be4ca</guid>
      <pubDate>Sat, 01 Aug 2026 10:31:00 -0500</pubDate>
      <description><![CDATA[Re-measured the crowd cost in Castle Atos on a build carrying the two fixes from this morning. With 150 other players standing in one scene, the script work the client does per frame for the crowd fell from 49.9 to 39.0 milliseconds, and the cost of each additional player dropped from 0.258 to 0.180 milliseconds.]]></description>
    </item>
    <item>
      <title>Client: The saving grows with the crowd the way the fix predicted: 1.0 millisecond at 50 players…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-a17deb50b5ec</guid>
      <pubDate>Sat, 01 Aug 2026 10:31:00 -0500</pubDate>
      <description><![CDATA[The saving grows with the crowd the way the fix predicted: 1.0 millisecond at 50 players, 5.1 at 100, 11.0 at 150. Both problems removed work that grew with the square of the player count, so a bigger crowd was always going to gain more. Predicted 9.6 milliseconds at 150, measured 11.0.]]></description>
    </item>
    <item>
      <title>Client: The profiles show each fix doing its own job. The per-avatar search for nearby characters…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-50bf91797d73</guid>
      <pubDate>Sat, 01 Aug 2026 10:31:00 -0500</pubDate>
      <description><![CDATA[The profiles show each fix doing its own job. The per-avatar search for nearby characters went from 153 sweeps every frame to 18, which is the once-a-second cadence it was always meant to run at. The player-list scan behind it disappeared from the profile entirely: it was being read 48,873 times a frame at 150 players.]]></description>
    </item>
    <item>
      <title>Client: Frame rate at 150 players with fireworks still reads the same number, because the client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-aa7ec949593b</guid>
      <pubDate>Sat, 01 Aug 2026 10:31:00 -0500</pubDate>
      <description><![CDATA[Frame rate at 150 players with fireworks still reads the same number, because the client runs with vertical sync on and frame times land on fixed boundaries. An 11 millisecond saving is not enough to cross one. With fireworks off it does cross, and the rate went from 7.5 to 8.6 frames per second.]]></description>
    </item>
    <item>
      <title>Client: With those two gone the ranking of what is left changed. Checking whether an object still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-fbd66565137d</guid>
      <pubDate>Sat, 01 Aug 2026 10:31:00 -0500</pubDate>
      <description><![CDATA[With those two gone the ranking of what is left changed. Checking whether an object still exists is now the largest remaining script cost at 9.2 milliseconds per frame, down from 12.2 but still the biggest single item. Roughly a quarter of it had been sitting inside the unthrottled search.]]></description>
    </item>
    <item>
      <title>Client: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-3997dd764741</guid>
      <pubDate>Sat, 01 Aug 2026 10:31:10 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/crowd-150-after-fixes-castle-atos.png" data-full="https://catnipgames.net/blog/images/crowd-150-after-fixes-castle-atos.png" data-cap="150 test characters in the Castle Atos courtyard, the scene used for the before and after profiles."></span>]]></description>
    </item>
    <item>
      <title>Client: The fireworks-off capture gave the throttle fix a second, independent check. If each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-6c66ad04284e</guid>
      <pubDate>Sat, 01 Aug 2026 10:35:03 -0500</pubDate>
      <description><![CDATA[The fireworks-off capture gave the throttle fix a second, independent check. If each avatar now searches once a second rather than every frame, the per-frame count should follow the frame rate instead of the crowd size, and it does: same 150 characters at 8.6 frames per second instead of 6.0 gave 19 searches a frame against the 17.8 that cadence predicts.]]></description>
    </item>
    <item>
      <title>Client: Chased down where the client frame actually goes with 150 players on screen. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-3e9bfe9993fe</guid>
      <pubDate>Sat, 01 Aug 2026 11:08:11 -0500</pubDate>
      <description><![CDATA[Chased down where the client frame actually goes with 150 players on screen. The profiling report had been adding up work across all 56 threads at once, which buried the answer: the job workers alone come to 17,373 milliseconds per frame against a 164 millisecond frame. It now separates the main thread, and that total lands at 163.87 milliseconds against a 163.87 millisecond frame. The whole frame is accounted for.]]></description>
    </item>
    <item>
      <title>Client: That closes a question that had been recorded as "a third of the frame is unattributed"…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-42464335c8a6</guid>
      <pubDate>Sat, 01 Aug 2026 11:08:11 -0500</pubDate>
      <description><![CDATA[That closes a question that had been recorded as "a third of the frame is unattributed". Nothing was missing. The earlier number was frame time minus three named engine stages, and plenty of real work happens outside those three. The split at 150 players is game script 33 percent, engine and waiting on jobs 10, rendering 10, animation 6, particles 6.]]></description>
    </item>
    <item>
      <title>Client: Other players now stop doing their full animation work while they are off your screen…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-56166bee6442</guid>
      <pubDate>Sat, 01 Aug 2026 11:08:11 -0500</pubDate>
      <description><![CDATA[Other players now stop doing their full animation work while they are off your screen. They keep tracking what they are doing, so anyone walking back into view is already in the right pose. Characters run by the game have always worked this way; player characters never got the same treatment, so 150 of them were each posing a full skeleton whether or not you could see them.]]></description>
    </item>
    <item>
      <title>Client: The compass was re-sorting which icon draws in front on every frame: 888 comparisons…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-29841cc06dac</guid>
      <pubDate>Sat, 01 Aug 2026 11:08:11 -0500</pubDate>
      <description><![CDATA[The compass was re-sorting which icon draws in front on every frame: 888 comparisons, each doing two lookups and four flag reads, about 1.4 milliseconds a frame. It costs that in an empty scene as much as in a crowd. Icons still follow the camera every frame; only the front-to-back order settles at ten times a second now.]]></description>
    </item>
    <item>
      <title>Client: Checked whether firework effects were missing their batching settings. They were not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-791ca678b643</guid>
      <pubDate>Sat, 01 Aug 2026 11:08:11 -0500</pubDate>
      <description><![CDATA[Checked whether firework effects were missing their batching settings. They were not: 2,595 of the 2,606 effect materials already had instancing switched on, including all four firework ones, which share a single shader. The 11 that lacked it are on now for consistency, but they are not the cause. The real number is roughly 2,800 live particle systems at once, with no limit anywhere on how many effects can run together.]]></description>
    </item>
    <item>
      <title>Client: Cleared the last 242 build warnings out of the editor console, left over from the engine…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-5310d88d12d1</guid>
      <pubDate>Sat, 01 Aug 2026 11:09:59 -0500</pubDate>
      <description><![CDATA[Cleared the last <b>242</b> build warnings out of the editor console, left over from the engine upgrade. The bulk of them, 175, are fields the old interface still owns inside saved layouts that no code reads any more. They are kept on purpose so the saved wiring stays intact, so they are marked as expected now rather than deleted. Checking the result meant replaying the compiler command the engine itself runs, because a plain command-line build and the editor console do not agree on what counts as a warning.]]></description>
    </item>
    <item>
      <title>Client: One of those warnings was covering a real bug. The compass strip and the map picture are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-47991c00e165</guid>
      <pubDate>Sat, 01 Aug 2026 11:10:08 -0500</pubDate>
      <description><![CDATA[One of those warnings was covering a real bug. The compass strip and the map picture are drawn by the same code, and it was lining the artwork up twice over: once by hand, once in the engine, which does that step by itself now. The doubling only bites when the game packs that artwork in with other images while running, so it shows on some machines and quality settings and not others, and when it does, the wrong slice of the picture gets drawn. It lines up once now.]]></description>
    </item>
    <item>
      <title>Client: The client had a complete system for simulating distant players more cheaply, switched…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-81a3052119d7</guid>
      <pubDate>Sat, 01 Aug 2026 11:53:24 -0500</pubDate>
      <description><![CDATA[The client had a complete system for simulating distant players more cheaply, switched off with its call commented out, so every other player in the scene was being run at the most expensive setting no matter how far away they were. It is on now, with one change to how it decides.]]></description>
    </item>
    <item>
      <title>Client: The original design cut players off by distance, which bounds how far away they can be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-bcdd3b4a980e</guid>
      <pubDate>Sat, 01 Aug 2026 11:53:24 -0500</pubDate>
      <description><![CDATA[The original design cut players off by distance, which bounds how far away they can be but not how many there are. Everyone inside about 14 metres counted as close, so a packed tavern still ran the expensive path for the whole room. It now also caps the number, nearest first, which means the cost of standing in a crowd of 500 is the cost of standing in a crowd of 15.]]></description>
    </item>
    <item>
      <title>Client: The cap deliberately applies to physics only. The same setting also gated two things you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-12cfc167e91f</guid>
      <pubDate>Sat, 01 Aug 2026 11:53:24 -0500</pubDate>
      <description><![CDATA[The cap deliberately applies to physics only. The same setting also gated two things you can see, the jump and attack animation blend and the model size change, and those still go by distance. With a count cap the sixteenth-nearest player can be three metres in front of you, and freezing their jump animation there would be obvious.]]></description>
    </item>
    <item>
      <title>Client: Also removed a debug line in that switched-off function that wrote once per player per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-a6f8a7faca63</guid>
      <pubDate>Sat, 01 Aug 2026 11:53:24 -0500</pubDate>
      <description><![CDATA[Also removed a debug line in that switched-off function that wrote once per player per frame. With 150 players at six frames a second it would have written about 900 lines a second into the log.]]></description>
    </item>
    <item>
      <title>Client: Reviewing that change caught a problem with it before it went anywhere. Switching off a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-ca19208c756e</guid>
      <pubDate>Sat, 01 Aug 2026 12:27:49 -0500</pubDate>
      <description><![CDATA[Reviewing that change caught a problem with it before it went anywhere. Switching off a distant player's physics also took away the collider that area effect abilities search for, so casting into a crowd would have found only the few players nearest you. The cap now covers the expensive movement work and leaves the collider in place, which was the part actually worth removing.]]></description>
    </item>
    <item>
      <title>Web: Added a SQUIRREL! card explaining what the client performance work is actually in service…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-3e98ecc71816</guid>
      <pubDate>Sat, 01 Aug 2026 11:46:56 -0500</pubDate>
      <description><![CDATA[Added a SQUIRREL! card explaining what the client performance work is actually in service of: a hundred and fifty people in one room with the fireworks going, still dancing. It notes in passing that large fights get the same benefit.]]></description>
    </item>
    <item>
      <title>GM Tools: New Summon window in the GM tool suite: the whole monster library as a filterable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-2e5f1a0b3b6f</guid>
      <pubDate>Sat, 01 Aug 2026 12:16:14 -0500</pubDate>
      <description><![CDATA[New <b>Summon</b> window in the GM tool suite: the whole monster library as a filterable, sortable list showing name, tier and family, with a count, a placement ring, a tier band, the five pre-built encounter groups, and a Clear My Summons button. Before this the only way to summon a creature was typing one of 1,376 prefab paths into the dev console, and that console command is compiled out of release builds, so on a release client there was no way to summon anything at all.]]></description>
    </item>
    <item>
      <title>GM Tools: Added war party presets to the GM Summon window: build a list like 1 lich boss + 5…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-bb38fddde20f</guid>
      <pubDate>Sat, 01 Aug 2026 13:44:04 -0500</pubDate>
      <description><![CDATA[Added war party presets to the GM Summon window: build a list like 1 lich boss + 5 skeleton archers + 10 skeleton warriors, save it under a name such as Lich War Party, and summon the whole group in one click. Presets are plain files that copy between machines.]]></description>
    </item>
    <item>
      <title>GM Tools: GM summons can now drop loot: a Normal loot toggle rolls the creature's own drop table on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-fa64e7fe9121</guid>
      <pubDate>Sat, 01 Aug 2026 13:44:05 -0500</pubDate>
      <description><![CDATA[GM summons can now drop loot: a <b>Normal loot</b> toggle rolls the creature's own drop table on its corpse, and an <b>Extra bundle</b> picker adds one chosen loot bundle on top. Corpses from GM summons used to always open empty.]]></description>
    </item>
    <item>
      <title>GM Tools: Added a My Summons window: every creature a GM has summoned in one list with dismiss…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-0ace1a3a0c06</guid>
      <pubDate>Sat, 01 Aug 2026 13:44:05 -0500</pubDate>
      <description><![CDATA[Added a <b>My Summons</b> window: every creature a GM has summoned in one list with dismiss, heal, +10 levels, and attack-my-target buttons, per creature or all at once. Clicking a row targets the creature in game.]]></description>
    </item>
    <item>
      <title>GM Tools: GM-summoned creatures can no longer be tamed. Tameable species summoned for events were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-ccbf604e5336</guid>
      <pubDate>Sat, 01 Aug 2026 13:44:05 -0500</pubDate>
      <description><![CDATA[GM-summoned creatures can no longer be tamed. Tameable species summoned for events were effectively free max-tier pets.]]></description>
    </item>
    <item>
      <title>GM Tools: Dying to GM event monsters no longer counts as a PvP loss. When the summons out-damage…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-9a88d45c13d9</guid>
      <pubDate>Sat, 01 Aug 2026 13:44:05 -0500</pubDate>
      <description><![CDATA[Dying to GM event monsters no longer counts as a PvP loss. When the summons out-damage every player in the fight there is no ransom; a kill where a player did most of the damage still ransoms as before.]]></description>
    </item>
    <item>
      <title>Client Performance: Creature summon slots are now created on demand instead of 32 being pre-allocated on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-2e8678c9c7f3</guid>
      <pubDate>Sat, 01 Aug 2026 12:16:23 -0500</pubDate>
      <description><![CDATA[Creature summon slots are now created on demand instead of 32 being pre-allocated on every player whose account carries dev, admin or VIP. Those 32 were built on every client that could see that player, so a crowded scene paid for them repeatedly, and the same 32 was also the hard ceiling on how many creatures could be summoned at once. A player who never summons now carries none.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Fixed a client crash that could hit anyone standing near a summoner. When a client could…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-5c82e1e87c55</guid>
      <pubDate>Sat, 01 Aug 2026 12:16:24 -0500</pubDate>
      <description><![CDATA[Fixed a client crash that could hit anyone standing near a summoner. When a client could not match a summoned creature to its owner it logged the failure and then read from the empty result anyway, ending the creature load with an error. The lookup now builds the missing entry, and the read is guarded.]]></description>
    </item>
    <item>
      <title>UI Themes: Retuned window transparency on every UI theme. Obsidian, Fire, and Arcane panels went…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-c6b3d00a21af</guid>
      <pubDate>Sat, 01 Aug 2026 12:20:11 -0500</pubDate>
      <description><![CDATA[Retuned window transparency on every UI theme. Obsidian, Fire, and Arcane panels went from 96 percent opacity to 80 with popups at 88, Classic stepped from 90 to 82, and Air is unchanged. More of the world reads through the glass while the text stays legible; new tests pin the transparency bands and check text contrast composited over worst case scenes.]]></description>
    </item>
    <item>
      <title>UI Themes: New default corner ornament art for themed windows, Quill : the bottom corners keep the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-be07ec058939</guid>
      <pubDate>Sat, 01 Aug 2026 12:20:11 -0500</pubDate>
      <description><![CDATA[New default corner ornament art for themed windows, <b>Quill</b>: the bottom corners keep the engraved flourish, the top corners now carry a small tapered line with a floret, and a tinted chip backs the close, pin, and help buttons. The titlebar buttons no longer sit on dense filigree.]]></description>
    </item>
    <item>
      <title>UI Themes: Fixed the purchase signature line, which borrowed the corner ornament styling and was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-934c48f46294</guid>
      <pubDate>Sat, 01 Aug 2026 12:20:11 -0500</pubDate>
      <description><![CDATA[Fixed the purchase signature line, which borrowed the corner ornament styling and was invisible on the Classic theme. Fixed the ambient glow on modal dialogs, which never animated. The theme editor motion speed slider now covers the full 20 second range that shared theme codes allow; it stopped at 10 before.]]></description>
    </item>
    <item>
      <title>UI Themes: Two new controls on the Options Themes tab: a Window Opacity slider from 30 to 120…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-af064aac4e86</guid>
      <pubDate>Sat, 01 Aug 2026 12:34:40 -0500</pubDate>
      <description><![CDATA[Two new controls on the Options Themes tab: a <b>Window Opacity</b> slider from 30 to 120 percent that sets how solid every window background is on any theme (text and frames stay fully visible), and a <b>Corner Ornaments</b> dropdown that turns the decorative corner art off on stock themes, which used to require saving a custom theme first. Both apply live and stack with custom themes.]]></description>
    </item>
    <item>
      <title>UI Themes: The Corner Ornaments option grew into a style pick: Quill (the quiet default), Flourish…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-b1b76c7f31ea</guid>
      <pubDate>Sat, 01 Aug 2026 12:42:51 -0500</pubDate>
      <description><![CDATA[The Corner Ornaments option grew into a style pick: <b>Quill</b> (the quiet default), <b>Flourish</b> (the older full filigree), the new <b>Rail</b> (a thin double line frame with corner diamonds), or Off, on any theme including Classic, which never had corner art before. Custom themes can also carry an ornament size now; the size control arrives with the theme editor rework.]]></description>
    </item>
    <item>
      <title>UI Themes: Window backgrounds can now carry a texture: a Backing Pattern pick on the Options Themes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-807d98165acf</guid>
      <pubDate>Sat, 01 Aug 2026 12:57:50 -0500</pubDate>
      <description><![CDATA[Window backgrounds can now carry a texture: a <b>Backing Pattern</b> pick on the Options Themes tab offers Parchment, Leather, Smoke, Sigil (a centered chaos star watermark), or Glass on any theme. The textures derive from the game's own book and window art and combine with every theme color, the opacity slider, and custom themes.]]></description>
    </item>
    <item>
      <title>UI Themes: Every window can now carry its own opacity: right-click a window's title bar for a small…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-06f05678b2a1</guid>
      <pubDate>Sat, 01 Aug 2026 13:09:35 -0500</pubDate>
      <description><![CDATA[Every window can now carry its own opacity: right-click a window's title bar for a small popup with a 15 to 100 percent slider and a Reset to Global button, so chat can run glassier than inventory. The setting saves per window, combines with the theme and the global Window Opacity slider, and a new <b>Reset Window Layout</b> button in Options clears all saved window positions, sizes, and per-window opacity.]]></description>
    </item>
    <item>
      <title>UI Themes: The Theme Editor window moved onto the shared window chrome: it now remembers its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-5faf67fbd158</guid>
      <pubDate>Sat, 01 Aug 2026 13:37:27 -0500</pubDate>
      <description><![CDATA[The Theme Editor window moved onto the shared window chrome: it now remembers its position and size, clamps to the screen like every other window, and stopped leaking gameplay keys, so dragging a color slider no longer walks your character or fires hotbar binds. Unsaved edits also survive now: the editor auto-stashes your working theme and restores it the next time it opens, after a logout or a crash included.]]></description>
    </item>
    <item>
      <title>UI Themes: The Theme Editor got a Simple view: pick an accent color, a text tone, a surface color…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-81883f125e41</guid>
      <pubDate>Sat, 01 Aug 2026 13:49:54 -0500</pubDate>
      <description><![CDATA[The Theme Editor got a <b>Simple</b> view: pick an accent color, a text tone, a surface color and opacity, a backing pattern, an ornament style and size, fonts, and motion, and the editor derives the full 49-color set for you. The old full color list lives on in an <b>Advanced</b> view with a search filter, a visible selected row, Reset All, and Revert to Saved. Controls that Advanced edits have diverged from show a (custom) marker instead of lying about their state.]]></description>
    </item>
    <item>
      <title>Docs: Wrote up the UI theme overhaul in the skins doc (opacity system, ornament styles, backing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-03e37ad681cc</guid>
      <pubDate>Sat, 01 Aug 2026 13:51:45 -0500</pubDate>
      <description><![CDATA[Wrote up the UI theme overhaul in the skins doc (opacity system, ornament styles, backing patterns, per-window opacity, the editor rebuild) and added the shipped entry to the roadmap.]]></description>
    </item>
    <item>
      <title>Quests: Reset Quest State no longer erases the places a character has discovered. The reset…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-71a13d5c7a98</guid>
      <pubDate>Sat, 01 Aug 2026 16:41:08 -0500</pubDate>
      <description><![CDATA[Reset Quest State no longer erases the places a character has discovered. The reset rebuilt the character's knowledge list from a short keep-list and dropped everything else, and discovered maps and arrival points sit in that same list, so a reset wiped the whole teleport destination list along with the quest progress. Discovered places are now kept through a reset; journal entries, quest flags, and quest items are still cleared.]]></description>
    </item>
    <item>
      <title>Quests: Added nine editor tests over the quest reset filter covering what it keeps and what it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-08-01-0bebaa9f87f2</guid>
      <pubDate>Sat, 01 Aug 2026 16:41:15 -0500</pubDate>
      <description><![CDATA[Added nine editor tests over the quest reset filter covering what it keeps and what it clears, plus the value clamping the changed branch touches. The existing bot test seeded only NPC-style flags, which is why the travel loss went unnoticed, so it now seeds and checks a discovered map and an arrival point as well.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-31</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-headlines</guid>
      <pubDate>Fri, 31 Jul 2026 14:14:18 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Right-clicking an enemy sends your pet at it again, from anywhere on screen and on the very first click after a camera swing.</li>
        <li>World text got a readability pass. Nameplates, speech bubbles and overworld town labels are drawn from fonts baked at twice the detail, with the heavy black outline and the synthetic bold both cut back.</li>
        <li>The skill training tracker looks like its old self again: icon-only rows with the sliding <b>Level Up!</b> reveal restored</li>
        <li>The typing cursor now sits where the text lands. In most entry boxes it drew high and the first letter you typed dropped below it, by 3 pixels on ordinary boxes and 30 in the big multi-line ones.</li>
        <li>Double-click now equips gear, and rings fill the first open slot or a per-ring preferred slot set from the right-click menu.</li>
        <li>The <strong>Remember User Name</strong> box on the login screen works again, and the setting now survives a patch instead of being thrown away every time the game updated.</li>
        <li>The test suite is green end to end for the first time in weeks, and clearing it turned up four real bugs the red tail had been hiding.</li>
        <li>Dragged items stay in front of open windows again, including bottles, chairs and anything else that doubles as a decoration.</li>
        <li>The character window got its rework: a much larger character model, slot silhouette icons back in the gear slots, and bottom tabs for Stats, XP, Pet, and Titles.</li>
        <li>Ten visible bots ran on a test shard for ten minutes without a drop and set off 481 fireworks, after a first run turned up three connection bugs.</li>
        <li>The <code>/fps</code> window now breaks the frame down into CPU, render thread and GPU time, and its graph splits every column into a processor bar and a graphics bar so you can see which side caused a spike.</li>
        <li>A profiling build of the client landed, with in-game capture and a readable report, so we can finally measure where client frame time goes in a crowded scene on the test shard.</li>
        <li>Names in angle brackets read as themselves again on the new interface: a pet's owner, a guild beside a character name, the lot list status rows. The bracket had been rewritten to an HTML entity as an injection guard, and UI Toolkit never decodes one.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Filed five new wishlist ideas from the forum: knight tournaments, a PvP…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-9ee3e5056a44</guid>
      <pubDate>Fri, 31 Jul 2026 05:17:28 -0500</pubDate>
      <description><![CDATA[Filed five new wishlist ideas from the forum: knight tournaments, a PvP collision-encounter idea, splitting off a PvP server, rare unique mob drops, and a UO Doom dungeon recreation.]]></description>
    </item>
    <item>
      <title>User Interface: Right-clicking a creature itself opens its menu again, wherever the creature happens to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-27c554dc31b8</guid>
      <pubDate>Fri, 31 Jul 2026 06:07:40 -0500</pubDate>
      <description><![CDATA[Right-clicking a creature itself opens its menu again, wherever the creature happens to be on screen. The game was deciding what the menu should be about a couple of frames after the button came up, and by then the pointer had been moved back from the middle of the screen, where it sits hidden for as long as the right button is held. A creature near the middle usually still worked and one off to the side opened nothing. The menu is now built from what you were pointing at when you pressed.]]></description>
    </item>
    <item>
      <title>User Interface: The first right-click after a camera swing no longer gets thrown away. Right-dragging…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-e4fa11fce831</guid>
      <pubDate>Fri, 31 Jul 2026 06:07:46 -0500</pubDate>
      <description><![CDATA[The first right-click after a camera swing no longer gets thrown away. Right-dragging turns the camera, and the game refuses a menu when you have done that, but the leftover turn from the last drag was being charged to the next click before the mouse had moved at all. Half a unit of it was enough. Camera turns now start from a stop, which also removes a small jolt at the beginning of every one.]]></description>
    </item>
    <item>
      <title>User Interface: The Remember User Name box on the login screen works again. Ticking it had stopped…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-80438d192f8f</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:29 -0500</pubDate>
      <description><![CDATA[The Remember User Name box on the login screen works again. Ticking it had stopped filling your name back in, and logging in from that blank screen also wiped the name the game had stored, so it could never come back on a later launch.]]></description>
    </item>
    <item>
      <title>User Interface: Your login choice is now written to disk the moment you press Log In. It used to wait…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-b44dbe87ad4a</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:30 -0500</pubDate>
      <description><![CDATA[Your login choice is now written to disk the moment you press Log In. It used to wait until the game shut down properly, which is exactly what did not happen on patch day, so the setting was lost every time the game updated.]]></description>
    </item>
    <item>
      <title>User Interface: The password box stays empty on every build. A remembered user name no longer brings a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-0472c1a44e26</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:31 -0500</pubDate>
      <description><![CDATA[The password box stays empty on every build. A remembered user name no longer brings a stored password along with it.]]></description>
    </item>
    <item>
      <title>User Interface: Dragging an item now draws it in front of every open window. Anything that can double as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-e4830be93e2a</guid>
      <pubDate>Fri, 31 Jul 2026 08:46:25 -0500</pubDate>
      <description><![CDATA[Dragging an item now draws it in front of every open window. Anything that can double as a decoration was drawn on the older interface layer whenever you stood on a lot you could decorate, so moving one between two open containers left it hidden behind the window it was crossing.]]></description>
    </item>
    <item>
      <title>User Interface: The dragged icon now picks which layer draws it every frame, from where the cursor is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-a0c9f0ec7a8a</guid>
      <pubDate>Fri, 31 Jul 2026 08:46:34 -0500</pubDate>
      <description><![CDATA[The dragged icon now picks which layer draws it every frame, from where the cursor is rather than from the item. Dropping a decoration out in the world still shows the placement preview and the permission text exactly as before, and the choice is covered by seven new editor tests.]]></description>
    </item>
    <item>
      <title>Crafting: Double-clicking a recipe at a crafting station no longer brings the chat window to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-f36ce0cd4d44</guid>
      <pubDate>Fri, 31 Jul 2026 06:38:20 -0500</pubDate>
      <description><![CDATA[Double-clicking a recipe at a crafting station no longer brings the chat window to the front of the station you are working at. The same now goes for craft results, queue messages, repairs and salvage.]]></description>
    </item>
    <item>
      <title>Crafting: Those messages still go to the chat log and can be searched back later. The crafting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-8eb3dc412f49</guid>
      <pubDate>Fri, 31 Jul 2026 06:38:21 -0500</pubDate>
      <description><![CDATA[Those messages still go to the chat log and can be searched back later. The crafting window shows the last three of them itself, under the crafting summary, with problems in the same red the recipe cards use for materials you are short of.]]></description>
    </item>
    <item>
      <title>Crafting: The lines about individual materials being used up during a craft stay in chat. A…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-6c4c290ae3b1</guid>
      <pubDate>Fri, 31 Jul 2026 06:38:22 -0500</pubDate>
      <description><![CDATA[The lines about individual materials being used up during a craft stay in chat. A ten-ingredient recipe produces ten of them and they would push the result sentence out of the readout.]]></description>
    </item>
    <item>
      <title>Tooling: The nightly job that reads the forum wishlist board missed a night after a restart left…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-7501d9a9ccf6</guid>
      <pubDate>Fri, 31 Jul 2026 05:21:07 -0500</pubDate>
      <description><![CDATA[The nightly job that reads the forum wishlist board missed a night after a restart left this machine sitting at the login screen. Its schedule now retries a missed run once the machine is back, and the task setup is checked into the repo instead of being configured by hand.]]></description>
    </item>
    <item>
      <title>Tooling: Our test bots can now stand in the world as ordinary player characters. Until today they…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-c525000246b1</guid>
      <pubDate>Fri, 31 Jul 2026 08:07:42 -0500</pubDate>
      <description><![CDATA[Our test bots can now stand in the world as ordinary player characters. Until today they logged in, held their connections and counted toward a shard's population, but they had no body, so anyone standing in the same scene saw an empty room. They now spawn a character, spread out around a chosen spot, and set off fireworks on a timer.]]></description>
    </item>
    <item>
      <title>Tooling: The bots take the same route through the game a player does: each one joins the instance…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-f75b8f1f796e</guid>
      <pubDate>Fri, 31 Jul 2026 08:07:52 -0500</pubDate>
      <description><![CDATA[The bots take the same route through the game a player does: each one joins the instance players are already in, gives itself a firework, uses it, and consumes it. The launcher that spreads bots across test machines drives the new mode too, so a display can be run from any of them.]]></description>
    </item>
    <item>
      <title>Tooling: First live run of the visible test bots, ten of them against a test shard from a Linux…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-400886c5f6b6</guid>
      <pubDate>Fri, 31 Jul 2026 09:32:09 -0500</pubDate>
      <description><![CDATA[First live run of the visible test bots, ten of them against a test shard from a Linux box. Three bugs surfaced in a row: the logging connection used a fixed port number so no bot ever finished connecting, an inventory reply the bots never listened for killed each session about twelve seconds in, and the avatar's identifier went out in the wrong form. With those fixed, ten bots held for ten minutes with no drops and set off 481 fireworks.]]></description>
    </item>
    <item>
      <title>Tooling: Ten bots cost the machine running them almost nothing: about 114 MB of memory between…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-9abd2cbc4d04</guid>
      <pubDate>Fri, 31 Jul 2026 09:32:10 -0500</pubDate>
      <description><![CDATA[Ten bots cost the machine running them almost nothing: about 114 MB of memory between them, a sixth of one processor core, and roughly 95 kbit/s of traffic. The game server stayed near idle throughout.]]></description>
    </item>
    <item>
      <title>Decorating: Resizing a decoration showed two size readouts: the real one, and a second panel pinned…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-ff8e37e89202</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:16 -0500</pubDate>
      <description><![CDATA[Resizing a decoration showed two size readouts: the real one, and a second panel pinned over your own avatar and name plate that always read the same wrong number. The second one was a leftover panel from the old interface carrying placeholder text a prefab save had captured years ago; it appeared alongside every decorating message, not just resizing. Removed, along with the placeholder itself.]]></description>
    </item>
    <item>
      <title>User Interface: Re-cut the fonts behind world text: the name over a character, the title and guild lines…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-cc3559823b80</guid>
      <pubDate>Fri, 31 Jul 2026 06:40:56 -0500</pubDate>
      <description><![CDATA[Re-cut the fonts behind world text: the name over a character, the title and guild lines under it, speech bubbles, and overworld town labels. All three faces were baked at 46pt (one into a 512x256 sheet); they are now 90pt into sheets up to 2048x2048, so letters hold their shape when you walk right up to someone.]]></description>
    </item>
    <item>
      <title>User Interface: Took the weight back out of that text. The synthetic bold went from 0.75 to 0.1, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-ab411a882a9b</guid>
      <pubDate>Fri, 31 Jul 2026 06:40:56 -0500</pubDate>
      <description><![CDATA[Took the weight back out of that text. The synthetic bold went from 0.75 to 0.1, the black outline from 0.386 down to 0.15 (party plates were at 0.5, the maximum the shader allows), and sharpening is now switched on. It had never been written into the materials, so it had been sitting at zero.]]></description>
    </item>
    <item>
      <title>User Interface: Lightened the shading down each letter from 28% grey at the bottom to 65%, and turned on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-3f82155ee29c</guid>
      <pubDate>Fri, 31 Jul 2026 06:40:56 -0500</pubDate>
      <description><![CDATA[Lightened the shading down each letter from 28% grey at the bottom to 65%, and turned on the extra padding that keeps an outline from being clipped at the edge of a glyph.]]></description>
    </item>
    <item>
      <title>User Interface: Added a thin-outline material and wired it into the world label font registry. That slot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-a3cfb1590f91</guid>
      <pubDate>Fri, 31 Jul 2026 06:40:56 -0500</pubDate>
      <description><![CDATA[Added a thin-outline material and wired it into the world label font registry. That slot had been empty, and the lookup falls through to the thick outline when it is, so labels authored with a 1px outline had been drawing with the heavy one.]]></description>
    </item>
    <item>
      <title>User Interface: Added six tests over the world text materials. They pin the outline and bold ceilings and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-88079f2bff25</guid>
      <pubDate>Fri, 31 Jul 2026 06:40:56 -0500</pubDate>
      <description><![CDATA[Added six tests over the world text materials. They pin the outline and bold ceilings and check that each material still agrees with its font atlas on gradient scale and texture size, which is what catches a font re-bake that only got half finished.]]></description>
    </item>
    <item>
      <title>User Interface: Same name, same size, same position. Left is what shipped, right is what the next build…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-095f0c44476e</guid>
      <pubDate>Fri, 31 Jul 2026 06:41:08 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/world-text-nameplate-before.png" data-full="https://catnipgames.net/blog/images/world-text-nameplate-before.png" data-cap="Before: 46pt source, 0.386 black outline, synthetic bold at 0.75, and a 28% grey fade across the bottom of each letter."><img src="https://catnipgames.net/blog/images/world-text-nameplate-after.png" data-full="https://catnipgames.net/blog/images/world-text-nameplate-after.png" data-cap="After: 90pt source, 0.15 outline, bold at 0.1, sharpening on, and the bottom shading raised to 65%."></span> Same name, same size, same position. Left is what shipped, right is what the next build draws.]]></description>
    </item>
    <item>
      <title>Launcher: The launcher now asks the game to close itself before an update instead of closing the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-27aa0233a548</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:38 -0500</pubDate>
      <description><![CDATA[The launcher now asks the game to close itself before an update instead of closing the window and killing the process eight seconds later. The game shuts down through its normal quit path, so a character in world sits out the logout timer first and nothing you changed that session is thrown away.]]></description>
    </item>
    <item>
      <title>Launcher: The wait before a forced close went from 8 to 45 seconds to leave room for that logout…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-c0b6e0675f9e</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:39 -0500</pubDate>
      <description><![CDATA[The wait before a forced close went from 8 to 45 seconds to leave room for that logout timer. Anything still running at the end is still closed the old way.]]></description>
    </item>
    <item>
      <title>Launcher: Settings survive a reset of the local settings file again. The game stamps a version into…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-629fa6cca9b2</guid>
      <pubDate>Fri, 31 Jul 2026 08:02:40 -0500</pubDate>
      <description><![CDATA[Settings survive a reset of the local settings file again. The game stamps a version into that file when it clears it, and the stamp was being written without being saved, so a game that ended badly could clear every setting once more on the next launch.]]></description>
    </item>
    <item>
      <title>UI: Skill training tracker went back to its compact look: each tracked skill is just its icon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-f33c72898a3c</guid>
      <pubDate>Fri, 31 Jul 2026 07:35:44 -0500</pubDate>
      <description><![CDATA[Skill training tracker went back to its compact look: each tracked skill is just its icon with a thin green experience bar along the bottom edge, and the always-on name and level text from the UI Toolkit conversion are gone. The skill name still shows on hover.]]></description>
    </item>
    <item>
      <title>UI: Restored the level-up reveal on the tracker: the icon slides left and a panel with Level…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-5efe87f34f63</guid>
      <pubDate>Fri, 31 Jul 2026 07:35:45 -0500</pubDate>
      <description><![CDATA[Restored the level-up reveal on the tracker: the icon slides left and a panel with <b>Level Up!</b> and the new level fades in, holds five seconds, then slides back. Level downs show the same panel in red, and a green +1 counter marks levels gained this session. Filed tester task #3011.]]></description>
    </item>
    <item>
      <title>UI: Fixed the typing cursor sitting higher than the text in most entry boxes. Clicking into…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-caad7642bde4</guid>
      <pubDate>Fri, 31 Jul 2026 07:46:29 -0500</pubDate>
      <description><![CDATA[Fixed the typing cursor sitting higher than the text in most entry boxes. Clicking into an empty box put the cursor near the top of the field, and the first character you typed then landed lower than the cursor had shown. The two now share the same line, so there is no jump.]]></description>
    </item>
    <item>
      <title>UI: The offset measured 3 pixels on an ordinary single-line box and 30 pixels in the large…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-708482a4f600</guid>
      <pubDate>Fri, 31 Jul 2026 07:46:39 -0500</pubDate>
      <description><![CDATA[The offset measured 3 pixels on an ordinary single-line box and 30 pixels in the large multi-line ones used for guild descriptions, item text and book pages. Those multi-line boxes also start their text at the top of the box now rather than floating it in the middle.]]></description>
    </item>
    <item>
      <title>UI: Added two regression tests for the cursor offset: one reads the shared interface theme…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-a5555cae149f</guid>
      <pubDate>Fri, 31 Jul 2026 07:46:45 -0500</pubDate>
      <description><![CDATA[Added two regression tests for the cursor offset: one reads the shared interface theme, the other stands real entry boxes up on a live panel and measures where the cursor sits against where the text draws.]]></description>
    </item>
    <item>
      <title>UI: Double-clicking equipment in your inventory now equips it. Loot and bank containers still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-921c162d8992</guid>
      <pubDate>Fri, 31 Jul 2026 07:48:10 -0500</pubDate>
      <description><![CDATA[Double-clicking equipment in your inventory now equips it. Loot and bank containers still take the item instead.]]></description>
    </item>
    <item>
      <title>UI: Rings fill the first open ring slot on double-click instead of always replacing the left…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-c82a9a1211db</guid>
      <pubDate>Fri, 31 Jul 2026 07:48:10 -0500</pubDate>
      <description><![CDATA[Rings fill the first open ring slot on double-click instead of always replacing the left one, and the right-click menu can give a ring a preferred slot (left, right, or none). A preferred ring always equips into its slot, swapping out whatever is worn there, and the preference is saved on the ring itself.]]></description>
    </item>
    <item>
      <title>UI: Chased the skill tracker report that rows vanish after a level up: live traces showed the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-3cf3d1d2fbe5</guid>
      <pubDate>Fri, 31 Jul 2026 08:31:37 -0500</pubDate>
      <description><![CDATA[Chased the skill tracker report that rows vanish after a level up: live traces showed the row stack itself is sound, but the reveal animation could collapse into a single frame when the level-up moment hitched, and the first level up of a session played before the row finished building. Both fixed: the slide now always animates over several frames and waits for the row to exist.]]></description>
    </item>
    <item>
      <title>UI: Tracker polish from the original prefab data: the +N session counter got its 1px black…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-f60bd4e20839</guid>
      <pubDate>Fri, 31 Jul 2026 08:31:37 -0500</pubDate>
      <description><![CDATA[Tracker polish from the original prefab data: the +N session counter got its 1px black outline back, the notification panel text inset matches the old bracket, and queued level-ups advance at the original pace again.]]></description>
    </item>
    <item>
      <title>UI: The /fps window now reports CPU, render thread and GPU milliseconds alongside the frame…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-3651d61cff61</guid>
      <pubDate>Fri, 31 Jul 2026 09:51:27 -0500</pubDate>
      <description><![CDATA[The <code>/fps</code> window now reports CPU, render thread and GPU milliseconds alongside the frame rate, so a slow scene tells you which half of the machine is the limit. CPU is measured as real main thread work with the wait for the display subtracted, because a frame rate cap or vertical sync otherwise pins that number to the cap and makes an idling machine look processor bound.]]></description>
    </item>
    <item>
      <title>UI: The frame time graph under those numbers split in two. Each column used to be one bar for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-66fefdb55d71</guid>
      <pubDate>Fri, 31 Jul 2026 09:51:34 -0500</pubDate>
      <description><![CDATA[The frame time graph under those numbers split in two. Each column used to be one bar for the whole frame; it now carries a processor bar and a graphics bar side by side across the same fifteen seconds of history, so a spike shows which side caused it. They sit beside each other rather than stacked because the two run at the same time, and adding them would show a frame time neither one spent. Machines whose drivers report no graphics timing show dashes instead of a misleading zero.]]></description>
    </item>
    <item>
      <title>Engineering: The automated test suite is fully green for the first time in weeks: 7108 passing, none…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-75b8a5a1fa49</guid>
      <pubDate>Fri, 31 Jul 2026 08:17:09 -0500</pubDate>
      <description><![CDATA[The automated test suite is fully green for the first time in weeks: 7108 passing, none failing. The red tail had been carried long enough that its size kept changing, which is how a real problem hides in it.]]></description>
    </item>
    <item>
      <title>Engineering: Four of the sixteen were the tests being right and the code being wrong. The character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-120662be3dd3</guid>
      <pubDate>Fri, 31 Jul 2026 08:17:10 -0500</pubDate>
      <description><![CDATA[Four of the sixteen were the tests being right and the code being wrong. The character sheet never actually shrank its equipment slots on a short window, so the bottom of the taller column stayed cut off; the fix that was supposed to do it had been left disabled on the line that applies the size.]]></description>
    </item>
    <item>
      <title>Engineering: The conversation editor accepted names on macOS that Windows cannot store, because it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-6336c81ede64</guid>
      <pubDate>Fri, 31 Jul 2026 08:17:11 -0500</pubDate>
      <description><![CDATA[The conversation editor accepted names on macOS that Windows cannot store, because it asked the machine it was running on which characters were legal. It now uses the strictest rule wherever it runs, so a name written on one machine still opens on the other.]]></description>
    </item>
    <item>
      <title>Engineering: Five audio, Steam and mouse plugin settings claimed macOS support for binaries that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-35ae3ea9f534</guid>
      <pubDate>Fri, 31 Jul 2026 08:17:12 -0500</pubDate>
      <description><![CDATA[Five audio, Steam and mouse plugin settings claimed macOS support for binaries that cannot run on an Apple Silicon Mac. Turning that off changes nothing in the shipped client, which was already leaving them out, but it stops a later change from quietly shipping a library that cannot load.]]></description>
    </item>
    <item>
      <title>Testing: The Duplicate button in the tester panel copies the items you have highlighted. In the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-521f072dcfc6</guid>
      <pubDate>Fri, 31 Jul 2026 08:39:26 -0500</pubDate>
      <description><![CDATA[The <strong>Duplicate</strong> button in the tester panel copies the items you have highlighted. In the backpack, bank and container windows it had been copying whichever item most recently arrived in the bag, so moving anything in or out changed what the button acted on.]]></description>
    </item>
    <item>
      <title>Testing: The status line under that button now names the items it copied, and the same selection…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-ec9edbfe8dd2</guid>
      <pubDate>Fri, 31 Jul 2026 08:39:34 -0500</pubDate>
      <description><![CDATA[The status line under that button now names the items it copied, and the same selection fix covers the crafting station, quest turn-in, mail attachment, decoration palette and jukebox lists.]]></description>
    </item>
    <item>
      <title>Character Sheet: The character window's paper doll now fills its frame. The render textures were square…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-f2843178b80b</guid>
      <pubDate>Fri, 31 Jul 2026 09:24:15 -0500</pubDate>
      <description><![CDATA[The character window's paper doll now fills its frame. The render textures were square while the visible window area is portrait shaped, so the model floated small in letterboxed space; the local and inspect textures went to 640x1024 and the model draws 20 to 30 percent taller at typical window sizes.]]></description>
    </item>
    <item>
      <title>Character Sheet: Empty gear slots show their silhouette icons again (helmet, ring, boot and the rest)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-4eb3c5cf94e5</guid>
      <pubDate>Fri, 31 Jul 2026 09:24:15 -0500</pubDate>
      <description><![CDATA[Empty gear slots show their silhouette icons again (helmet, ring, boot and the rest), restored from the old interface's per slot art. Slots that never had art, like crafting tools and pet gear, keep the text label. The mannequin and doll cabinet windows picked up the same silhouettes.]]></description>
    </item>
    <item>
      <title>Character Sheet: The Show More button was replaced with tabs along the bottom of the window: Character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-18d2cbd87587</guid>
      <pubDate>Fri, 31 Jul 2026 09:24:15 -0500</pubDate>
      <description><![CDATA[The Show More button was replaced with tabs along the bottom of the window: Character, Stats, XP, Pet, and Titles. Stats carries everything Show More had plus weapon damage, spell damage, and new Attunements, Resistances, and Masteries sections. XP shows both experience pools, Pet shows your active pet's numbers and behavior, and Titles switches your active title in place. The window reopens on the tab you left it on, and the inspect and pet sheets carry Character and Stats tabs. Covered by 23 new EditMode tests.]]></description>
    </item>
    <item>
      <title>Character Sheet: A review pass over the new tabs caught four problems before they shipped to chaos: a dye…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-b2517f7cbb68</guid>
      <pubDate>Fri, 31 Jul 2026 09:51:46 -0500</pubDate>
      <description><![CDATA[A review pass over the new tabs caught four problems before they shipped to chaos: a dye preview started before the window finished building could open on the wrong tab and hide the character being dyed, the resize grip ate clicks on the right end of the last tab, the XP tab's progress row mixed lifetime totals with a within level percent so its two numbers disagreed, and mastery tooltips carried a stray blank line. All four fixed.]]></description>
    </item>
    <item>
      <title>UI: A pet or summon shows its owner's name in angle brackets. Hovering a debuff the pet had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-bdb34069a4dc</guid>
      <pubDate>Fri, 31 Jul 2026 11:50:04 -0500</pubDate>
      <description><![CDATA[A pet or summon shows its owner's name in angle brackets. Hovering a debuff the pet had applied printed that owner line as <code>&amp;lt;Name&amp;gt;</code>, four extra characters on each side, while the nameplate over the same pet read it correctly. The text converter for the new interface was rewriting a bracket to an HTML entity to stop typed text from injecting formatting, and UI Toolkit reads formatting tags but never decodes entities, so the rewrite went straight to the screen. It now wedges a zero-width space behind the bracket instead, which is what the world-space converter has always done. Measured on a live panel, the name draws 66.0px either way, against 100.0px for the escaped form.]]></description>
    </item>
    <item>
      <title>Build pipeline: The client we ship to chaos is built optimised, so Unity's profiler cannot attach to it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-c7c4eb404076</guid>
      <pubDate>Fri, 31 Jul 2026 10:59:03 -0500</pubDate>
      <description><![CDATA[The client we ship to chaos is built optimised, so Unity's profiler cannot attach to it and the frame-timing capture already in the client reported zeros for every measurement. There is now a separate profiling build of the client that the profiler can attach to. It is downloaded by hand from its build page and is refused by the publisher on every patch channel, so it can never reach players.]]></description>
    </item>
    <item>
      <title>Build pipeline: Recording a profile happens from inside the game. A command records a fixed stretch of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-6251a3935b02</guid>
      <pubDate>Fri, 31 Jul 2026 10:59:09 -0500</pubDate>
      <description><![CDATA[Recording a profile happens from inside the game. A command records a fixed stretch of seconds and writes the capture beside the client, so a scene that only struggles when it is full of players and spell effects can be caught while it is struggling, rather than guessing at launch which scene will be the bad one. A second tool turns that recording into a ranked list of where the frame spent its time, so a capture can be read, filed and compared without opening the profiler.]]></description>
    </item>
    <item>
      <title>Build pipeline: The profiling build runs on its own copy of the source tree so it can build alongside the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-c5614968b44f</guid>
      <pubDate>Fri, 31 Jul 2026 10:59:16 -0500</pubDate>
      <description><![CDATA[The profiling build runs on its own copy of the source tree so it can build alongside the nightly release instead of queueing behind it. One Unity project cannot host two builds at once, so parallel work needs a second tree rather than a second worker. The two builds do share one thing on the machine, the editor's licensing helper, which each build restarts before it launches; a lock now keeps them out of each other's way for those few minutes and lets the rest of the two builds overlap.]]></description>
    </item>
    <item>
      <title>Server: Raised every test-shard account to 3 character slots. The account system computes the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-31-f97099d0942a</guid>
      <pubDate>Fri, 31 Jul 2026 14:13:18 -0500</pubDate>
      <description><![CDATA[Raised every test-shard account to 3 character slots. The account system computes the slot count from purchase and pledge records at each login, and the rebuilt test accounts have none of those, so the count bottomed out at 1 and testers could only keep one character. The shard now adds 2 slots on top of whatever the account system reports, applied during server config assembly so it survives every deploy.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-30</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-headlines</guid>
      <pubDate>Thu, 30 Jul 2026 21:13:33 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The 2,500-player scale push began: a full server audit, a four-week plan with a staged bot-load ladder, the first fixes, and the login gate raised from 16 to 2,500, all in the same day.</li>
        <li><strong>Items inside a house can no longer be reached from outside it.</strong> Window openings have no collision in almost every house, so distance-only interaction let anyone in the yard work the containers in the room. Interaction now compares which side of the shell you are on. Owners and anyone they have granted rights to are unaffected.</li>
        <li>Every dungeon has a 3D map now: the whole pipeline went from design to a 59-dungeon fleet in one day. Press M in any dungeon, sewer or mine and a see-through model fills in as you explore, with your position glowing inside it.</li>
        <li><b>NPCs stopped calling everyone "outlander".</b> Two thirds of the voiced cast said it out loud no matter what their written line read, and the word they were supposed to use was sitting in their character data the whole time. A guard who calls you "friend" on screen now says "friend".</li>
        <li>Decorating gained a <strong>Tighter Fit</strong> mode: the item you are placing gets a 25% narrower collision so furniture finally sits where you want it. Placement only, and containers, crafting stations, and planting beds keep their full footprint.</li>
        <li>The <strong>guide light</strong> went from code nobody could reach to a feature you can use: click a map marker in a town and a light leads you there, one corner at a time.</li>
        <li>The Mac launcher installed a copy of itself instead of the game. Fixed, verified end to end on a Mac, and build 25 is on the tester page.</li>
        <li>NPC conversation text reads properly again: topic words sit inline in the sentence instead of stranded on a line of their own, and a reply keeps its colour to the end.</li>
        <li>Destroying several selected items at once works again across the backpack, containers, the bank and the crafting table.</li>
        <li>Vendor listings no longer open two windows at once, and the old one is gone from the corner of the screen.</li>
        <li>Floating names take clicks again: click one to target, right-click one for the menu that sends your pet in.</li>
        <li>Five faults in the Edit Deck window fixed in one pass, including a Bard school that never had a filter box.</li>
        <li>Crafting: fixed a long-standing defect where clicking a recipe mid-batch pulled your ingredients back off the table, and started moving recipe matching off the server round trip.</li>
        <li>Crafting: the batch queue works end to end. Stack recipes onto a running craft and walk away.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed five wishlist ideas: alphabetizing the crafter book, an 8-part…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1977eca9e315</guid>
      <pubDate>Thu, 30 Jul 2026 03:24:02 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed five wishlist ideas: alphabetizing the crafter book, an 8-part Death Magic rebalance series, a resizable/previewable heraldry-art tool, a hotkey to clone a placed deco item stack, and a visual marker for a scene's default entrance.]]></description>
    </item>
    <item>
      <title>Quests: Players can reset their own quest progress again on the test shard. The option has been…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a4a4cf2aa678</guid>
      <pubDate>Thu, 30 Jul 2026 04:11:57 -0500</pubDate>
      <description><![CDATA[Players can reset their own quest progress again on the test shard. The option has been in the game the whole time, on the character select screen under Character Options, but a character got one reset and then the button vanished for good. The limit was tied to a date that stopped being moved forward in 2022, so anyone who had used their reset was locked out permanently.]]></description>
    </item>
    <item>
      <title>Quests: Lifted the cap on the test shard so a character can reset as many times as needed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c7d8bfe90980</guid>
      <pubDate>Thu, 30 Jul 2026 04:11:58 -0500</pubDate>
      <description><![CDATA[Lifted the cap on the test shard so a character can reset as many times as needed. Testers no longer have to roll a new character to replay quest content. A reset still clears quest progress and destroys quest items, so it is a deliberate choice rather than a casual one.]]></description>
    </item>
    <item>
      <title>Quests: Wrote down how the reset actually works while it was fresh: which setting hides the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-659bf3a1a4f6</guid>
      <pubDate>Thu, 30 Jul 2026 04:11:59 -0500</pubDate>
      <description><![CDATA[Wrote down how the reset actually works while it was fresh: which setting hides the button, where the test-shard override has to live so a redeploy does not wipe it, and the fact that a second, older re-reset path built around a token item was already dead and could never have worked.]]></description>
    </item>
    <item>
      <title>Maps: Dungeon maps are changing direction: instead of flat floor plans, each dungeon will get…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9b0458518d42</guid>
      <pubDate>Thu, 30 Jul 2026 03:36:43 -0500</pubDate>
      <description><![CDATA[Dungeon maps are changing direction: instead of flat floor plans, each dungeon will get an auto-generated see-through 3D model of its shape, shown on the map window with your position inside it and fog of war that fills in as you explore. All levels of a multi-level dungeon like The Rise read at once. Design and docs landed today; The Rise is the pilot.]]></description>
    </item>
    <item>
      <title>Maps: The 3D dungeon map went from design to a working pilot in one pass. A new bake tool turns…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c8b91cd1381d</guid>
      <pubDate>Thu, 30 Jul 2026 04:25:16 -0500</pubDate>
      <description><![CDATA[The 3D dungeon map went from design to a working pilot in one pass. A new bake tool turns each dungeon's navigation mesh into a small see-through model: The Rise's 150,000 triangles of navmesh become a 7,050-triangle map split across its four floors, with fog-of-war cells stamped into the mesh so the model and the map agree about what you have explored.]]></description>
    </item>
    <item>
      <title>Maps: The map window (M) learned to show the model: drag spins it, the wheel zooms, Follow…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-825a4b7d83ca</guid>
      <pubDate>Thu, 30 Jul 2026 04:25:16 -0500</pubDate>
      <description><![CDATA[The map window (M) learned to show the model: drag spins it, the wheel zooms, Follow keeps you centered, and your position is a glowing beacon with a heading arrow. The floor you stand on is brightened, unexplored areas stay hidden until you walk them, and dungeons that only had a joke placeholder card will show the model instead. The Rise is baked; the in-game check and the fog switch come next.]]></description>
    </item>
    <item>
      <title>Maps: The Rise pilot went live end to end in an offline editor session: fog switched on with a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-814760af2fbc</guid>
      <pubDate>Thu, 30 Jul 2026 04:54:13 -0500</pubDate>
      <description><![CDATA[The Rise pilot went live end to end in an offline editor session: fog switched on with a 14 meter reveal, the model fills in as you walk, and the whole chain held up. The live run caught a real bug the tests could not: on maps with flipped calibration the baked fog cells were mirrored, so explored corridors stayed invisible. The bake now copies the game's own sign convention exactly, with a test pinned on The Rise's markers. Two smaller finds rode along: opening a fogged dungeon now starts the camera close to you instead of framing the whole dungeon, and switching windows no longer resets your view. Filed for tester verification.]]></description>
    </item>
    <item>
      <title>Maps: The owner's first look at the 3D map caught stray polygons slicing across the model. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-5521611e4f5d</guid>
      <pubDate>Thu, 30 Jul 2026 05:15:23 -0500</pubDate>
      <description><![CDATA[The owner's first look at the 3D map caught stray polygons slicing across the model. The cause: each floor was flattened into one height field, and The Rise's catch-all floor spans 103 meters of geometry that overlaps in plan, so surfaces smeared between levels. Floors now split into height layers before meshing, surface rectangles stop at ledges, and wall skirts follow the slope. The model rebakes at 10,576 triangles and rooms now read as rooms.]]></description>
    </item>
    <item>
      <title>Maps: The 3D map fleet baked: all 59 player-facing dungeons, sewers, mines and undergrounds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e42fd1bd8d15</guid>
      <pubDate>Thu, 30 Jul 2026 07:00:08 -0500</pubDate>
      <description><![CDATA[The 3D map fleet baked: all 59 player-facing dungeons, sewers, mines and undergrounds that showed the "map missing" joke card now carry a 3D map, baked in one 20-minute batch with zero failures and a median of 3,044 triangles per dungeon. Fog of war is on everywhere with the 14 meter reveal. The accept step's safety check earned its keep on day one: two scenes carry map calibration that disagrees with their baked fog cells, so their fog switched itself back off and they stay on the joke card until a config pass fixes them. A review sheet with two renders per dungeon covers the whole fleet.]]></description>
    </item>
    <item>
      <title>Maps: The zone map for Vauban Pass had a black wedge on its top edge, about 36 metres across…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f4cac08d046b</guid>
      <pubDate>Thu, 30 Jul 2026 08:35:21 -0500</pubDate>
      <description><![CDATA[The zone map for Vauban Pass had a black wedge on its top edge, about 36 metres across. The map was being drawn a little wider than the zone itself, and along that stretch there was no cliff or mountain hanging past the boundary to fill the gap. The map is now drawn to the exact size of the zone: the wedge is gone, so is a second smaller gap on the west edge, and the picture itself did not move.]]></description>
    </item>
    <item>
      <title>Maps: Checked the rest of the surface maps for the same fault. Eight of them carry a black…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-45dca9ef4ddf</guid>
      <pubDate>Thu, 30 Jul 2026 08:35:31 -0500</pubDate>
      <description><![CDATA[Checked the rest of the surface maps for the same fault. Eight of them carry a black border on 47 to 70 percent of that outer strip, worst in the Quel and Majestic Forest zones. Clearing those means redrawing all 25 maps and rewriting their calibration, so the measurements are written up and the change is queued rather than taken now.]]></description>
    </item>
    <item>
      <title>Maps: Map exploration gained a way back. Reveals were stored with a merge that could only ever…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-89a37ce1dcc2</guid>
      <pubDate>Thu, 30 Jul 2026 15:51:02 -0500</pubDate>
      <description><![CDATA[Map exploration gained a way back. Reveals were stored with a merge that could only ever add explored cells, so once an account had walked a dungeon its map stayed uncovered for good. There is now a server operation that clears a scene back to unexplored, restricted to tester accounts.]]></description>
    </item>
    <item>
      <title>Server: Traced the suspected presence-sharing break between the two social server processes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-eadc563bb74a</guid>
      <pubDate>Thu, 30 Jul 2026 04:10:52 -0500</pubDate>
      <description><![CDATA[Traced the suspected presence-sharing break between the two social server processes (#2833) end to end. The delivery path checks out at every hop, and the counts the bug was filed on came from a log line that never records a successful remote update, so they could not tell a healthy system from a dead one. The servers now log remote presence updates, the once-a-minute roster exchange, and anything dropped while the link is down, so the next build can prove the answer instead of guessing.]]></description>
    </item>
    <item>
      <title>Server: The trace also surfaced two real weaknesses, now on the tracker: a fixed buffer that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-cd65d228a756</guid>
      <pubDate>Thu, 30 Jul 2026 04:10:52 -0500</pubDate>
      <description><![CDATA[The trace also surfaced two real weaknesses, now on the tracker: a fixed buffer that would break the presence self-heal once a server passes roughly 250 concurrent players (#2842), and a pair of quiet failure points on the server-to-server link (#2843). A deploy-script port rewrite that misbehaved for small offsets got a one-line fix.]]></description>
    </item>
    <item>
      <title>Server: Started the server scale push. The goal is 2,500 players online at once, proven by a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-34131e3be6fc</guid>
      <pubDate>Thu, 30 Jul 2026 05:12:02 -0500</pubDate>
      <description><![CDATA[Started the server scale push. The goal is 2,500 players online at once, proven by a staged bot load test before the next server milestone. A three-way audit of the server code, the deployment shape, and the test tooling produced a ranked bottleneck list and a four-week plan; the original service carried 2,500 players on one far weaker machine, so the current shape stays and the ladder of test runs proves it.]]></description>
    </item>
    <item>
      <title>Server: First scale fixes landed. Chat moderation now runs a bounded number of language-model…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d6294c592576</guid>
      <pubDate>Thu, 30 Jul 2026 05:12:02 -0500</pubDate>
      <description><![CDATA[First scale fixes landed. Chat moderation now runs a bounded number of language-model checks at once and lets messages through unmoderated when overloaded instead of queueing without limit, and the chat relay to the team channels posts one batched update per interval instead of one call per chat line.]]></description>
    </item>
    <item>
      <title>Server: The chaos login limit turned out to still be a development value of 16 concurrent…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-470103bafb1c</guid>
      <pubDate>Thu, 30 Jul 2026 05:12:02 -0500</pubDate>
      <description><![CDATA[The chaos login limit turned out to still be a development value of 16 concurrent players. It now deploys at 2,500, matching what the live service always allowed.]]></description>
    </item>
    <item>
      <title>Server: The load-test harness gained its swarm mode: one command ramps up any number of bot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-19d41a1f90c1</guid>
      <pubDate>Thu, 30 Jul 2026 05:48:58 -0500</pubDate>
      <description><![CDATA[The load-test harness gained its swarm mode: one command ramps up any number of bot players and holds each one exactly the way a real player connects, all four server connections at once, idling, chatting on a schedule, and cycling a few relogs per hour. Each run ends in a report with connect success by stage, disconnect rates, latency numbers, and a minute-by-minute timeline. First live run is the 250-player rung.]]></description>
    </item>
    <item>
      <title>Server: The presence self-heal between the two social server processes now sends its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e6c01da85b05</guid>
      <pubDate>Thu, 30 Jul 2026 06:11:42 -0500</pubDate>
      <description><![CDATA[The presence self-heal between the two social server processes now sends its once-a-minute roster in bounded pieces instead of one message listing every session, removing the ceiling that would have broken it past a couple hundred players; the receiving side moved to per-entry claim timestamps with an expiry, which tolerates lost pieces by construction. A unit test pins the piece size against the message limit with thousands of characters to spare.]]></description>
    </item>
    <item>
      <title>Server: Players also stop being lifetime subscribers to the server game list: the subscription…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-12ddea45be3c</guid>
      <pubDate>Thu, 30 Jul 2026 06:11:42 -0500</pubDate>
      <description><![CDATA[Players also stop being lifetime subscribers to the server game list: the subscription that matchmaking opens now closes the moment a zone assignment completes, instead of every online player paying for game-list updates they never read. The next zone change opens a fresh one.]]></description>
    </item>
    <item>
      <title>Server: The bot fleet got its conductor: one command publishes the bot to the runner machines…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-36590b09ac6c</guid>
      <pubDate>Thu, 30 Jul 2026 06:29:08 -0500</pubDate>
      <description><![CDATA[The bot fleet got its conductor: one command publishes the bot to the runner machines, plans the process shards, launches and watches them, pulls every result file back, and merges them into a single pass-or-fail report for the run. Stopping a run drains the bots cleanly so their numbers still come home. With this, the harness, and the first fix train landed, the 250-player rung is ready to fire as soon as the next server deploy carries the fixes.]]></description>
    </item>
    <item>
      <title>Server: The zone-in game list no longer arrives as one oversized message. Both the list a client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-daa752762395</guid>
      <pubDate>Thu, 30 Jul 2026 07:10:43 -0500</pubDate>
      <description><![CDATA[The zone-in game list no longer arrives as one oversized message. Both the list a client gets when it starts a zone transition and the running stream of instance changes now go out in measured pages, so a busy shard cannot silently drop the whole update and leave a player waiting on an empty list. Instance lists also get built once per matchmaking query instead of once per waiting player, so a crowd zoning at the same moment costs one pass.]]></description>
    </item>
    <item>
      <title>Server: Message packing got faster under load. Every message a server sends or receives used to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6d66b0a6f4f9</guid>
      <pubDate>Thu, 30 Jul 2026 07:10:52 -0500</pubDate>
      <description><![CDATA[Message packing got faster under load. Every message a server sends or receives used to pass through a small shared set of large scratch buffers behind one lock, and when they ran out it allocated a fresh 64 KB buffer per message. Each worker thread now keeps its own buffer that starts small and grows to fit the traffic it actually sees, which removes the busiest lock in each server process along with that allocation churn.]]></description>
    </item>
    <item>
      <title>Server: Channel chat now gets packed once instead of once per listener. A line in a busy channel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-75bc36c19c1c</guid>
      <pubDate>Thu, 30 Jul 2026 07:28:42 -0500</pubDate>
      <description><![CDATA[Channel chat now gets packed once instead of once per listener. A line in a busy channel used to be encoded separately for every player who could see it, so one message at full population meant thousands of identical packing passes; the server now builds it a single time and sends that one copy to everyone subscribed. The online and offline check behind friend notices was also doing one lookup per connected player per login, and now runs once per event, which additionally means every client acts on the same answer.]]></description>
    </item>
    <item>
      <title>Crafting: The crafting window remembers how many of a recipe you last made. Set a batch of 12 iron…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a92cc9adfd64</guid>
      <pubDate>Thu, 30 Jul 2026 04:51:37 -0500</pubDate>
      <description><![CDATA[The crafting window remembers how many of a recipe you last made. Set a batch of 12 iron ingots, and the next time that recipe goes on the table the quantity reads 12 instead of resetting to 1. It is kept per recipe, per station and per character, and it survives logging out.]]></description>
    </item>
    <item>
      <title>Crafting: An empty crafting table now carries a Craft again button naming the last thing you made…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f17bbde3801c</guid>
      <pubDate>Thu, 30 Jul 2026 04:51:38 -0500</pubDate>
      <description><![CDATA[An empty crafting table now carries a <b>Craft again</b> button naming the last thing you made at that station and how many: "Craft again: Iron Ingot x 12". Pressing it gathers the same ingredients back onto the table, the same way double clicking the recipe in the list does.]]></description>
    </item>
    <item>
      <title>Crafting: The offer covers recipes that make something new. Enchanting, masterwork, socket and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d5d85f8803f9</guid>
      <pubDate>Thu, 30 Jul 2026 04:51:39 -0500</pubDate>
      <description><![CDATA[The offer covers recipes that make something new. Enchanting, masterwork, socket and pattern recipes are left out, since each of those consumes a particular item you picked, so repeating one would reach for a different item. The button hides itself while a craft is running and while ingredients are being gathered.]]></description>
    </item>
    <item>
      <title>Crafting: This is the third proposal from the public crafting deep dive, after the two tooltip…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9ad27fc5470d</guid>
      <pubDate>Thu, 30 Jul 2026 04:51:40 -0500</pubDate>
      <description><![CDATA[This is the third proposal from the public crafting deep dive, after the two tooltip items that shipped earlier in the week.]]></description>
    </item>
    <item>
      <title>Crafting: A Max button sits between the quantity stepper and Craft in the crafting window. It sets…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1e0b655131ac</guid>
      <pubDate>Thu, 30 Jul 2026 07:52:48 -0500</pubDate>
      <description><![CDATA[A <b>Max</b> button sits between the quantity stepper and Craft in the crafting window. It sets the count to the most your staged materials will make, and greys out when the count is already there, so an empty table says so instead of letting you press it.]]></description>
    </item>
    <item>
      <title>Crafting: The Max button and the quantity field share a tooltip the window never had: crafting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a78303dc0eab</guid>
      <pubDate>Thu, 30 Jul 2026 07:52:57 -0500</pubDate>
      <description><![CDATA[The Max button and the quantity field share a tooltip the window never had: crafting several at once earns less experience for each item and returns no materials when one fails. That has applied to every quantity above one for years and was stated nowhere.]]></description>
    </item>
    <item>
      <title>Crafting: Moving the batch ceiling into its own tested class found three defects. A table holding…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e9f3b47c3fc3</guid>
      <pubDate>Thu, 30 Jul 2026 07:53:03 -0500</pubDate>
      <description><![CDATA[Moving the batch ceiling into its own tested class found three defects. A table holding nothing the recipe wanted wrote a 0 into the quantity field and erased that recipe remembered quantity. A negative refining bonus could push the cap below one and abandon the craft. And the ingredient lookup ran up to fifty times per material for an answer that cannot change; it runs once now.]]></description>
    </item>
    <item>
      <title>Crafting: Double clicking a recipe you cannot afford used to empty the crafting table and put one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8f558e208f95</guid>
      <pubDate>Thu, 30 Jul 2026 08:47:16 -0500</pubDate>
      <description><![CDATA[Double clicking a recipe you cannot afford used to empty the crafting table and put one vague line in chat about missing ingredients. The crafting window now names them: a red line under the summary reading "Missing for Longsword: 1 Sword Hilt, 2 Iron Ingot", listing every material you are short of and how many more you need. The same sentence goes to chat in place of the old one.]]></description>
    </item>
    <item>
      <title>Crafting: The number is the shortfall rather than the requirement, so being short one of three says…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6117d8099a6c</guid>
      <pubDate>Thu, 30 Jul 2026 08:47:17 -0500</pubDate>
      <description><![CDATA[The number is the shortfall rather than the requirement, so being short one of three says two. The line counts materials exactly the way the recipe rows already tint them red, which is why the two cannot disagree about which ingredient is the problem. It clears when you put something on the table, when you close the window, or when you double click a recipe again.]]></description>
    </item>
    <item>
      <title>Crafting: Every failed staging path reports through it, including the one that pulls from lot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-5114398bbbff</guid>
      <pubDate>Thu, 30 Jul 2026 08:47:18 -0500</pubDate>
      <description><![CDATA[Every failed staging path reports through it, including the one that pulls from lot storage. That one deliberately ignores the storage counts when it reports, since those counts are what planned the pull that just failed. A pass that fails with nothing actually missing, an equipped tool with no durability left for instance, still gets the general message.]]></description>
    </item>
    <item>
      <title>Crafting: Fifth of the twenty two proposals from the public crafting deep dive, and the fifth of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3be5a1115da3</guid>
      <pubDate>Thu, 30 Jul 2026 08:47:19 -0500</pubDate>
      <description><![CDATA[Fifth of the twenty two proposals from the public crafting deep dive, and the fifth of phase one. Favourites and book success chances are what remain of that phase.]]></description>
    </item>
    <item>
      <title>Crafting: Item repair now checks which crafting station you are at before it checks anything else…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d2691963808d</guid>
      <pubDate>Thu, 30 Jul 2026 08:53:02 -0500</pubDate>
      <description><![CDATA[Item repair now checks which crafting station you are at before it checks anything else. The list of stations that can repair is unchanged (blacksmithing, tailoring, carpentry, alchemy), and the check already existed, but it ran five checks late. Salvage has always checked its station first; repair now matches it.]]></description>
    </item>
    <item>
      <title>Crafting: The crafting station recipe list can be sorted now. A Sort dropdown sits beside the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-86feea6c0b8c</guid>
      <pubDate>Thu, 30 Jul 2026 10:13:30 -0500</pubDate>
      <description><![CDATA[The crafting station recipe list can be sorted now. A Sort dropdown sits beside the category one, offering Name, Success chance, Can make and Skill, and the window remembers which you picked. The list had exactly one order before this, ascending name, with no header to click and no way to ask for anything else.]]></description>
    </item>
    <item>
      <title>Crafting: Recipe names carry a colour. Red is a recipe your skill cannot reach, orange one that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c9d7a002019e</guid>
      <pubDate>Thu, 30 Jul 2026 10:13:39 -0500</pubDate>
      <description><![CDATA[Recipe names carry a colour. Red is a recipe your skill cannot reach, orange one that fails more often than it works, then yellow and green as the odds improve, and a dim grey once the craft cannot fail at all. The colour reads off the success chance already printed on the card, which folds difficulty, skill and tool bonus into one number and tops out at 100%.]]></description>
    </item>
    <item>
      <title>Crafting: Can make counts what your materials actually cover rather than answering yes or no. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e1349b8d4369</guid>
      <pubDate>Thu, 30 Jul 2026 10:13:40 -0500</pubDate>
      <description><![CDATA[Can make counts what your materials actually cover rather than answering yes or no. It reuses the read of your bags the Only craftable filter already does, widened from a yes/no to a yes/no and a number, and the window only asks for it when that order is chosen. Tools and optional ingredients stay out of the arithmetic but still have to be present, or one hammer would pin every recipe that wants a tool at one.]]></description>
    </item>
    <item>
      <title>Crafting: Every recipe card leads with a star now. Click it and the recipe goes gold and rises to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-2ad837434a78</guid>
      <pubDate>Thu, 30 Jul 2026 12:37:53 -0500</pubDate>
      <description><![CDATA[Every recipe card leads with a star now. Click it and the recipe goes gold and rises to the top of the list, in whichever order the list is sorted. A Favorites entry sits under All Recipes in the category dropdown, and the recipe book opens a Favorites chapter ahead of the crafting schools.]]></description>
    </item>
    <item>
      <title>Crafting: Stars belong to the character rather than to a station, so a recipe starred at a forge…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b22743f6f68b</guid>
      <pubDate>Thu, 30 Jul 2026 12:37:54 -0500</pubDate>
      <description><![CDATA[Stars belong to the character rather than to a station, so a recipe starred at a forge reads as starred everywhere it appears, including the book. Two characters on one machine keep separate sets.]]></description>
    </item>
    <item>
      <title>Crafting: The recipe book chapter is deliberately left out of the jump-to-recipe map: a starred…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e264f19b4802</guid>
      <pubDate>Thu, 30 Jul 2026 12:38:05 -0500</pubDate>
      <description><![CDATA[The recipe book chapter is deliberately left out of the jump-to-recipe map: a starred recipe lives in two places, and learning it should take you to its own school rather than to the favourites shelf. Starring while the book is open repaints the star but does not restructure the pages under the reader.]]></description>
    </item>
    <item>
      <title>Crafting: Crafting stations have a Quick Craft option. With it turned on a craft finishes right…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-35524c0b7691</guid>
      <pubDate>Thu, 30 Jul 2026 13:38:03 -0500</pubDate>
      <description><![CDATA[Crafting stations have a <strong>Quick Craft</strong> option. With it turned on a craft finishes right away with no timer and grants no experience. The materials it consumes, the chance of failing, the wear on your tools and the item you end up with are all the same as before, so it is a straight trade of experience for time.]]></description>
    </item>
    <item>
      <title>Crafting: Quick Craft covers crafting, brewing, masterworking, enchanting, socketing and pattern…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-48e2f53d57df</guid>
      <pubDate>Thu, 30 Jul 2026 13:38:11 -0500</pubDate>
      <description><![CDATA[Quick Craft covers crafting, brewing, masterworking, enchanting, socketing and pattern work. Salvage and repair keep their own short timer and still give experience, so turning the option on never costs you experience without also saving you the wait. It is off by default and stays where you leave it.]]></description>
    </item>
    <item>
      <title>Crafting: Recipe cards quote your chance of a successful craft everywhere they appear now, not only…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-cf5fd859ae22</guid>
      <pubDate>Thu, 30 Jul 2026 15:40:59 -0500</pubDate>
      <description><![CDATA[Recipe cards quote your chance of a successful craft everywhere they appear now, not only at a station. Open the recipe book at home and the percentages are there, with recipe names carrying the same red-through-grey relevance colour the station list has.]]></description>
    </item>
    <item>
      <title>Crafting: Hover a recipe card and the chance of an exceptional item sits under the success chance…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f2f8556bfc98</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:00 -0500</pubDate>
      <description><![CDATA[Hover a recipe card and the chance of an exceptional item sits under the success chance. On recipes that make nothing wearable it reads as a critical success instead, matching what the crafting window already said.]]></description>
    </item>
    <item>
      <title>Crafting: Away from that craft's own table, the book and the hover both add a line: Chance shown…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d5f837dd7b1a</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:01 -0500</pubDate>
      <description><![CDATA[Away from that craft's own table, the book and the hover both add a line: Chance shown for a standard station and your equipped tools. The tool bonus is yours rather than the station's and it is in the number, so reading the book with nothing equipped shows a lower chance than the forge will.]]></description>
    </item>
    <item>
      <title>Crafting: The odds follow the recipe's craft rather than the station in front of you, which fixed a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c2237e006fe1</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:02 -0500</pubDate>
      <description><![CDATA[The odds follow the recipe's craft rather than the station in front of you, which fixed a bug nobody had reported: with a forge open, the recipe book's tailoring pages were quoting your blacksmithing. Hovering a recipe at a printing press also used to do nothing at all.]]></description>
    </item>
    <item>
      <title>Crafting: The Filter box at a crafting station and the search in the recipe book match a recipe's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-dc6afd49f9f1</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:09 -0500</pubDate>
      <description><![CDATA[The Filter box at a crafting station and the search in the recipe book match a recipe's ingredients and what it makes, not just its name. Type iron ingot and you get the recipe that produces one alongside the recipes that consume one.]]></description>
    </item>
    <item>
      <title>Crafting: Recipes matched on their own name float above the ones matched only through an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-2f1844e739d6</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:10 -0500</pubDate>
      <description><![CDATA[Recipes matched on their own name float above the ones matched only through an ingredient, under your starred recipes. Without that, iron ingot at a stocked forge buries the smelting recipe under a hundred blacksmithing recipes.]]></description>
    </item>
    <item>
      <title>Crafting: Three words narrow a search: uses:coal for recipes that consume it, makes:ingot for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b7b49ebe4771</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:11 -0500</pubDate>
      <description><![CDATA[Three words narrow a search: uses:coal for recipes that consume it, makes:ingot for recipes that produce one, name:sword to search names alone. A minus excludes a word, quotes match a phrase whole, and hovering the box explains the syntax.]]></description>
    </item>
    <item>
      <title>Crafting: A word the search does not know gets a short line under the box naming the ones it does…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-789bd0e93de2</guid>
      <pubDate>Thu, 30 Jul 2026 15:41:12 -0500</pubDate>
      <description><![CDATA[A word the search does not know gets a short line under the box naming the ones it does, rather than quietly searching for that text and finding nothing. Those spellings are being kept clear for the inventory window's own search.]]></description>
    </item>
    <item>
      <title>Crafting: Began moving crafting recipe matching out of the server round trip and into the client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e8976f4105e8</guid>
      <pubDate>Thu, 30 Jul 2026 20:00:16 -0500</pubDate>
      <description><![CDATA[Began moving crafting recipe matching out of the server round trip and into the client. The matching rules are in place, along with tests that walk the whole recipe database and recompute every recipe stored ingredient hash, check each hash expansion covers its own recipe, and check the whole set for collisions.]]></description>
    </item>
    <item>
      <title>Crafting: Proved the new client-side recipe matching against the real recipe database rather than a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-69c4e30b366e</guid>
      <pubDate>Thu, 30 Jul 2026 20:18:50 -0500</pubDate>
      <description><![CDATA[Proved the new client-side recipe matching against the real recipe database rather than a captured fixture: stage exactly what a recipe asks for and the client has to answer with that recipe. 3,159 of the 3,161 craftable recipes pass; the two that do not have a classification ingredient with no members, which is a data gap rather than a matching one.]]></description>
    </item>
    <item>
      <title>Crafting: Fixed a defect that has been in batch crafting since it shipped: double-clicking a recipe…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-58c764a7a24d</guid>
      <pubDate>Thu, 30 Jul 2026 20:53:00 -0500</pubDate>
      <description><![CDATA[Fixed a defect that has been in batch crafting since it shipped: double-clicking a recipe in the list while a batch was running could pull your ingredients back off the table, leaving the rest of the run producing nothing and your materials split between the table and your pack. Recipe rows now stay inactive for the whole run.]]></description>
    </item>
    <item>
      <title>Crafting: The new client-side recipe matching now runs alongside the server on every table change…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-08cc0d390508</guid>
      <pubDate>Thu, 30 Jul 2026 20:53:00 -0500</pubDate>
      <description><![CDATA[The new client-side recipe matching now runs alongside the server on every table change, with the server still deciding what the window shows. Any disagreement is logged with enough detail to rebuild the table, which is how the client answer earns the right to take over.]]></description>
    </item>
    <item>
      <title>Crafting: Rebuilt the crafting loop to run a list of work rather than a single press of the Craft…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1441de6d670c</guid>
      <pubDate>Thu, 30 Jul 2026 21:00:52 -0500</pubDate>
      <description><![CDATA[Rebuilt the crafting loop to run a list of work rather than a single press of the Craft button. Nothing can add to that list yet, so with it empty the loop behaves exactly as before; a queued batch of five still costs what a batch of five has always cost, which is the point of wrapping the existing loop rather than replacing it.]]></description>
    </item>
    <item>
      <title>Crafting: The crafting queue is now usable. Start a craft and the Craft button reads Queue…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0ff1e14411af</guid>
      <pubDate>Thu, 30 Jul 2026 21:12:33 -0500</pubDate>
      <description><![CDATA[The crafting queue is now usable. Start a craft and the Craft button reads Queue: highlight another recipe, set a quantity, and it joins the back of the line, with each waiting entry drawn under the progress bar and removable on its own. A queued batch of five costs what a batch of five has always cost, so this buys you the keyboard time back and nothing else.]]></description>
    </item>
    <item>
      <title>UI: Crown Shop: hovering one item lit up the entire row it sat in, empty space after the last…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-2cf4694dcfff</guid>
      <pubDate>Thu, 30 Jul 2026 04:12:56 -0500</pubDate>
      <description><![CDATA[Crown Shop: hovering one item lit up the entire row it sat in, empty space after the last item included. Only the hovered item highlights now. The shelf lays items out in rows and the row itself was still being drawn as a highlightable list row; that is off for grids like this one, and the property manager deed grid gets the same fix. Reported in game by a player.]]></description>
    </item>
    <item>
      <title>UI: The Decorations window was drawing its own rows on top of each other on a well-decorated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8e7b04b43e7c</guid>
      <pubDate>Thu, 30 Jul 2026 04:58:40 -0500</pubDate>
      <description><![CDATA[The Decorations window was drawing its own rows on top of each other on a well-decorated lot. The list is the part meant to scroll, but every other row was being squeezed along with it, collapsing to a few pixels while the text inside kept drawing at full size. That put the row of recently touched items across the column headings and the headings across the first item in the list. The Find button was pushed down onto the window border by the same thing, where its corner sat under the resize grip and answered a drag instead of a click. Every row now holds its height at any window size and any number of decorations.]]></description>
    </item>
    <item>
      <title>UI: Two more on the same window, both from a player report through the in-game Oracle. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0d02cb9e33e9</guid>
      <pubDate>Thu, 30 Jul 2026 04:58:46 -0500</pubDate>
      <description><![CDATA[Two more on the same window, both from a player report through the in-game Oracle. The row of recent items ran off the right edge and the last name was cut through the middle of a word; it now shows the items that fit and drops the rest, so a wider window brings more back. Hovering the Find button showed a small unreadable box instead of the hover panel the rest of the game uses.]]></description>
    </item>
    <item>
      <title>UI: With 'Show Health and Focus Stats' turned on, the player status bar showed a health…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-4971f36e19ba</guid>
      <pubDate>Thu, 30 Jul 2026 06:16:56 -0500</pubDate>
      <description><![CDATA[With 'Show Health and Focus Stats' turned on, the player status bar showed a health number only, drew it under the bars instead of on them, and slid it sideways as buffs piled up. Both numbers now sit centred on the bar they report: health on the health bar, focus on the focus bar. The focus number had never been carried across when that bar was rebuilt, and the health one was being stretched over a box as wide as the whole buff strip.]]></description>
    </item>
    <item>
      <title>UI: Buff icons on the status bar wrap again. Seventeen active effects drew a single row about…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3002bb043cf3</guid>
      <pubDate>Thu, 30 Jul 2026 06:16:57 -0500</pubDate>
      <description><![CDATA[Buff icons on the status bar wrap again. Seventeen active effects drew a single row about 440 pixels wide; they now break into rows of nine and only spill into the +N icon past 18, which is how the live shard has always laid them out. Reported in game by a tester.]]></description>
    </item>
    <item>
      <title>UI: The window a quest uses to hand items over had to be stretched wide before its item names…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a50bfdde3871</guid>
      <pubDate>Thu, 30 Jul 2026 07:27:14 -0500</pubDate>
      <description><![CDATA[The window a quest uses to hand items over had to be stretched wide before its item names could be read. Both of its panes were drawing the full inventory table, whose fixed number columns need 294 pixels of a pane that has 291, so every name came out about eight characters short. Both panes are a single column of names again, the way the window was originally built, with the stack count back in the name, and it opens at 680 pixels instead of 640.]]></description>
    </item>
    <item>
      <title>UI: Two more windows split their width the same way and carried the same table. The mail…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9ef9720d798e</guid>
      <pubDate>Thu, 30 Jul 2026 07:27:22 -0500</pubDate>
      <description><![CDATA[Two more windows split their width the same way and carried the same table. The mail attachments pane and both crafting station item lists are back to the columns their original windows were built with, which for crafting also means dropping a quantity column that was never part of it.]]></description>
    </item>
    <item>
      <title>UI: Item lists now drop number columns on their own when a pane is too narrow to leave the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e80eaec7d3e8</guid>
      <pubDate>Thu, 30 Jul 2026 07:27:22 -0500</pubDate>
      <description><![CDATA[Item lists now drop number columns on their own when a pane is too narrow to leave the item name room to read. They go from the right, so quantity is the last to go and the count moves into the name when it does. The backpack keeps its full table, where the name shortens and the numbers hold.]]></description>
    </item>
    <item>
      <title>UI: The deck builder's ten glyph slots drew their key numbers about four pixels below the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a14b47fc655d</guid>
      <pubDate>Thu, 30 Jul 2026 11:04:40 -0500</pubDate>
      <description><![CDATA[The deck builder's ten glyph slots drew their key numbers about four pixels below the bracket that hangs under each slot, so a number sat under the rounded bump instead of inside it and the bottom of the digit fell outside the bracket. The slot's own border was moving them, so a slot's border now draws on a layer of its own and the numbers centre in the bump again.]]></description>
    </item>
    <item>
      <title>UI: The same drift was on the main skill bar while a key was held: the border that lights a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8ee0ac3d843a</guid>
      <pubDate>Thu, 30 Jul 2026 11:04:49 -0500</pubDate>
      <description><![CDATA[The same drift was on the main skill bar while a key was held: the border that lights a slot pushed its key number out of the bracket for as long as the light was on. Both rows share the fix, and the deck builder's glyph art, glyph stack and padlock lost the two-pixel offset they inherited from the same border.]]></description>
    </item>
    <item>
      <title>UI: The key numbers under every glyph slot were being centred on the whole bracket shape…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0ebda18d3667</guid>
      <pubDate>Thu, 30 Jul 2026 11:32:20 -0500</pubDate>
      <description><![CDATA[The key numbers under every glyph slot were being centred on the whole bracket shape instead of the round bump a number sits in, so they read a shade low on the main bar, the combat bar and the emote bar. They move up onto the bump, and the offset now comes from the artwork itself rather than a number typed alongside it.]]></description>
    </item>
    <item>
      <title>UI: Measured the bracket artwork gap row by row and moved the key numbers up again, into the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-652eba4312d8</guid>
      <pubDate>Thu, 30 Jul 2026 11:49:44 -0500</pubDate>
      <description><![CDATA[Measured the bracket artwork gap row by row and moved the key numbers up again, into the open spot rather than onto the closed part of the cup below it. The offset is now read from where the artwork actually opens, on the main bar, the combat bar, the emote bar and the deck builder.]]></description>
    </item>
    <item>
      <title>UI: The login window now speaks the language you picked. Its labels had lost the link to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9e874fdc72b9</guid>
      <pubDate>Thu, 30 Jul 2026 14:46:26 -0500</pubDate>
      <description><![CDATA[The login window now speaks the language you picked. Its labels had lost the link to their translations when the window moved to the new interface, so it came up in English no matter what Options said. The same fault was turning translated text back into English across the other converted windows, and roughly 240 already-translated strings come back with the fix.]]></description>
    </item>
    <item>
      <title>UI: Enter logs you in again. Typing a username and password and pressing Enter did nothing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c0d45eca7103</guid>
      <pubDate>Thu, 30 Jul 2026 14:46:35 -0500</pubDate>
      <description><![CDATA[Enter logs you in again. Typing a username and password and pressing Enter did nothing, because the text box treated the key as "finish editing" before the login form saw it. Enter now does what the Log In button does, from either box or the Remember User Name checkbox, and Enter on a highlighted Cancel still cancels.]]></description>
    </item>
    <item>
      <title>UI: The deck builder could show an empty or stale linked equipment row for a deck that had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-71acb36d78f3</guid>
      <pubDate>Thu, 30 Jul 2026 16:17:15 -0500</pubDate>
      <description><![CDATA[The deck builder could show an empty or stale linked equipment row for a deck that had equipment linked to it. The list it walked included a terminal marker that is not a real equipment slot, which aborted the refresh before anything was drawn.]]></description>
    </item>
    <item>
      <title>UI: The online friend count next to the social panel could stop updating, and said nothing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8058c16805b9</guid>
      <pubDate>Thu, 30 Jul 2026 16:17:16 -0500</pubDate>
      <description><![CDATA[The online friend count next to the social panel could stop updating, and said nothing when it did. It now reports which panel lost its label instead of failing quietly.]]></description>
    </item>
    <item>
      <title>UI: NPC conversation and chat text now wraps like ordinary prose. Clickable topic words used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-80316359ee0c</guid>
      <pubDate>Thu, 30 Jul 2026 17:35:39 -0500</pubDate>
      <description><![CDATA[NPC conversation and chat text now wraps like ordinary prose. Clickable topic words used to end up alone on their own line, with the rest of the sentence pushed below them and a stray space starting the next line.]]></description>
    </item>
    <item>
      <title>UI: A reply now holds one colour from start to finish. The words after a clickable topic used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b6eb993173ff</guid>
      <pubDate>Thu, 30 Jul 2026 17:35:40 -0500</pubDate>
      <description><![CDATA[A reply now holds one colour from start to finish. The words after a clickable topic used to change colour partway through the sentence.]]></description>
    </item>
    <item>
      <title>UI: A conversation topic you have already asked about shows greyed out again, matching how it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-622c1585d98a</guid>
      <pubDate>Thu, 30 Jul 2026 17:35:40 -0500</pubDate>
      <description><![CDATA[A conversation topic you have already asked about shows greyed out again, matching how it looked before the interface was rebuilt.]]></description>
    </item>
    <item>
      <title>UI: Player names and item links in chat flow inline the same way, and window copy that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-5eb44116d7f3</guid>
      <pubDate>Thu, 30 Jul 2026 17:35:49 -0500</pubDate>
      <description><![CDATA[Player names and item links in chat flow inline the same way, and window copy that carries a link, such as store descriptions and lot signs, no longer breaks its paragraph where the link sits.]]></description>
    </item>
    <item>
      <title>UI: Long replies in Japanese and Chinese wrap correctly too, using the line-breaking rules…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6274ce5cf907</guid>
      <pubDate>Thu, 30 Jul 2026 17:35:49 -0500</pubDate>
      <description><![CDATA[Long replies in Japanese and Chinese wrap correctly too, using the line-breaking rules the text system already carries.]]></description>
    </item>
    <item>
      <title>UI: Selecting several items and choosing "Destroy Selected Item(s)" destroyed only the row…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1a840fc5331e</guid>
      <pubDate>Thu, 30 Jul 2026 19:35:41 -0500</pubDate>
      <description><![CDATA[Selecting several items and choosing "Destroy Selected Item(s)" destroyed only the row you right-clicked. The converted inventory windows were passing the context menu a single item instead of the selection, so the menu's multi-item path never ran. Backpack, containers, the bank, the crafting table, the decoration list and the music cylinder list all take the whole selection now, and the confirmation says how many items it is about to destroy.]]></description>
    </item>
    <item>
      <title>UI: Right-clicking an item that is not part of your selection now acts on that item alone…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d5f466187d5c</guid>
      <pubDate>Thu, 30 Jul 2026 19:35:47 -0500</pubDate>
      <description><![CDATA[Right-clicking an item that is not part of your selection now acts on that item alone. The old list passed its selection whatever you clicked, so a right-click outside a selection could open a menu naming one item and destroy a different set.]]></description>
    </item>
    <item>
      <title>UI: Listing an item on a vendor opened two windows: the current price window on the vendor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-89fc5baa7bbb</guid>
      <pubDate>Thu, 30 Jul 2026 19:37:24 -0500</pubDate>
      <description><![CDATA[Listing an item on a vendor opened two windows: the current price window on the vendor, and the older version it replaced, sitting near the top left with placeholder text in it. The old window is switched off when the game starts, but opening a listing switched it back on. It stays off now, and the space it took no longer swallows mouse clicks.]]></description>
    </item>
    <item>
      <title>UI: The same leftover window turned up in two more places while tracing that one: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-04d01790307b</guid>
      <pubDate>Thu, 30 Jul 2026 19:37:31 -0500</pubDate>
      <description><![CDATA[The same leftover window turned up in two more places while tracing that one: the quantity window for a purchase order, and the equipped-deck names in the lower right, which could draw twice once you had both a main and an alternate deck equipped. Both fixed in the same change.]]></description>
    </item>
    <item>
      <title>UI: The PVP stats window was printing a display code in the Time column for a player who had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8305136691af</guid>
      <pubDate>Thu, 30 Jul 2026 19:37:52 -0500</pubDate>
      <description><![CDATA[The PVP stats window was printing a display code in the Time column for a player who had been around less than a minute, showing "&amp;lt; 1m" where it meant "&lt; 1m". The text converter behind every rebuilt window escaped every angle bracket as a safety measure, and the new interface layer draws those escapes instead of decoding them. It now escapes a bracket only where one could start a formatting tag, so the Lot Deeds day count and the theme picker's "&lt; New Theme &gt;" entry read correctly too.]]></description>
    </item>
    <item>
      <title>UI: Both PVP stats windows got their titlebar pin back. The open-PVP list and the team…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1d854c1b6be2</guid>
      <pubDate>Thu, 30 Jul 2026 19:37:59 -0500</pubDate>
      <description><![CDATA[Both PVP stats windows got their titlebar pin back. The open-PVP list and the team scoreboard each had one before they were rebuilt on the new interface toolkit, and the rebuild left it off. A pinned window ignores Escape and comes back pinned after a scene change, the same as every other window that offers a pin.]]></description>
    </item>
    <item>
      <title>UI: Five problems with the Edit Deck window, all reported together, are fixed: the Schools…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-699c040b9be1</guid>
      <pubDate>Thu, 30 Jul 2026 20:13:27 -0500</pubDate>
      <description><![CDATA[Five problems with the Edit Deck window, all reported together, are fixed: the Schools filter now applies to the Glyphs tab as well as Combos, the Bard school has a box at last, the window stops drawing over itself at its smallest size, the Linked Equipment strip shows your gear again with an outlined slot for a piece you are not carrying, and combo rows draw one glyph each instead of a full-size one plus a tiny copy.]]></description>
    </item>
    <item>
      <title>UI: The Bard school had never had a filter box: both filter prefabs author twenty toggles and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-bc40f5f0fb89</guid>
      <pubDate>Thu, 30 Jul 2026 20:13:36 -0500</pubDate>
      <description><![CDATA[The Bard school had never had a filter box: both filter prefabs author twenty toggles and the school sits one bit past them, so every combo built from a Bard glyph was filtered out with nothing on screen to explain it. The list is read off the code now rather than the prefab, so the next school added needs no art work at all.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1ecc323bb7e1</guid>
      <pubDate>Thu, 30 Jul 2026 04:54:13 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/rise-3d-map-model-2026-07-30.png" data-full="https://catnipgames.net/blog/images/rise-3d-map-model-2026-07-30.png" alt="The Rise as a see-through 3D model in the map window"><img src="https://catnipgames.net/blog/images/rise-3d-map-fog-first-look-2026-07-30.png" data-full="https://catnipgames.net/blog/images/rise-3d-map-fog-first-look-2026-07-30.png" alt="First look at The Rise 3D map with fog of war, one corridor revealed around the player beacon"><img src="https://catnipgames.net/blog/images/rise-map-2d-sheet-2026-07-30.png" data-full="https://catnipgames.net/blog/images/rise-map-2d-sheet-2026-07-30.png" alt="The old 2D paper map of The Rise behind the 2D button">]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-903b7e41f34d</guid>
      <pubDate>Thu, 30 Jul 2026 05:15:23 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/rise-3d-map-tightened-2026-07-30.png" data-full="https://catnipgames.net/blog/images/rise-3d-map-tightened-2026-07-30.png" alt="Close-up of the tightened 3D map of The Rise, a room with doorways and the player beacon">]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-88d78fee5b51</guid>
      <pubDate>Thu, 30 Jul 2026 06:23:46 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/wizards-tower-balcony-railing-2026-07-30.jpg" data-full="https://catnipgames.net/blog/images/wizards-tower-balcony-railing-2026-07-30.jpg" alt="The Stone Five-Story Wizard&apos;s Tower porch balcony, railing cap running level across the front after the alignment fix">]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d1b784115934</guid>
      <pubDate>Thu, 30 Jul 2026 07:00:08 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/fleet-3d-map-owlshead-sewers-2026-07-30.png" data-full="https://catnipgames.net/blog/images/fleet-3d-map-owlshead-sewers-2026-07-30.png" alt="Baked 3D map model of the Owl's Head Sewers"><img src="https://catnipgames.net/blog/images/fleet-3d-map-the-fall-2026-07-30.png" data-full="https://catnipgames.net/blog/images/fleet-3d-map-the-fall-2026-07-30.png" alt="Baked 3D map model of The Fall, five floors deep">]]></description>
    </item>
    <item>
      <title>Images: Click-to-expand, back in both views</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c17714732f03</guid>
      <pubDate>Thu, 30 Jul 2026 07:53:33 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/blog-timeline-lightbox-2026-07-30.png" data-full="https://catnipgames.net/blog/images/blog-timeline-lightbox-2026-07-30.png" data-cap="A thumbnail in the newest-first timeline opened to full size, with the picture counter, the arrows and the caption the expanded view carries." alt="The work log in newest-first view with a thumbnail expanded to full size over it, showing a stone tower balcony, a 3 of 27 counter and left and right arrows" loading="lazy"><span class="cap">Click-to-expand, back in both views</span></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d528fe1d13c8</guid>
      <pubDate>Thu, 30 Jul 2026 08:35:31 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/vauban-pass-map-edge-2026-07-30.png" data-full="https://catnipgames.net/blog/images/vauban-pass-map-edge-2026-07-30.png" alt="The north edge of the Vauban Pass map before and after: the before strip has a black wedge over the grass, the after strip is unbroken">]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-877d5092dcf3</guid>
      <pubDate>Thu, 30 Jul 2026 17:23:15 -0500</pubDate>
      <description><![CDATA[<span class="gallery"><img src="https://catnipgames.net/blog/images/mac-launcher-first-run-2026-07-30.png" data-full="https://catnipgames.net/blog/images/mac-launcher-first-run-2026-07-30.png" data-cap="First run on a Mac now asks only where the game goes." alt="Mac launcher first-run screen"></span> <span class="gallery"><img src="https://catnipgames.net/blog/images/mac-launcher-patching-2026-07-30.png" data-full="https://catnipgames.net/blog/images/mac-launcher-patching-2026-07-30.png" data-cap="Patching the Mac client, 707 files and about 17 GB." alt="Mac launcher downloading the game"></span> <span class="gallery"><img src="https://catnipgames.net/blog/images/mac-launcher-ready-2026-07-30.png" data-full="https://catnipgames.net/blog/images/mac-launcher-ready-2026-07-30.png" data-cap="Install finished and ready to play." alt="Mac launcher ready to play"></span>]]></description>
    </item>
    <item>
      <title>Images · 2026-07-30</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-images</guid>
      <pubDate>Thu, 30 Jul 2026 00:02:13 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/blog-timeline-lightbox-2026-07-30.png" data-full="https://catnipgames.net/blog/images/blog-timeline-lightbox-2026-07-30.png" data-cap="A thumbnail in the newest-first timeline opened to full size, with the picture counter, the arrows and the caption the expanded view carries." alt="The work log in newest-first view with a thumbnail expanded to full size over it, showing a stone tower balcony, a 3 of 27 counter and left and right arrows" loading="lazy"><span class="cap">Click-to-expand, back in both views</span></div>]]></description>
    </item>
    <item>
      <title>Conversation Studio: Started the Conversation Studio project to replace ConvoBuilder, the old external…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-ea5c46294523</guid>
      <pubDate>Thu, 30 Jul 2026 05:53:16 -0500</pubDate>
      <description><![CDATA[Started the Conversation Studio project to replace ConvoBuilder, the old external dialogue tool that needed its own machine and database. NPC dialog will be authored inside Unity with the same validation, undo, and history as the rest of our tooling, plus a team web page for viewing and editing conversations and AI-assisted drafting. The full build plan is written and approved.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Moved all 4,606 NPC conversation data files from binary LFS storage to plain text in git…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c058eca00410</guid>
      <pubDate>Thu, 30 Jul 2026 05:53:16 -0500</pubDate>
      <description><![CDATA[Moved all 4,606 NPC conversation data files from binary LFS storage to plain text in git. Dialogue edits now get real line diffs and clean three-way merges; before this, two people touching the same NPC produced an unresolvable binary conflict.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The Conversation Studio window opened for the first time inside Unity: pick any scene and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-7320a9ccc6ec</guid>
      <pubDate>Thu, 30 Jul 2026 07:04:08 -0500</pubDate>
      <description><![CDATA[The <b>Conversation Studio</b> window opened for the first time inside Unity: pick any scene and NPC and read the whole conversation as an ordered tree, every section included, with that character's validation findings underneath. Read only for now; editing lands next.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Dialogue gates and action lines now parse into a structured model instead of raw strings…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-df3af3cbad5a</guid>
      <pubDate>Thu, 30 Jul 2026 07:04:08 -0500</pubDate>
      <description><![CDATA[Dialogue gates and action lines now parse into a structured model instead of raw strings, verified by round-tripping all 14,220 gate expressions and 16,671 action lines in the game with zero failures. The sweep also found nine shipped action lines with verbs the game would reject, now fenced so no new ones can land.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The editing engine now covers every field on every conversation element type: toggles and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a082833ff56a</guid>
      <pubDate>Thu, 30 Jul 2026 07:17:54 -0500</pubDate>
      <description><![CDATA[The editing engine now covers every field on every conversation element type: toggles and timings, keyword labels, query branch text with its display overlay kept in step, and removal that matches the game's omit-defaults file convention. A new localization guard detects when editing an English line would orphan its translations, checked against live translation files in all eight languages.]]></description>
    </item>
    <item>
      <title>Conversation Studio: NPC dialogue is now editable inside Unity: click any element in the Conversation Studio…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-2e1ccc290c32</guid>
      <pubDate>Thu, 30 Jul 2026 07:41:03 -0500</pubDate>
      <description><![CDATA[NPC dialogue is now editable inside Unity: click any element in the Conversation Studio tree and a typed form opens for it, with live checks on flag expressions and action lines, emote and faction pickers, undo and redo, and a warning before an English edit orphans its translations. Saves re-validate the conversation and offer a one-click undo if new errors appear.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The structural engine landed: conversation elements can be added, deleted, and reordered…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f86f3cd81b70</guid>
      <pubDate>Thu, 30 Jul 2026 07:55:25 -0500</pubDate>
      <description><![CDATA[The structural engine landed: conversation elements can be added, deleted, and reordered with corpus-safe id allocation, reference-guarded deletes that list every place an element is used, and display-overlay entries kept in step. A full-corpus sweep verified the splice math applies to all 39,142 file sections and re-emitting every element round-trips faithfully.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Conversations can now be restructured in the editor: add, duplicate, reorder, and delete…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-dfc9ad55612a</guid>
      <pubDate>Thu, 30 Jul 2026 08:25:29 -0500</pubDate>
      <description><![CDATA[Conversations can now be restructured in the editor: add, duplicate, reorder, and delete elements with reference-guarded deletes that list every place an element is used, and a chatter assist that writes an NPC-to-NPC exchange into both characters' files as one undoable step.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The conversation engine now also runs outside Unity as a command-line tool: corpus…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-53e395b34085</guid>
      <pubDate>Thu, 30 Jul 2026 08:25:30 -0500</pubDate>
      <description><![CDATA[The conversation engine now also runs outside Unity as a command-line tool: corpus scanning, validation, a byte-fidelity gate over all 4,605 conversation files, and the server mode the upcoming team web interface will drive. All 214 editor tests for the new tooling ran green today.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The dialog corpus now opens in a web browser: every scene and character, all fifteen…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d81561a827bb</guid>
      <pubDate>Thu, 30 Jul 2026 09:30:35 -0500</pubDate>
      <description><![CDATA[The dialog corpus now opens in a web browser: every scene and character, all fifteen sections of a conversation in file order, and search across lines, flags and character names. The pages ask the same engine the Unity tool uses, so the two cannot disagree about what a character says. Nothing is deployed yet.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Archived the quest records that only ever lived inside the old dialog authoring tool and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-7b2040763e8d</guid>
      <pubDate>Thu, 30 Jul 2026 09:30:52 -0500</pubDate>
      <description><![CDATA[Archived the quest records that only ever lived inside the old dialog authoring tool and were never exported into game data, together with the extractor that produced the archive and re-verifies it. That tool is being retired, and this was the one piece of content that would not have survived it.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Conversations can be created now, not just edited: a new character conversation, or the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-20cca71a9446</guid>
      <pubDate>Thu, 30 Jul 2026 09:58:54 -0500</pubDate>
      <description><![CDATA[Conversations can be created now, not just edited: a new character conversation, or the missing half of one that only had barks, or a copy of an existing character to start from. Undo removes a newly created file the same way it removes a line. Journal entries can be written from the same place, in the exact format the file already uses.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The dialog checker went from 16 rules to 30, and the new ones found real problems in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e94a54efd0d7</guid>
      <pubDate>Thu, 30 Jul 2026 09:58:55 -0500</pubDate>
      <description><![CDATA[The dialog checker went from 16 rules to 30, and the new ones found real problems in shipped content: 15 character-to-character exchanges aimed at names that no longer exist, so those lines never play; 4 conversations bound in a way that leaves the character silent; 18 unknown emotes; and 5 responses marked required that nothing can reach.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Dialog now has history. The tool lists every commit that touched a conversation, shows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f475962525bb</guid>
      <pubDate>Thu, 30 Jul 2026 09:58:55 -0500</pubDate>
      <description><![CDATA[Dialog now has history. The tool lists every commit that touched a conversation, shows what changed element by element rather than as shifted lines, and can put an old version back as a normal undoable edit. Text from before the corpus left large-file storage is recovered on the fly so old revisions read properly.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Groundwork for AI-assisted dialog landed, with no model called yet. A draft is produced…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6f4ac141f83e</guid>
      <pubDate>Thu, 30 Jul 2026 09:59:03 -0500</pubDate>
      <description><![CDATA[Groundwork for AI-assisted dialog landed, with no model called yet. A draft is produced as a structured plan rather than as text: gates and effects use the same typed model the future quest system will read, a verb the game does not implement cannot be expressed at all, and a draft only reaches a file through the normal editing path, so it is validated, undoable, and reviewable first. Character backstory files are fenced as untrusted input.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Making a new character conversation is now a button rather than a database chore: pick a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-24a39a9b14ee</guid>
      <pubDate>Thu, 30 Jul 2026 10:53:45 -0500</pubDate>
      <description><![CDATA[Making a new character conversation is now a button rather than a database chore: pick a scene, type a name, and the files, ids and optional prefab are created as one undoable step. Existing characters can be duplicated to start from. Adding a line to a character who only had barks no longer refuses; it creates the missing half in the same step.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Conditions and effects on a dialogue line are pickers now, not hand-typed strings: flags…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3b96cf5b9ade</guid>
      <pubDate>Thu, 30 Jul 2026 10:53:45 -0500</pubDate>
      <description><![CDATA[Conditions and effects on a dialogue line are pickers now, not hand-typed strings: flags, items and skills come from a list of what the game actually uses, with the comparison and the arguments typed per action, so an action the game cannot perform is no longer possible to write. The raw text stays available behind an advanced toggle and an untouched line is byte-identical.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Editing English text can now carry the translations with it. Until now changing a line…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-4228dca626cd</guid>
      <pubDate>Thu, 30 Jul 2026 10:53:45 -0500</pubDate>
      <description><![CDATA[Editing English text can now carry the translations with it. Until now changing a line warned that the eight translated languages would lose their match; the confirmation offers to move each existing translation to the new text instead, showing a per-language count first, with one undo for all of it.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The web view gained history: every commit that touched a conversation, and a diff that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-add8ae13fbb7</guid>
      <pubDate>Thu, 30 Jul 2026 10:53:45 -0500</pubDate>
      <description><![CDATA[The web view gained history: every commit that touched a conversation, and a diff that names the section and element on each changed line instead of showing shifted text. Old revisions from before the dialog files became plain text are recovered on read.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Designers can edit dialog from the browser now, not just read it. An edit becomes a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-85f6fa9bede4</guid>
      <pubDate>Thu, 30 Jul 2026 11:57:58 -0500</pubDate>
      <description><![CDATA[Designers can edit dialog from the browser now, not just read it. An edit becomes a commit in that person's name, and when two people save at once the second one's change is replayed against the first rather than rejected, so ids stay correct instead of colliding. Reverting an old change writes a new one; history is never rewritten. Not deployed yet.]]></description>
    </item>
    <item>
      <title>Conversation Studio: Character personas and backstories can be written and generated alongside a conversation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-aff40e5a45eb</guid>
      <pubDate>Thu, 30 Jul 2026 11:57:58 -0500</pubDate>
      <description><![CDATA[Character personas and backstories can be written and generated alongside a conversation. They live as plain text next to the dialog files and are kept out of player builds by the packaging filter, with a test that fails if that filter ever widens, since without it a future build change would ship every designer note in the game.]]></description>
    </item>
    <item>
      <title>Conversation Studio: A character's shared-content list can be edited at last, which was the one thing missing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0e3775576352</guid>
      <pubDate>Thu, 30 Jul 2026 11:57:58 -0500</pubDate>
      <description><![CDATA[A character's shared-content list can be edited at last, which was the one thing missing that would have blocked making a new NPC. Checking the data first turned up something the plan did not know: that list is stored twice, once in each half of a conversation, so every change now writes both together and one undo takes both back.]]></description>
    </item>
    <item>
      <title>Conversation Studio: The checker regained three warnings the old tool had and this one had lost: a character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1fc1b41efcd3</guid>
      <pubDate>Thu, 30 Jul 2026 11:57:58 -0500</pubDate>
      <description><![CDATA[The checker regained three warnings the old tool had and this one had lost: a character with no greeting, no farewell, or no working goodbye. Getting the exemptions right mattered more than the checks, since shared fragments legitimately have none of those; tuned against the whole corpus they report 19, 13 and 12 real cases instead of about 320 each.]]></description>
    </item>
    <item>
      <title>Housing: Fixed three alignment defects on the Stone Five-Story Wizard's Tower village home, all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-fcd6edab1ee6</guid>
      <pubDate>Thu, 30 Jul 2026 06:08:19 -0500</pubDate>
      <description><![CDATA[Fixed three alignment defects on the Stone Five-Story Wizard's Tower village home, all from a player report. One balcony railing run sat at five different heights spanning 20mm, which read as a step in the top of the cap. A column of angled wall sections drifted up to 61mm sideways across four floors, and one stone pillar cap sat 65mm low and 49mm off the pillar beneath it.]]></description>
    </item>
    <item>
      <title>Housing: Audited the same home for the reported missing textures and found none. All 27 materials…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1af3b9413051</guid>
      <pubDate>Thu, 30 Jul 2026 06:09:13 -0500</pubDate>
      <description><![CDATA[Audited the same home for the reported missing textures and found none. All 27 materials resolve, every albedo texture is present on disk, and all 271 mesh references are valid. The remaining candidate is UV stretch from the non-uniform scaling applied to 46% of the home's 244 modular kit pieces.]]></description>
    </item>
    <item>
      <title>Housing: Reaching into a house from outside it now requires being inside. Interacting with a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0bb21da004e2</guid>
      <pubDate>Thu, 30 Jul 2026 06:14:06 -0500</pubDate>
      <description><![CDATA[<strong>Reaching into a house from outside it</strong> now requires being inside. Interacting with a decoration was gated on distance alone, five metres with no test for what stood between you and it, so a window opening put every item in the room within reach of anyone in the yard. An item placed on an interior floor, wall or ceiling is now refused to a player who is not under that house's roof, and the right-click menu is refused with it. A container opened by the door closes when you walk out.]]></description>
    </item>
    <item>
      <title>Housing: The check compares which side of the house shell each of you is on, using two things the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b94a79f9a254</guid>
      <pubDate>Thu, 30 Jul 2026 06:14:06 -0500</pubDate>
      <description><![CDATA[The check compares which side of the house shell each of you is on, using two things the game already records: the surface a decoration was placed on, and what is overhead at a point. It also records which shell it found, so standing inside the next row house along does not count as inside yours. It stands down whenever any of that is unknown, which is what keeps the 208 house prefabs that answer open sky over their own interiors, pavilions and covered porches among them, behaving as they did. Anyone holding move, modify or take rights on an item is exempt, so owners and trusted visitors are unaffected.]]></description>
    </item>
    <item>
      <title>Housing: Decorations placed inside a player dungeon could fail to appear when the dungeon loaded…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-87d28142ab25</guid>
      <pubDate>Thu, 30 Jul 2026 10:39:02 -0500</pubDate>
      <description><![CDATA[Decorations placed inside a player dungeon could fail to appear when the dungeon loaded, and items resting on other items took the worst of it: a chest standing on a table or a shelf went missing while the table and the shelf loaded fine. The same items disappeared every session, through relogs and through leaving and coming back. A plot now loads its decorations in the order the server sends them, so an item is never built before the thing it is sitting on.]]></description>
    </item>
    <item>
      <title>Housing: A busy lot could also stop loading part way through, leaving the decorations near the end…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3684d2acd34d</guid>
      <pubDate>Thu, 30 Jul 2026 10:39:10 -0500</pubDate>
      <description><![CDATA[A busy lot could also stop loading part way through, leaving the decorations near the end of the list absent entirely. The loader was watching for the last item to arrive rather than counting what it had received, so a reordered batch ended the load early. It counts now.]]></description>
    </item>
    <item>
      <title>Housing: Moving a decoration that has other decorations sitting on it no longer leaves those…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f8f4dc401021</guid>
      <pubDate>Thu, 30 Jul 2026 10:39:11 -0500</pubDate>
      <description><![CDATA[Moving a decoration that has other decorations sitting on it no longer leaves those hidden. The children travel with the parent, but each one tracks its own position for distance culling and nothing was updating them, so they kept being hidden as though they were still at the old spot while their collision stayed where you could see they should be. Moving a dungeon room piece was the easy way to hit this.]]></description>
    </item>
    <item>
      <title>Housing: Added an optional Tighter Fit mode to decorating. While it is on, the item you are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8d94ec25dac6</guid>
      <pubDate>Thu, 30 Jul 2026 14:39:37 -0500</pubDate>
      <description><![CDATA[Added an optional <strong>Tighter Fit</strong> mode to decorating. While it is on, the item you are holding gets a placement collision 25% narrower than normal, so a chair goes under a table and two crates can touch. Height is untouched, so resting and stacking work the same. Alt+C or the new button on the decoration strip, remembered between sessions, off by default.]]></description>
    </item>
    <item>
      <title>Housing: Tighter Fit only changes the item being placed. Once it is down it has its full collision…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-7f60f379b190</guid>
      <pubDate>Thu, 30 Jul 2026 14:39:43 -0500</pubDate>
      <description><![CDATA[Tighter Fit only changes the item being placed. Once it is down it has its full collision back, so walking into it and placing the next item against it are unchanged, and it still cannot cross your property line. Chests and other containers, crafting stations, planting beds, wall-hung items, vendors, and lot markers stay at full size so they remain reachable and correctly placed.]]></description>
    </item>
    <item>
      <title>Client: Fixed the vanishing mouse cursor on Mac. Holding the right mouse button to turn the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-720ba11e1b7a</guid>
      <pubDate>Thu, 30 Jul 2026 07:07:25 -0500</pubDate>
      <description><![CDATA[Fixed the vanishing mouse cursor on Mac. Holding the right mouse button to turn the camera hid the cursor and never gave it back, for the rest of the session. The mouse still worked and still clicked, it was just invisible.]]></description>
    </item>
    <item>
      <title>Client: The cursor restore ran through an old third-party plugin whose Mac library was never…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9fe24f1d150f</guid>
      <pubDate>Thu, 30 Jul 2026 07:07:26 -0500</pubDate>
      <description><![CDATA[The cursor restore ran through an old third-party plugin whose Mac library was never shipped inside the app bundle. The failure left a busy flag stuck on, and the code that makes the cursor visible again was waiting on that flag. Mac now moves the cursor itself through the system framework, with no plugin involved.]]></description>
    </item>
    <item>
      <title>Client: Rebuilt the restore path so a failed cursor move can no longer cost you the cursor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d5c9702c6052</guid>
      <pubDate>Thu, 30 Jul 2026 07:07:27 -0500</pubDate>
      <description><![CDATA[Rebuilt the restore path so a failed cursor move can no longer cost you the cursor: visibility is now restored from a guaranteed cleanup step, the wait is time bounded, and a watchdog hands the cursor back if it is ever left hidden with nothing owning it. Windows and Linux keep their existing path.]]></description>
    </item>
    <item>
      <title>Client: The guide light is now something a player can actually use. Open your map in a town…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-ec7fc472484e</guid>
      <pubDate>Thu, 30 Jul 2026 16:57:06 -0500</pubDate>
      <description><![CDATA[The guide light is now something a player can actually use. Open your map in a town, click a marker you have found, and a light rises beside you and flies the walking route ahead, waiting on each corner so you can see which way to turn. It never walks your character for you and it fades on its own after a few minutes.]]></description>
    </item>
    <item>
      <title>Client: Three ways to summon it: click a marker on the map in a town or player-run town, type…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-025a62571706</guid>
      <pubDate>Thu, 30 Jul 2026 16:57:12 -0500</pubDate>
      <description><![CDATA[Three ways to summon it: click a marker on the map in a town or player-run town, type <code>/guide</code>, or bind the Summon Guide key under Options. <code>/guide off</code> puts it away. There is an Enable Guide Light checkbox in Options for anyone who would rather not have it at all.]]></description>
    </item>
    <item>
      <title>Client: The light only leads to markers you can already see on your map or compass, so it will…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1a83030f3c9a</guid>
      <pubDate>Thu, 30 Jul 2026 16:57:21 -0500</pubDate>
      <description><![CDATA[The light only leads to markers you can already see on your map or compass, so it will never point at a place you have not discovered. It stays out of dungeons, basements, random encounters, sieges, battlegrounds and the overworld: working out where to go is the point of those places.]]></description>
    </item>
    <item>
      <title>Client: A bare /guide leads to the destination you set or the quest objective you are on, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-918c1a7055f6</guid>
      <pubDate>Thu, 30 Jul 2026 16:57:28 -0500</pubDate>
      <description><![CDATA[A bare <code>/guide</code> leads to the destination you set or the quest objective you are on, and stops there rather than guessing at the nearest point of interest. Added 22 more editor tests covering what the light is allowed to lead to, how it reads a route by distance, and which marker a click lands on.]]></description>
    </item>
    <item>
      <title>Inventory: Inventory rows are back to the density the old window had. The converted table was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-73e6d370d0c6</guid>
      <pubDate>Thu, 30 Jul 2026 05:53:57 -0500</pubDate>
      <description><![CDATA[Inventory rows are back to the density the old window had. The converted table was drawing rows half again as tall as before, so the same full-height backpack showed about 26 items where it used to show 41. Rows are 24 pixels again, matching the list the conversion replaced. This covers the backpack, containers, the bank, lot storage, vendor windows, the crafting station, the deco palette and the jukebox.]]></description>
    </item>
    <item>
      <title>Inventory: The backpack window spends less of its height on controls: the category filter button and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-85e368eaa647</guid>
      <pubDate>Thu, 30 Jul 2026 05:54:05 -0500</pubDate>
      <description><![CDATA[The backpack window spends less of its height on controls: the category filter button and the search box now share one line instead of stacking, which is another item row back. The filter button is capped and truncates, so a long category name cannot squeeze the search box out on a narrow window.]]></description>
    </item>
    <item>
      <title>Inventory: Take All no longer closes the container it just emptied. The window stays open until you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-ff7e2f96725c</guid>
      <pubDate>Thu, 30 Jul 2026 18:56:55 -0500</pubDate>
      <description><![CDATA[Take All no longer closes the container it just emptied. The window stays open until you close it, so you can see what is left, put something back, or keep working out of it.]]></description>
    </item>
    <item>
      <title>Inventory: Take All also used to close the window when only part of the contents moved. Anything too…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-983d7f668435</guid>
      <pubDate>Thu, 30 Jul 2026 18:56:56 -0500</pubDate>
      <description><![CDATA[Take All also used to close the window when only part of the contents moved. Anything too heavy to carry stayed in the container and went off screen with it. Those leftovers are now still listed in front of you.]]></description>
    </item>
    <item>
      <title>Inventory: The interact key stops counting as a Take All once a container is empty. An emptied…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-80209b7776cb</guid>
      <pubDate>Thu, 30 Jul 2026 18:56:57 -0500</pubDate>
      <description><![CDATA[The interact key stops counting as a Take All once a container is empty. An emptied window left open was about to start swallowing that key, which would have blocked talking to people and opening doors while it sat there.]]></description>
    </item>
    <item>
      <title>Inventory: Item list column headings now show the whole word. Durability was labelled "Dur" and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-01ba87431ea2</guid>
      <pubDate>Thu, 30 Jul 2026 19:33:47 -0500</pubDate>
      <description><![CDATA[Item list column headings now show the whole word. Durability was labelled "Dur" and quantity "Qty" in the backpack, bank, containers and the crafting table, and testers read those as headings the window had cut off. Both columns were widened to hold the full word while sorted, which draws the heading in bold with an arrow beside it.]]></description>
    </item>
    <item>
      <title>Combat: Body Slam, Charge and Engage work again on rooted creatures. A charge moves the caster…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-895720f99a5a</guid>
      <pubDate>Thu, 30 Jul 2026 06:01:43 -0500</pubDate>
      <description><![CDATA[Body Slam, Charge and Engage work again on rooted creatures. A charge moves the caster, but the code checked whether the <em>target</em> could move before allowing it, so a rooted enemy cancelled the whole glyph: no slam, no damage, no stun, and the card spent anyway. Root now stops the character it actually holds. Rooted creatures are still immune to being dragged by Pull, and they still take the rest of the hit.]]></description>
    </item>
    <item>
      <title>Combat: While you are rooted the three charge glyphs grey out and refuse with a reason instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-06c1b3e4ed99</guid>
      <pubDate>Thu, 30 Jul 2026 06:01:43 -0500</pubDate>
      <description><![CDATA[While you are rooted the three charge glyphs grey out and refuse with a reason instead of playing a run-in-place animation and eating the glyph, and a root that lands mid-charge stops it. Rooted creatures follow the same rule: a held boar picks a different attack rather than a charge it cannot make. Two more copies of the same wrong-entity check, in the movement-field effect and in the charge coroutine, were fixed alongside.]]></description>
    </item>
    <item>
      <title>Combat: Swept all 1664 rune assets for the minimum-range problem that was fixed one rune at a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9aa079b21a1d</guid>
      <pubDate>Thu, 30 Jul 2026 10:16:07 -0500</pubDate>
      <description><![CDATA[Swept all 1664 rune assets for the minimum-range problem that was fixed one rune at a time in Death Field and Discharge. 233 of them are area attacks centred on the caster, and 16 of those advertised a minimum casting distance they do not have. Among them were the creature versions of Death Field and Discharge, which the earlier fix had left alone. Creatures using these attacks now close in and land them, where before they backed off to a distance the attack could not reach.]]></description>
    </item>
    <item>
      <title>Combat: The regression test behind that fix pinned two runes by name. It now enforces the rule…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-809b4a2d9870</guid>
      <pubDate>Thu, 30 Jul 2026 10:16:22 -0500</pubDate>
      <description><![CDATA[The regression test behind that fix pinned two runes by name. It now enforces the rule across every rune in the set, so a re-authored minimum fails the build instead of sitting in the data. Three runes keep a minimum on purpose and each carries its reason in the test: a flying kobold whose minimum is what keeps it airborne, and two runes using the shared value that means no range gate at all. A second test fails if one of those exemptions goes stale.]]></description>
    </item>
    <item>
      <title>Tooling: Shortened how long an abandoned editor reservation can block other work: the idle timeout…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-877346844851</guid>
      <pubDate>Thu, 30 Jul 2026 06:15:45 -0500</pubDate>
      <description><![CDATA[Shortened how long an abandoned editor reservation can block other work: the idle timeout drops from 10 minutes to 4, and the longer hold that protects a call already in flight drops from 30 minutes to 15. Only a test run keeps the long hold now, since it is the one call that legitimately goes quiet for minutes.]]></description>
    </item>
    <item>
      <title>Tooling: Wrote a one-click setup script for new developer machines. It checks what is already…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-887b07d7adfb</guid>
      <pubDate>Thu, 30 Jul 2026 17:26:25 -0500</pubDate>
      <description><![CDATA[Wrote a one-click setup script for new developer machines. It checks what is already installed, warns when the target drive is too small, and runs the whole first-time download. If the transfer drops partway, running it again resumes rather than starting the 150 GB over.]]></description>
    </item>
    <item>
      <title>Tooling: Gave the setup script two guards, since it reconfigures whatever folder it is pointed at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-451320f3be59</guid>
      <pubDate>Thu, 30 Jul 2026 17:26:26 -0500</pubDate>
      <description><![CDATA[Gave the setup script two guards, since it reconfigures whatever folder it is pointed at: it refuses a folder that is not a checkout, and refuses a checkout belonging to a different project. Without the second one it would have hidden files in an unrelated working tree.]]></description>
    </item>
    <item>
      <title>Creatures: Killing a Watcher now always leaves a Metal Scrap. The two small Oracle machines that go…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0ce3ee4b4275</guid>
      <pubDate>Thu, 30 Jul 2026 07:54:39 -0500</pubDate>
      <description><![CDATA[Killing a Watcher now always leaves a Metal Scrap. The two small Oracle machines that go by that name had the scrap slot already wired up but set to drop once in a thousand kills, and neither carries any other reward bundle, so the body came up empty about 99% of the time on the flying one and 90% on the crawling one. Reported by a player through the in-game Oracle.]]></description>
    </item>
    <item>
      <title>Creatures: The rate follows what already shipped elsewhere in the family: every Oracle machine from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c00dad586ddf</guid>
      <pubDate>Thu, 30 Jul 2026 07:54:40 -0500</pubDate>
      <description><![CDATA[The rate follows what already shipped elsewhere in the family: every Oracle machine from tier 5 up drops scrap on every kill, and a tier 1 copper golem already gives a guaranteed one. A Watcher has 1 health and pays 1 experience, so its payout stays at a single scrap.]]></description>
    </item>
    <item>
      <title>Launcher: Checked the Linux launcher and patch channel against what the source says should be live…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-2971f5433dec</guid>
      <pubDate>Thu, 30 Jul 2026 07:51:57 -0500</pubDate>
      <description><![CDATA[Checked the Linux launcher and patch channel against what the source says should be live. Both match, and the Linux game build ships from the same source revision as Windows about a minute behind it. Mac still has no launcher, so Mac testers re-download the whole client every build.]]></description>
    </item>
    <item>
      <title>Launcher: Started the Mac launcher. Cleared two things that would have broken the first Mac patch…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3de44e814887</guid>
      <pubDate>Thu, 30 Jul 2026 07:52:05 -0500</pubDate>
      <description><![CDATA[Started the Mac launcher. Cleared two things that would have broken the first Mac patch release: the deploy stored Mac files under a folder name the launcher never asks for, and the Mac launch target named the application bundle instead of the program inside it. Also measured the Mac client for symbolic links and found none, so the patch format did not need a new field for them.]]></description>
    </item>
    <item>
      <title>Launcher: Built the Mac launcher application bundle, along with the companion bundle the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9bf1f737150a</guid>
      <pubDate>Thu, 30 Jul 2026 08:06:49 -0500</pubDate>
      <description><![CDATA[Built the Mac launcher application bundle, along with the companion bundle the game itself launches, and scripted the whole assembly so it can be repeated.]]></description>
    </item>
    <item>
      <title>Launcher: Settled where a Mac install keeps its files. On Windows and Linux the launcher, its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f55bf8ad195f</guid>
      <pubDate>Thu, 30 Jul 2026 08:06:58 -0500</pubDate>
      <description><![CDATA[Settled where a Mac install keeps its files. On Windows and Linux the launcher, its settings and the game all share one folder. On Mac the launcher lives inside a signed application bundle that cannot be written to and is replaced whole on every launcher update, so the settings and the game tree now sit in the user Application Support folder instead. Windows and Linux keep the layout they had.]]></description>
    </item>
    <item>
      <title>Launcher: Taught the launcher to update itself on Mac. Everywhere else that means replacing one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e0726ca4b3d9</guid>
      <pubDate>Thu, 30 Jul 2026 08:18:06 -0500</pubDate>
      <description><![CDATA[Taught the launcher to update itself on Mac. Everywhere else that means replacing one file; on Mac it means replacing a folder, so the old copy is now moved aside rather than deleted and put back if anything goes wrong, instead of leaving no launcher at all.]]></description>
    </item>
    <item>
      <title>Launcher: Found the Mac launcher would not have started the game: the way it worked out which…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3a8f2e2adcf8</guid>
      <pubDate>Thu, 30 Jul 2026 08:18:15 -0500</pubDate>
      <description><![CDATA[Found the Mac launcher would not have started the game: the way it worked out which program to run inside an application folder guessed from the folder name, and the Mac folder and program names differ. It now reads the name the system itself uses. Two tests caught this before it shipped.]]></description>
    </item>
    <item>
      <title>Launcher: Prepared the patch server for Mac downloads, including teaching the cleanup job about the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-fe62853c75e7</guid>
      <pubDate>Thu, 30 Jul 2026 08:18:15 -0500</pubDate>
      <description><![CDATA[Prepared the patch server for Mac downloads, including teaching the cleanup job about the Mac launcher file shape. Without that, every Mac launcher ever published would have been kept on the server forever.]]></description>
    </item>
    <item>
      <title>Launcher: The Mac launcher is live. Mac testers can download it from the tester page instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f071529f58ab</guid>
      <pubDate>Thu, 30 Jul 2026 09:14:40 -0500</pubDate>
      <description><![CDATA[The Mac launcher is live. Mac testers can download it from the tester page instead of re-downloading the whole 16 GB client after every build: it installs the game, patches only what changed, and keeps itself up to date. The full-client download has been retired from the page. First launch still needs a right-click and Open, since the app is not notarized yet.]]></description>
    </item>
    <item>
      <title>Launcher: Published the Mac game files to their own patch channel, from the same source revision as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-abbfef389a4b</guid>
      <pubDate>Thu, 30 Jul 2026 09:14:40 -0500</pubDate>
      <description><![CDATA[Published the Mac game files to their own patch channel, from the same source revision as Windows and Linux, so all three platforms now patch from one build number. The Mac launcher had to be built on a Mac: built from Windows it comes out with no signature at all, and Apple Silicon refuses to run that rather than warning about it.]]></description>
    </item>
    <item>
      <title>Web: Clicking a screenshot on this page opens the full-size image again. Screenshots added…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a10be106f551</guid>
      <pubDate>Thu, 30 Jul 2026 07:53:07 -0500</pubDate>
      <description><![CDATA[Clicking a screenshot on this page opens the full-size image again. Screenshots added since the twenty-fifth were written in a slightly different shape to the ones before them, and the click-to-expand code only recognised the older shape, so the nine newest thumbnails did nothing when clicked while still showing the zoom cursor. It now works off the thumbnail itself, so both shapes open, and so do the copies the newest-first view makes.]]></description>
    </item>
    <item>
      <title>Web: Newest first now shows images in the timeline on every day. Whether a day put its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d7bb1115c9ff</guid>
      <pubDate>Thu, 30 Jul 2026 07:53:15 -0500</pubDate>
      <description><![CDATA[Newest first now shows images in the timeline on every day. Whether a day put its screenshots in the timeline or in a block at the bottom had been decided by which way those screenshots happened to be added, so the front page disagreed with itself day to day. The arrows and the picture counter also count only the images on screen now, instead of counting the hidden copy of every one of them twice.]]></description>
    </item>
    <item>
      <title>Web: Publishing the page now refuses two kinds of markup that render fine and behave badly: a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-429131f373a2</guid>
      <pubDate>Thu, 30 Jul 2026 07:53:23 -0500</pubDate>
      <description><![CDATA[Publishing the page now refuses two kinds of markup that render fine and behave badly: a thumbnail frame with no picture inside it, and a whole section pasted into a single bullet. Two bullets from the twenty-eighth carried the second one and were repaired. The five days of dead thumbnails got past every existing check because they all read either page furniture or bullet text, and nothing read shape.]]></description>
    </item>
    <item>
      <title>Web: The X that closes an expanded image works. It sits inside the right-hand arrow, which is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c6655feb74a8</guid>
      <pubDate>Thu, 30 Jul 2026 08:11:42 -0500</pubDate>
      <description><![CDATA[The X that closes an expanded image works. It sits inside the right-hand arrow, which is a full-height strip and was drawn over the top of it, so the X answered nothing on hover and a click there paged to the next picture instead of closing. The arrow still pages everywhere else along that edge. Escape and a click on the dark background have always closed it and still do.]]></description>
    </item>
    <item>
      <title>Chat: Chat tabs answer the mouse again. Dragging a tab out of the window makes a window of its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-5b5ffb7fdc81</guid>
      <pubDate>Thu, 30 Jul 2026 09:13:14 -0500</pubDate>
      <description><![CDATA[Chat tabs answer the mouse again. Dragging a tab out of the window makes a window of its own, dropping one on another chat window's tab line moves it into that window, and a short sideways drag reorders it along the bar. Tuesday's fix gave the window its move handle back, and the tab drags themselves still did nothing in any direction.]]></description>
    </item>
    <item>
      <title>Chat: The press a drag begins with was being taken by the tab's own click handling before the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-84a79f5e7715</guid>
      <pubDate>Thu, 30 Jul 2026 09:13:15 -0500</pubDate>
      <description><![CDATA[The press a drag begins with was being taken by the tab's own click handling before the drag could see it, so every gesture read as a click. A tab now owns the whole gesture from press to release. New tests press, drag and release through the real input path, where the old ones built the window in isolation and never dispatched anything, which is how a drag wired to nothing passed them twice.]]></description>
    </item>
    <item>
      <title>Chat: The chat window's cog menu had two settings that did nothing. "Use Transparent…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-010dc6698657</guid>
      <pubDate>Thu, 30 Jul 2026 19:29:51 -0500</pubDate>
      <description><![CDATA[The chat window's cog menu had two settings that did nothing. "Use Transparent Background" now clears the window's panel and the backing behind the messages so chat reads over the world, while the frame, tabs and typing field keep theirs; "Use Opaque Background" puts the dark panel back. The window still opens with the dark panel unless you pick transparent.]]></description>
    </item>
    <item>
      <title>Chat: The "Enable / Disable Clickable Keywords" setting now applies to every line already in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-91a626d5c8cc</guid>
      <pubDate>Thu, 30 Jul 2026 19:29:59 -0500</pubDate>
      <description><![CDATA[The "Enable / Disable Clickable Keywords" setting now applies to every line already in your chat log rather than only to lines spoken after you flip it, and turning keywords back on restores all of them. The markup was being baked into each line as it arrived, so old lines stayed clickable forever; the log now decides when it draws the line.]]></description>
    </item>
    <item>
      <title>Interface: The school filter in the deck editor ran a column of twenty checkboxes off the bottom of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3d77cb709335</guid>
      <pubDate>Thu, 30 Jul 2026 08:22:12 -0500</pubDate>
      <description><![CDATA[The school filter in the deck editor ran a column of twenty checkboxes off the bottom of the window with no way to scroll, so the schools below the fold could not be ticked or cleared at all. The list now scrolls inside a box sized to the window, and the glyph list underneath keeps a visible strip instead of being pushed out of the way.]]></description>
    </item>
    <item>
      <title>Interface: Two more things in the same panel: the open school filter had no background behind it, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6a8a742974f8</guid>
      <pubDate>Thu, 30 Jul 2026 08:22:19 -0500</pubDate>
      <description><![CDATA[Two more things in the same panel: the open school filter had no background behind it, so the checkboxes drew straight over the card list, and neither the Glyphs nor the Combos tab ever showed which one you were on. Both were style names that matched nothing, and both windows that share the filter got the fix.]]></description>
    </item>
    <item>
      <title>Interface: A follow-up in the same filter, found while reviewing the fix: a school box and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-f4272f7ec2e3</guid>
      <pubDate>Thu, 30 Jul 2026 08:51:07 -0500</pubDate>
      <description><![CDATA[A follow-up in the same filter, found while reviewing the fix: a school box and the school it stood for could drift apart in the list, which would have shown ticked schools as clear and clear ones as ticked whenever the window reopened. It needed a school with no category behind it to trigger, and there is not one today, so nothing was visibly wrong yet.]]></description>
    </item>
    <item>
      <title>Interface: The countdown on the need or greed loot popup runs cyan, then yellow, then red as its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d82da5826d2c</guid>
      <pubDate>Thu, 30 Jul 2026 09:45:23 -0500</pubDate>
      <description><![CDATA[The countdown on the need or greed loot popup runs cyan, then yellow, then red as its twenty seconds drain. The red stage never arrived: its threshold sat behind the yellow one, so every value that reached it had already been claimed. The number held cyan until fourteen seconds remained, then went yellow the rest of the way to zero. It now holds cyan to fourteen seconds, turns yellow from thirteen down to seven, and runs red for the last six. The bands moved into a helper with tests that walk a full countdown, so the order cannot invert again.]]></description>
    </item>
    <item>
      <title>Interface: Swept the rest of the client for the same mistake, on the theory that one unreachable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-ed9994ac4d99</guid>
      <pubDate>Thu, 30 Jul 2026 09:45:31 -0500</pubDate>
      <description><![CDATA[Swept the rest of the client for the same mistake, on the theory that one unreachable colour band rarely travels alone. The encumbrance, fizzle chance, frame rate and housing readouts all order their thresholds correctly. The loot countdown was the only one that did not.]]></description>
    </item>
    <item>
      <title>Interface: The charge bar is back above the hotbar. Holding a locked glyph drew the skill name with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c9af8ef6cbe0</guid>
      <pubDate>Thu, 30 Jul 2026 11:22:48 -0500</pubDate>
      <description><![CDATA[The charge bar is back above the hotbar. Holding a locked glyph drew the skill name with nothing under it. When these readouts moved to the new interface, the bar they draw in was left to a style rule that was never written, so it collapsed to no size at all and the fills inside it had nothing to fill. Five more readouts shared the gap: the casting bar, the melee attack charge bar, the harvesting bar, the control point capture meter and the resurrection shrine meter.]]></description>
    </item>
    <item>
      <title>Interface: Put the charge bar back to the look it was built with. All three of its colours had been…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-44233d809616</guid>
      <pubDate>Thu, 30 Jul 2026 11:23:00 -0500</pubDate>
      <description><![CDATA[Put the charge bar back to the look it was built with. All three of its colours had been redrawn from scratch during the move, so the fill is yellow again with the orange band riding over it as whole charges complete, and spent charges shade in red from the right hand end instead of covering the progress just earned. The dividers now land on the charge marks rather than between them.]]></description>
    </item>
    <item>
      <title>Interface: Every one of these bars had been positioned by working out a fraction of the screen…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-299196725881</guid>
      <pubDate>Thu, 30 Jul 2026 11:23:00 -0500</pubDate>
      <description><![CDATA[Every one of these bars had been positioned by working out a fraction of the screen height, which put them in three different bands and moved them whenever a player changed resolution. They now use the fixed offsets they were built with: 160 pixels above the bottom of the screen for the charge, casting and attack bars, 188 for the capture meter, and just above centre for harvesting.]]></description>
    </item>
    <item>
      <title>Interface: Added the check that would have caught this. The old tests asserted percentages, which a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0fd947e0a50e</guid>
      <pubDate>Thu, 30 Jul 2026 11:23:00 -0500</pubDate>
      <description><![CDATA[Added the check that would have caught this. The old tests asserted percentages, which a zero sized bar satisfies perfectly, so the suite stayed green while nothing drew. The new ones lay each bar out on a real panel and measure it. Two further guards stop the next conversion repeating the mistake: no view may reference a style class the theme does not define, and no combat bar may go back to placing itself by screen fraction.]]></description>
    </item>
    <item>
      <title>Interface: The Options button in the skills window did nothing when you pressed it. It was asking…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d4f3f49ce4ac</guid>
      <pubDate>Thu, 30 Jul 2026 19:14:11 -0500</pubDate>
      <description><![CDATA[The Options button in the skills window did nothing when you pressed it. It was asking the old tab strip which category was on screen, and the rewritten window stopped answering, so the menu came back empty and an empty menu opens nothing at all. It now reads the selection the window is actually showing, so the two instant unlearn entries are listed again for the tree and the category you are looking at.]]></description>
    </item>
    <item>
      <title>Interface: Rows in right-click and options menus lost their tooltips somewhere in the move to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-898ee42c1ad1</guid>
      <pubDate>Thu, 30 Jul 2026 19:14:12 -0500</pubDate>
      <description><![CDATA[Rows in right-click and options menus lost their tooltips somewhere in the move to the new menu, which left a greyed-out entry with no way to find out why it was greyed out. Rows carry their tooltip again, and the menu layer now sits under the tooltip layer instead of tied with it, so a row explanation draws over the menu rather than behind it.]]></description>
    </item>
    <item>
      <title>Interface: The check that guards those column widths now measures the headings on a live panel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b3c60ba7a6fc</guid>
      <pubDate>Thu, 30 Jul 2026 19:33:55 -0500</pubDate>
      <description><![CDATA[The check that guards those column widths now measures the headings on a live panel instead of storing numbers from an old measurement. It had been measuring them unbolded, so it could not see that a sorted heading draws about 7 percent wider, which is how the abbreviations came to look necessary. A weight heading was already a couple of pixels over its column on that count.]]></description>
    </item>
    <item>
      <title>Decorating: Lot layouts got a new name. The feature that shipped yesterday as Blueprints is now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d710b5025ab1</guid>
      <pubDate>Thu, 30 Jul 2026 08:59:18 -0500</pubDate>
      <description><![CDATA[Lot layouts got a new name. The feature that shipped yesterday as Blueprints is now <b>Decoration Layouts</b>, because blueprints have meant the dungeon pieces you craft for a player dungeon since 2018 and two of them under one name helped nobody. The window, the deco strip button, the craftable item and its recipe all read layout now.]]></description>
    </item>
    <item>
      <title>Decorating: Saved layouts came along with the rename. Files move from the old folder to a new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-55d1a6cd6225</guid>
      <pubDate>Thu, 30 Jul 2026 08:59:28 -0500</pubDate>
      <description><![CDATA[Saved layouts came along with the rename. Files move from the old folder to a new DecorationLayouts folder the first time you open the window, layout codes shared before the change still import, and an item you already recorded still previews and applies.]]></description>
    </item>
    <item>
      <title>Decorating: The Open Folder button in that window did nothing, so there was no way to reach your…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-7e0e1a227d7b</guid>
      <pubDate>Thu, 30 Jul 2026 08:59:29 -0500</pubDate>
      <description><![CDATA[The <b>Open Folder</b> button in that window did nothing, so there was no way to reach your saved files from in game. It used a Windows-only call that fails outright on Mac, and the failure went to the log rather than the screen. It now opens the folder on all three platforms, and prints the full path to the window and chat if the system refuses.]]></description>
    </item>
    <item>
      <title>NPCs: Two testers reported NPCs in the Isle of Storms tutorial that could be heard but not seen…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-4ed825e88cb5</guid>
      <pubDate>Thu, 30 Jul 2026 09:39:03 -0500</pubDate>
      <description><![CDATA[Two testers reported NPCs in the Isle of Storms tutorial that could be heard but not seen or clicked, and the client had said nothing about it. Every way an NPC can end up with no body was silent, so the client now names any NPC that finishes spawning with nothing to draw.]]></description>
    </item>
    <item>
      <title>NPCs: Swept the whole Isle of Storms tutorial for the same fault: all seven Anais spawn points…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-fd35094ba319</guid>
      <pubDate>Thu, 30 Jul 2026 09:39:11 -0500</pubDate>
      <description><![CDATA[Swept the whole Isle of Storms tutorial for the same fault: all seven Anais spawn points, the automaton, Arabella, the Oracle and the practice dummies build a body and a click target correctly, so the cause is not in the content. A new test walks every spawn point in that scene and fails if one of them would come up empty.]]></description>
    </item>
    <item>
      <title>NPCs: Added a developer command that answers why an NPC is missing: it reports whether the NPC…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-db897b846ede</guid>
      <pubDate>Thu, 30 Jul 2026 10:45:10 -0500</pubDate>
      <description><![CDATA[Added a developer command that answers why an NPC is missing: it reports whether the NPC never appeared, appeared with no body, or appeared and was then hidden. Those three faults look identical in game and the client used to tell them apart not at all.]]></description>
    </item>
    <item>
      <title>NPCs: Fixed a report that NPCs kept calling out their passing lines at players who were dead. A…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a9808b3089a2</guid>
      <pubDate>Thu, 30 Jul 2026 13:46:09 -0500</pubDate>
      <description><![CDATA[Fixed a report that NPCs kept calling out their passing lines at players who were dead. A dead player is a ghost, so NPCs now ignore them entirely: no bubble, no chat log line, no voice, and the NPC does not turn and gesture at you either. NPC to NPC chatter and NPC death cries still play, and the Isle of Storms opening is unchanged since you are meant to be a ghost there.]]></description>
    </item>
    <item>
      <title>NPC Dialogue: NPC voices now stop when you leave a conversation. A spoken reply used to keep playing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-7566735db650</guid>
      <pubDate>Thu, 30 Jul 2026 10:05:43 -0500</pubDate>
      <description><![CDATA[NPC voices now stop when you leave a conversation. A spoken reply used to keep playing after you pressed Escape, so you would hear the rest of the sentence while walking away.]]></description>
    </item>
    <item>
      <title>NPC Dialogue: A farewell you asked for still plays to the end. Clicking Goodbye ends the conversation a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b2b275cf1c56</guid>
      <pubDate>Thu, 30 Jul 2026 10:05:44 -0500</pubDate>
      <description><![CDATA[A farewell you asked for still plays to the end. Clicking Goodbye ends the conversation a tenth of a second after the line starts, so cutting every exit would have clipped every goodbye.]]></description>
    </item>
    <item>
      <title>Testing: Tester reports now get read and acted on every night. The existing sweep only understood…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-5e757af087ef</guid>
      <pubDate>Thu, 30 Jul 2026 09:09:28 -0500</pubDate>
      <description><![CDATA[Tester reports now get read and acted on every night. The existing sweep only understood one comment format, and testers were writing a different one: the task template asks them to copy the checklist into a comment with PASS or FAIL after each line, and that is what almost all of them do. None of it was being processed, so it piled up. 81 verification tasks sat parked, 57 of them with no development issue anywhere, which meant the finding existed only as a comment on a task nobody would open again.]]></description>
    </item>
    <item>
      <title>Testing: Cleared the whole backlog in one pass: 112 tester reports read, 68 new bugs filed and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-0bd37fa26fa9</guid>
      <pubDate>Thu, 30 Jul 2026 09:09:28 -0500</pubDate>
      <description><![CDATA[Cleared the whole backlog in one pass: 112 tester reports read, 68 new bugs filed and assigned, 19 existing issues reopened, 17 tasks closed as verified. 50 bugs testers had filed themselves were sitting unowned and now have someone on them. Three reports were left alone on purpose because they need a human decision rather than a fix.]]></description>
    </item>
    <item>
      <title>Testing: A failed verification now closes its task and moves the finding onto a development issue…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b21c9ae4753c</guid>
      <pubDate>Thu, 30 Jul 2026 09:09:28 -0500</pubDate>
      <description><![CDATA[A failed verification now closes its task and moves the finding onto a development issue, instead of parking the task. Parking was a dead end: the note promised the task would come back when a fix landed, and nothing in the system could ever bring it back.]]></description>
    </item>
    <item>
      <title>Testing: Testers can now clear or reset the fog of war on a dungeon map from the tester window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c50377579216</guid>
      <pubDate>Thu, 30 Jul 2026 15:50:55 -0500</pubDate>
      <description><![CDATA[Testers can now clear or reset the fog of war on a dungeon map from the tester window. Clear reveals the whole dungeon on every floor at once, reset puts it back to unexplored so the reveal can be walked and watched again.]]></description>
    </item>
    <item>
      <title>Oracle: The Oracle can now answer where a trainer is. Its knowledge base had nothing on trainers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8e07cc75b132</guid>
      <pubDate>Thu, 30 Jul 2026 10:02:53 -0500</pubDate>
      <description><![CDATA[The Oracle can now answer where a trainer is. Its knowledge base had nothing on trainers at all, so a player who asked it where to find the Master Air Magic Trainer got no answer. There is now a trainers guide covering all 21 master trainers, the towns they live in, and which skills only they teach, and every school guide gained a "Where to train" section. Live on the Oracle now.]]></description>
    </item>
    <item>
      <title>Gameplay: Kingsport townspeople can point you at the trainers. Asking a local where something is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-436cf75fcd95</guid>
      <pubDate>Thu, 30 Jul 2026 10:03:06 -0500</pubDate>
      <description><![CDATA[Kingsport townspeople can point you at the trainers. Asking a local where something is worked for the bank, the tavern and the market, but there was no answer for any trainer, so "I can't find the air trainer" got nothing back. The player who reported it was standing about five metres from the town's general trainer and twenty-eight from the master they wanted. Locals now give directions to the air trainer, the moon trainer and the general trainer, and they sort out the two Jeremys in town.]]></description>
    </item>
    <item>
      <title>Audio: NPCs now say the same word for you that their text shows. Characters who do not know your…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-50617a2fa791</guid>
      <pubDate>Thu, 30 Jul 2026 10:34:07 -0500</pubDate>
      <description><![CDATA[NPCs now say the same word for you that their text shows. Characters who do not know your name call you "friend", "stranger", "human", "traveller", "your grace" and about ninety other things depending on who they are, but every spoken line said "outlander" regardless. The written word was already stored per character; the voice pipeline was never reading it. 1,945 of the 2,873 voiced characters were affected, so roughly two thirds of the game.]]></description>
    </item>
    <item>
      <title>Audio: While fixing that, found 669 characters with no audio at all on the lines where they say…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-ddf71e66c58f</guid>
      <pubDate>Thu, 30 Jul 2026 10:34:07 -0500</pubDate>
      <description><![CDATA[While fixing that, found 669 characters with no audio at all on the lines where they say their own name. Generic townsfolk share one conversation file, and the generator was only ever recording the first name in each group, so Brittany's guards produced audio for "Guard" and nothing for Lucas Porter, Neil Landry or the four others behind the same file. Regenerated 4,138 clips to cover both fixes.]]></description>
    </item>
    <item>
      <title>Docs: Wrote a setup guide for developers who have never used git, taking a bare Windows machine…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c50da2c1a64c</guid>
      <pubDate>Thu, 30 Jul 2026 13:52:47 -0500</pubDate>
      <description><![CDATA[Wrote a setup guide for developers who have never used git, taking a bare Windows machine through to the game client running in the editor. It covers the disk and time budget (around 400 GB, most of a day), the exact commands to run, and a troubleshooting list for the ways it usually goes wrong.]]></description>
    </item>
    <item>
      <title>Docs: Replaced the download instructions in the developer docs. A plain clone of the repo…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c50166f35137</guid>
      <pubDate>Thu, 30 Jul 2026 13:52:48 -0500</pubDate>
      <description><![CDATA[Replaced the download instructions in the developer docs. A plain clone of the repo stalls while the server tries to pack 178 GB into a single archive; the partial checkout the guide now uses finished in 16 seconds in testing, and lets the art content download separately so an interrupted transfer resumes instead of starting over.]]></description>
    </item>
    <item>
      <title>Docs: Corrected the old developer setup page. It still named the previous editor version…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1ce011582e30</guid>
      <pubDate>Thu, 30 Jul 2026 13:52:48 -0500</pubDate>
      <description><![CDATA[Corrected the old developer setup page. It still named the previous editor version, carried a placeholder where the repository address should be, and recommended a git setting that disables large-file support.]]></description>
    </item>
    <item>
      <title>Docs: Added guidance for artists and designers moving over from Perforce on which git app to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-09615793d2bc</guid>
      <pubDate>Thu, 30 Jul 2026 17:26:26 -0500</pubDate>
      <description><![CDATA[Added guidance for artists and designers moving over from Perforce on which git app to use for day-to-day work, and which to avoid: one popular client puts a status icon on every file in Explorer, which does not hold up on a project of 400,000 files.]]></description>
    </item>
    <item>
      <title>Player Dungeons: Dragon totems attach to the Rise Shaft socket again. The statue was being measured…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-42573001b59c</guid>
      <pubDate>Thu, 30 Jul 2026 13:53:15 -0500</pubDate>
      <description><![CDATA[Dragon totems attach to the Rise Shaft socket again. The statue was being measured wingtip to wingtip when the game checked whether it fit on the pedestal, so it always came back blocked. It is now measured the same way every other totem is, at 0.23m across instead of 1.11m. The statue itself is unchanged and still matches the other totems for height.]]></description>
    </item>
    <item>
      <title>Player Dungeons: Level 1 totems spawn creatures again. Four rooms had no creature listed for the lowest…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9da3b4803cb6</guid>
      <pubDate>Thu, 30 Jul 2026 13:53:15 -0500</pubDate>
      <description><![CDATA[Level 1 totems spawn creatures again. Four rooms had no creature listed for the lowest totem tier, and the Rise Shaft was the worst of them: a Level 1 elf or troll totem lit up eleven spawn points with nothing in any of them. Levels 2 through 6 were never affected. The Troll room, the Hilt Rotunda and Challenge Dungeon 01 are filled in too.]]></description>
    </item>
    <item>
      <title>Player Dungeons: Two spawn rooms in one dungeon no longer cancel each other out. Every room numbered its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-81aeab13654b</guid>
      <pubDate>Thu, 30 Jul 2026 13:53:15 -0500</pubDate>
      <description><![CDATA[Two spawn rooms in one dungeon no longer cancel each other out. Every room numbered its spawn points from one and the game kept a single list for the whole dungeon, so a spawn point in one room could quietly displace one in another and neither would ever appear. Spawn points are now tracked per placed room.]]></description>
    </item>
    <item>
      <title>Decorations: The three Ornate Elven planting beds carried no collision shape on the bed itself, so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-e4fb09831e18</guid>
      <pubDate>Thu, 30 Jul 2026 15:31:40 -0500</pubDate>
      <description><![CDATA[The three Ornate Elven planting beds carried no collision shape on the bed itself, so the game refused to place them on a lot and gave no name when you hovered the frame. Both problems came from that one missing piece. All nine framed planting beds now share the same box collision, sized from the collision shapes the art already ships.]]></description>
    </item>
    <item>
      <title>Decorations: The Ornate Viking beds were the ones the earlier rollback missed, so they were still on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d391c28f8324</guid>
      <pubDate>Thu, 30 Jul 2026 15:31:49 -0500</pubDate>
      <description><![CDATA[The Ornate Viking beds were the ones the earlier rollback missed, so they were still on mesh collision while every other bed used a box. They now match the rest of the set, which also takes them off a drag-time collision path no other bed used.]]></description>
    </item>
    <item>
      <title>Decorations: The small Ornate Elven bed dropped to its low detail level about five times closer to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-c687d8feba60</guid>
      <pubDate>Thu, 30 Jul 2026 15:31:50 -0500</pubDate>
      <description><![CDATA[The small Ornate Elven bed dropped to its low detail level about five times closer to the camera than any other bed, and the watered patches went with it. Its threshold is back in line with its siblings, so watered ground stays visible at a normal viewing distance.]]></description>
    </item>
    <item>
      <title>Decorations: The check that stops you sowing into a bed something else is intruding on had come…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-8bfdda3c22b6</guid>
      <pubDate>Thu, 30 Jul 2026 15:31:58 -0500</pubDate>
      <description><![CDATA[The check that stops you sowing into a bed something else is intruding on had come unwired on six of the nine beds, where it passed everything instead of checking. It is wired on all nine again. Beds placed flush side by side keep 0.23 to 0.36 metres of clearance, so ordinary layouts are unaffected.]]></description>
    </item>
    <item>
      <title>Decorations: Added an editor test that checks every planting bed for its root collider, its overlap…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-33639f9aa349</guid>
      <pubDate>Thu, 30 Jul 2026 15:31:58 -0500</pubDate>
      <description><![CDATA[Added an editor test that checks every planting bed for its root collider, its overlap wiring and its detail threshold. It was run against a deliberately broken copy first to confirm it catches all three of the shipped faults.]]></description>
    </item>
    <item>
      <title>Marketplace: Timed marketplace settlement could stall. Auctions ending, purchase orders expiring, tip…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-872b2ef4affd</guid>
      <pubDate>Thu, 30 Jul 2026 16:17:03 -0500</pubDate>
      <description><![CDATA[Timed marketplace settlement could stall. Auctions ending, purchase orders expiring, tip jar payouts and lot sale orders are all settled by one routine that runs every minute, and they shared a single error guard, so one failure aborted the run and every later step was skipped until the next restart. Each step now runs on its own.]]></description>
    </item>
    <item>
      <title>Telemetry: Server log stack traces were being thrown away in transit. The log reader kept only the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-ff397eecf249</guid>
      <pubDate>Thu, 30 Jul 2026 16:17:05 -0500</pubDate>
      <description><![CDATA[Server log stack traces were being thrown away in transit. The log reader kept only the first line of each message, so an error arrived with its type and text but no location, which is why the most frequent error of the day could not be traced to a line. Full traces now survive the trip.]]></description>
    </item>
    <item>
      <title>Telemetry: Log records now carry the build they came from automatically. The number was documented…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-501e4f5633f7</guid>
      <pubDate>Thu, 30 Jul 2026 16:17:15 -0500</pubDate>
      <description><![CDATA[Log records now carry the build they came from automatically. The number was documented as a manual step, so it had never been set, and every record read as generation zero. That made a genuine regression indistinguishable from a fix that simply was not published yet. The step that flips the build channel now writes it down.]]></description>
    </item>
    <item>
      <title>Patching: The macOS chaos channel pointer is recorded in the repo alongside the Windows one, so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-a2dbdf7a20f4</guid>
      <pubDate>Thu, 30 Jul 2026 16:17:24 -0500</pubDate>
      <description><![CDATA[The macOS chaos channel pointer is recorded in the repo alongside the Windows one, so the build each platform serves is written down in the same place.]]></description>
    </item>
    <item>
      <title>Mac launcher: The Mac launcher could not install the game. On first run it copied itself into a folder…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-acb881e946de</guid>
      <pubDate>Thu, 30 Jul 2026 17:22:49 -0500</pubDate>
      <description><![CDATA[The Mac launcher could not install the game. On first run it copied itself into a folder and stopped, and reopening it showed the same install screen again. Fixed, and launcher build 25 is on the tester page.]]></description>
    </item>
    <item>
      <title>Mac launcher: Two separate faults, either one fatal. The installer copied the program file out of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1976221c7274</guid>
      <pubDate>Thu, 30 Jul 2026 17:22:55 -0500</pubDate>
      <description><![CDATA[Two separate faults, either one fatal. The installer copied the program file out of the Mac app package, which produces something macOS will not launch. And it wrote its settings to the folder the player picked while the launcher reads them from a different one, so the install never registered and the first-run screen came back every time.]]></description>
    </item>
    <item>
      <title>Mac launcher: On a Mac the app you download is already the launcher, so first run now copies nothing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-1e354349d85d</guid>
      <pubDate>Thu, 30 Jul 2026 17:22:55 -0500</pubDate>
      <description><![CDATA[On a Mac the app you download is already the launcher, so first run now copies nothing and restarts nothing. It asks where the game should go, then opens the launcher window in the same window and starts patching.]]></description>
    </item>
    <item>
      <title>Mac launcher: Ran it end to end on a Mac from a clean machine, which is the step the previous release…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-b13a7b0e823c</guid>
      <pubDate>Thu, 30 Jul 2026 17:23:03 -0500</pubDate>
      <description><![CDATA[Ran it end to end on a Mac from a clean machine, which is the step the previous release skipped. First run to a finished install: 707 files, 16.9 GB, the game launching from the folder the player chose and nothing written inside the app package.]]></description>
    </item>
    <item>
      <title>Mac launcher: The self-update had the same fault in two more places, including one that handed the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6b9a6897f32a</guid>
      <pubDate>Thu, 30 Jul 2026 17:23:03 -0500</pubDate>
      <description><![CDATA[The self-update had the same fault in two more places, including one that handed the system a folder where it needed a file. Both now go through one shared routine. That path had never been run on a Mac either.]]></description>
    </item>
    <item>
      <title>Mac launcher: The launcher test suite is green on a Mac for the first time: 344 of 344. Six failures…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-6df2ad279c13</guid>
      <pubDate>Thu, 30 Jul 2026 17:23:03 -0500</pubDate>
      <description><![CDATA[The launcher test suite is green on a Mac for the first time: 344 of 344. Six failures were older and Mac-only, five of them asserting a settings folder that moved months ago and stayed invisible on Windows because there the two folders are the same one.]]></description>
    </item>
    <item>
      <title>Mac launcher: The release script would have published the wrong thing for Mac: the bare program file…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-5eb7a50ac658</guid>
      <pubDate>Thu, 30 Jul 2026 17:23:15 -0500</pubDate>
      <description><![CDATA[The release script would have published the wrong thing for Mac: the bare program file rather than the signed app package, replacing a working pointer with one aimed at a build Apple Silicon refuses to run. It now takes the package the Mac build step produces.]]></description>
    </item>
    <item>
      <title>Mac launcher: Closed a related hole in the release script. Building the Mac launcher on a machine that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-9ec4f33bef98</guid>
      <pubDate>Thu, 30 Jul 2026 17:29:37 -0500</pubDate>
      <description><![CDATA[Closed a related hole in the release script. Building the Mac launcher on a machine that cannot sign it produced a package that looked shippable, and the publish step only checked the file was there. An unsigned build now leaves nothing to publish.]]></description>
    </item>
    <item>
      <title>User Interface: Windows that were open when you logged out no longer follow you onto the login screen…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-975c8b0902c7</guid>
      <pubDate>Thu, 30 Jul 2026 18:09:34 -0500</pubDate>
      <description><![CDATA[Windows that were open when you logged out no longer follow you onto the login screen. The tester tools window, GM tools, the social window, a tip jar, a game table, and the theme editor all stayed up there, drawn over the login form and still clickable. Every one of them closes on the way back now.]]></description>
    </item>
    <item>
      <title>User Interface: Only one teardown existed for windows that survive a scene load, and it could only see…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-3d7fc9080347</guid>
      <pubDate>Thu, 30 Jul 2026 18:09:41 -0500</pubDate>
      <description><![CDATA[Only one teardown existed for windows that survive a scene load, and it could only see one family of them. It is now a shared registry any long-lived window joins, plus a test that fails the build when a new one forgets to.]]></description>
    </item>
    <item>
      <title>User Interface: Equipment slots on the character sheet shrink with the window now. They used to draw at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-798945ff7c6e</guid>
      <pubDate>Thu, 30 Jul 2026 18:41:06 -0500</pubDate>
      <description><![CDATA[Equipment slots on the character sheet shrink with the window now. They used to draw at one fixed size whatever you did to the sheet, so making it smaller pushed the bottom slots out of the row entirely. At the default size and larger nothing changed.]]></description>
    </item>
    <item>
      <title>User Interface: The floating name above a creature answers the mouse again. Clicking a name targets…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-2d0bf171c2f6</guid>
      <pubDate>Thu, 30 Jul 2026 19:52:08 -0500</pubDate>
      <description><![CDATA[The floating name above a creature answers the mouse again. Clicking a name targets whoever it belongs to and right-clicking one opens their menu, which is where the option to send your pet or summon after them lives. Names went back to the old text renderer a few builds ago so they would stop drawing through walls, and that quietly took them out of the click handler along with it.]]></description>
    </item>
    <item>
      <title>User Interface: A name still cannot be clicked in the way that matters: the plate stays invisible to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-bd5ae50b649d</guid>
      <pubDate>Thu, 30 Jul 2026 19:52:14 -0500</pubDate>
      <description><![CDATA[A name still cannot be clicked in the way that matters: the plate stays invisible to the pointer, so a click passes through it to whatever it is naming, and a name faded out by distance or hidden with the rest of the interface takes no clicks at all. The hit test measures the text itself rather than the box it sits in, so overlapping names resolve to the one the cursor is actually inside.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed a gap in the client build's bundle caching. The cache decided whether packed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-d4581fcf93c2</guid>
      <pubDate>Thu, 30 Jul 2026 18:53:35 -0500</pubDate>
      <description><![CDATA[Fixed a gap in the client build's bundle caching. The cache decided whether packed interface files needed rebuilding by watching three source folders, but the packed files also pull in 7,459 referenced files from 31 other folders, and a change to one of those reused the previous build's copy with nothing in the log. Build 79 shipped the tester window's new fog buttons in code but not in the visible panel this way. The cache now tracks every file the packed assets reference, a stale panel logs a warning naming what is missing, and the fog buttons arrive with the next build.]]></description>
    </item>
    <item>
      <title>Build pipeline: Closed the older half of the same caching gap. The check that decides whether packed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-67a5d8904b92</guid>
      <pubDate>Thu, 30 Jul 2026 19:35:53 -0500</pubDate>
      <description><![CDATA[Closed the older half of the same caching gap. The check that decides whether packed world files need rebuilding watched only the scene files themselves, and scenes pull nearly all of their art in by reference, so an art-only change could reuse stale packed copies. This bit once in early July and had been on the books since. Both checks now follow every reference, and a failed check refuses to reuse anything rather than guessing.]]></description>
    </item>
    <item>
      <title>Build pipeline: Measured the new rebuild checks: the world-file check needs a little over half a minute…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-30-313276141037</guid>
      <pubDate>Thu, 30 Jul 2026 19:47:30 -0500</pubDate>
      <description><![CDATA[Measured the new rebuild checks: the world-file check needs a little over half a minute once warmed up, but more than three minutes the first time a fresh build machine runs it, so the overnight build pays the higher price. The numbers now print in every build log, and a cheaper fallback design is written down if that cost proves too much in practice.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-29</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-headlines</guid>
      <pubDate>Wed, 29 Jul 2026 21:32:48 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Shareable blueprints</b> complete: craft a blank Decoration Blueprint, record your lot's layout under a title, and trade it. The holder applies the arrangement with their own items.</li>
        <li>The skill tree looks like the skill tree again. Crest frames on every tile, the level back in its badge tab, a green experience bar, and the circular school sigil rings in place of a row of text buttons.</li>
        <li>Drag a column heading to resize it, in the backpack, the journal, your deeds, the friends list, merchants, mail and the rest. The game remembers your widths per window.</li>
        <li>The map window controls work again: centered zoom, wheel zoom on the cursor, click-drag panning, and a Follow box that really turns following on and off.</li>
        <li>Player-to-player <b>lot sales</b> are built: sell a claimed lot from its own lot sign with the house and every decoration intact (wishlist #2758). Listing freezes the lot and hands roommates their things back; buying is one typed confirmation; crashed sales refund by mail.</li>
        <li><b>SQUIRREL!</b> is live: a new page off the work log where the wild ideas get written down, voted on, and argued about. The first residents include something that lives on dragon droppings.</li>
        <li><b>Creature Balance</b> went from nothing to live in a day: every creature in the game scraped through the real combat math, curve-fitted, and browsable on the dev portal and tester hub, ready to drive the balance pass.</li>
        <li>Precision on the <strong>harvesting meter</strong> pays: the centre of the target zone doubles a bonus pull, three times per node, and no longer shrinks past the point of being hittable.</li>
        <li>Decorating got its screen back. A long recent-changes list had been growing the deco bar into an invisible rectangle that took most of your clicks, so the avatar would not walk and decorations would not drag. The list now floats on its own panel, the bar takes only the clicks that land on its buttons, and Ctrl+Z stopped reaching your decorations while you type in chat.</li>
        <li>The <strong>Property Manager</strong> rebuilt to the shape it shipped in: house pictures back on every storage row, sortable columns with widths you can drag, and parchment deed cards listing the house, basement and dungeon on each lot.</li>
        <li>The chat box takes the keyboard only when you ask for it now: using a glyph while running no longer stops you and types a row of w into the chat line, and a window coming forward keeps your caret where it was.</li>
        <li>Fixed chat announcing the same friend online up to 8 times for one login, and the hunt uncovered a deeper server presence sync gap, filed as its own bug.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed 10 wishlist ideas and 2 bug reports from the last two days of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d6f936e72fb9</guid>
      <pubDate>Wed, 29 Jul 2026 03:22:49 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed 10 wishlist ideas and 2 bug reports from the last two days of forum activity — house/lot deed transfers, harvestable tree variety, guild culling rules, a Deco Palette locate button, damage-type masterworks, a full-repair item, new creature types, a new soloable dungeon, new artifacts, a coastal siege map, a housing geometry/sprite bug, and a house-window exploit letting players reach through walls into houses.]]></description>
    </item>
    <item>
      <title>Community: Opened SQUIRREL! , a page off the work log for the ideas that run across the road…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-96f6ac32b576</guid>
      <pubDate>Wed, 29 Jul 2026 09:56:51 -0500</pubDate>
      <description><![CDATA[Opened <b>SQUIRREL!</b>, a page off the work log for the ideas that run across the road mid-task. Each idea takes anonymous up and down votes and carries its own discussion thread on the same comment service as the proposal pages, and the work log header links to it.]]></description>
    </item>
    <item>
      <title>Community: Added a card to the SQUIRREL! page about the wrasse screenshots in the work log: that art…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d202cc5ddcd0</guid>
      <pubDate>Wed, 29 Jul 2026 13:34:50 -0500</pubDate>
      <description><![CDATA[Added a card to the <b>SQUIRREL!</b> page about the wrasse screenshots in the work log: that art is the untouched ten-year-old original, and the creatures get a quality pass before any of them go out.]]></description>
    </item>
    <item>
      <title>Housing: The Decorations window can find things now. Pick a decoration from the list and press…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3cebba3c3c7a</guid>
      <pubDate>Wed, 29 Jul 2026 06:33:42 -0500</pubDate>
      <description><![CDATA[The Decorations window can find things now. Pick a decoration from the list and press <b>Find</b>, and it is marked on your compass strip and on the map, stays pinned to the edge of the strip while it is behind you, and clears itself when you walk up to it. The decoration glows gold once you are near enough to see it. Double-clicking a row and the Find entry on the right-click menu do the same.]]></description>
    </item>
    <item>
      <title>Housing: The Location column stopped printing coordinates. It reads in words instead, along the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-cdfe7544f9bd</guid>
      <pubDate>Wed, 29 Jul 2026 06:33:43 -0500</pubDate>
      <description><![CDATA[The Location column stopped printing coordinates. It reads in words instead, along the lines of 'Interior, on a wall, front left', with front and back as you see them standing at the front of your lot. A decoration you have hidden reads Hidden and can still be marked, which is the one the old coordinates helped with least.]]></description>
    </item>
    <item>
      <title>Housing: The Decorations window also gained a Category filter and a Recent row. The filter offers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-c332d2bcc336</guid>
      <pubDate>Wed, 29 Jul 2026 06:33:44 -0500</pubDate>
      <description><![CDATA[The Decorations window also gained a <b>Category</b> filter and a <b>Recent</b> row. The filter offers only the kinds of decoration your lot actually has, so a house with lights and furniture gets three entries rather than ten. The Recent row lists what you last placed or moved, and clicking a name selects that decoration and finds it in one step.]]></description>
    </item>
    <item>
      <title>Housing: Where a decoration sits is still shown only to somebody allowed to move it. Find follows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-6bd3a23dee1e</guid>
      <pubDate>Wed, 29 Jul 2026 06:33:45 -0500</pubDate>
      <description><![CDATA[Where a decoration sits is still shown only to somebody allowed to move it. Find follows the same rule: on a lot where you cannot move the decorations, the button, the menu entry and the Location column are all absent rather than greyed out.]]></description>
    </item>
    <item>
      <title>Housing: Started on player-to-player lot sales , a long-standing wishlist ask (#2758): the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-64d9c4d64dfd</guid>
      <pubDate>Wed, 29 Jul 2026 08:08:27 -0500</pubDate>
      <description><![CDATA[Started on player-to-player <b>lot sales</b>, a long-standing wishlist ask (#2758): the groundwork landed for listing a claimed lot for sale on its own lot sign and buying it with the house and every decoration intact. The sale records, the fee and price rules, and the recovery bookkeeping that lets a purchase survive a crash mid-transfer are in. No player-visible change yet; the listing and purchase flow come next.]]></description>
    </item>
    <item>
      <title>Housing: Lot sales moved from groundwork to a working listing: an owner can now put a claimed lot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-06c68252f87d</guid>
      <pubDate>Wed, 29 Jul 2026 08:35:49 -0500</pubDate>
      <description><![CDATA[Lot sales moved from groundwork to a working listing: an owner can now put a claimed lot up for sale on its own lot sign (server side). Listing hands back anything other players had placed there, freezes the lot so nothing can be added or removed while it is on the market, and discloses up front which untradeable items will stay with the seller. Unclaiming, foreclosure, and moving the deed all know about listings now, and the sign shows its for-sale face to everyone in the scene. The buy flow is next.]]></description>
    </item>
    <item>
      <title>Housing: The money side of lot sales landed: a buyer at the sign can now be checked against every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-51b9a7d1856a</guid>
      <pubDate>Wed, 29 Jul 2026 08:44:47 -0500</pubDate>
      <description><![CDATA[The money side of lot sales landed: a buyer at the sign can now be checked against every eligibility rule (town reservations included), hold a short exclusive lease on the listing, and pay. Gold moves before anything else does, into a durable order record a background job settles by mail: the seller gets the price minus the sale fee once the transfer completes, and a purchase that cannot finish refunds the buyer automatically. The transfer itself is the last server piece left.]]></description>
    </item>
    <item>
      <title>Housing: The transfer itself landed: a paid lot sale now changes hands with the claim, both deeds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-7c40c85f3d33</guid>
      <pubDate>Wed, 29 Jul 2026 08:51:19 -0500</pubDate>
      <description><![CDATA[The transfer itself landed: a paid lot sale now changes hands with the claim, both deeds, the house, and every decoration and chest exactly where the seller left them. Untradeable items go back to the seller instead of crossing accounts, the seller keeps unused prepaid tax as credit, the buyer starts a fresh tax clock, and access lists reset. The handover survives crashes at any point: it resumes from a journal on the next sweep, and a sale that cannot finish refunds the buyer by mail instead of leaving gold in limbo.]]></description>
    </item>
    <item>
      <title>Housing: The lot sign itself learned to sell: owners set a price (and can reserve the sale for one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-21ff28f3f6e9</guid>
      <pubDate>Wed, 29 Jul 2026 09:11:06 -0500</pubDate>
      <description><![CDATA[The lot sign itself learned to sell: owners set a price (and can reserve the sale for one named player) with a confirmation that spells out the fee, the freeze, and the return of items other players had placed; buyers see the price on the sign and confirm by typing BUY LOT. The whole feature is in, five commits from database records to the sign window, with the fee preview pinned to the server's settlement math by a test. Not on chaos yet; a verification task is filed for the testers.]]></description>
    </item>
    <item>
      <title>Housing: Lot sales went under the microscope before anything ships: a new test harness drives the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-600b54e04157</guid>
      <pubDate>Wed, 29 Jul 2026 10:51:40 -0500</pubDate>
      <description><![CDATA[Lot sales went under the microscope before anything ships: a new test harness drives the real transfer code against its own database and simulates a crash at every single write, then checks that every item still exists exactly once, in the right hands. The harness caught two bugs that reasoning alone had missed (a resumed sale that could wedge forever, and a settlement rule that could pay a seller twice off a duplicated payment record), and the review pass around it closed three more crash windows, including one that could destroy the deed items themselves. All five are fixed and the whole suite passes for every crash point.]]></description>
    </item>
    <item>
      <title>Build pipeline: The two images that draw the night sky were importing uncompressed, which put them in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-cc0fdd0105ad</guid>
      <pubDate>Wed, 29 Jul 2026 06:49:22 -0500</pubDate>
      <description><![CDATA[The two images that draw the night sky were importing uncompressed, which put them in the player build at 24 MB each. Both now use block compression at their full 4096x2048 resolution, taking the pair from 48 MB down to 8 MB.]]></description>
    </item>
    <item>
      <title>Build pipeline: Checked the compression against the uncompressed originals before keeping it: 51.5 dB and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3deddb1436bb</guid>
      <pubDate>Wed, 29 Jul 2026 06:49:23 -0500</pubDate>
      <description><![CDATA[Checked the compression against the uncompressed originals before keeping it: 51.5 dB and 51.9 dB of signal to noise, with 0.06% and 0.02% of colour channels off by more than 8 of 255. Compared the densest star fields side by side at full magnification and rendered the result through the sky shader the game actually uses. Every star is still there at the same brightness.]]></description>
    </item>
    <item>
      <title>Build pipeline: Audited the third-party demo content that ships purely because it sits in a folder Unity…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-0a6cf847e787</guid>
      <pubDate>Wed, 29 Jul 2026 06:49:24 -0500</pubDate>
      <description><![CDATA[Audited the third-party demo content that ships purely because it sits in a folder Unity force-includes. Half of it turned out to be load-bearing: three of six lighting noise textures are referenced by the weather data, one of them is loaded by name so it cannot even be renamed, and a vendor folder that looked like dead demo art holds two materials used by a real weapon and dozens of buildings. The genuinely unused parts come to about 12 MB.]]></description>
    </item>
    <item>
      <title>Build pipeline: The check that catches that exact mistake now runs when code is committed, not an hour…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-8e6f2f71510f</guid>
      <pubDate>Wed, 29 Jul 2026 08:03:12 -0500</pubDate>
      <description><![CDATA[The check that catches that exact mistake now runs when code is committed, not an hour later on the build server. It also reads the committed files instead of whatever happens to be open on the machine, so one person half-finished with a change can no longer block someone else from committing.]]></description>
    </item>
    <item>
      <title>Decorating: Groundwork for lot layout blueprints landed: a lot's decoration arrangement can now be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-5c007bdb960c</guid>
      <pubDate>Wed, 29 Jul 2026 05:31:27 -0500</pubDate>
      <description><![CDATA[Groundwork for lot layout blueprints landed: a lot's decoration arrangement can now be captured to a named local file, with a compact share-code format behind it. Capture records where everything sits and what it is, and deliberately leaves out permissions, ownership stamps, and container contents. Not player-visible yet; the save and apply tools come next.]]></description>
    </item>
    <item>
      <title>Decorating: The blueprint matcher and preview landed. A saved layout is reconciled against what is on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-93e11b63fb08</guid>
      <pubDate>Wed, 29 Jul 2026 05:49:46 -0500</pubDate>
      <description><![CDATA[The blueprint matcher and preview landed. A saved layout is reconciled against what is on the lot and in your bags (exact item first, then the same kind of item, pattern and dye preferred), and a dry run reports what would move, what would be placed from inventory, what would return to your backpack, and what cannot be applied and why, using the same denial reasons and count limits live placement uses. Overlap and surface fit stay a live-placement concern and the preview says so.]]></description>
    </item>
    <item>
      <title>Decorating: Undo now understands a whole blueprint apply as one step. Applying a layout will record…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-4516a18046ed</guid>
      <pubDate>Wed, 29 Jul 2026 05:59:34 -0500</pubDate>
      <description><![CDATA[Undo now understands a whole blueprint apply as one step. Applying a layout will record every move, placement, and removal into a single history entry, so one press of Ctrl+Z walks the entire apply back: items return to their original spots, placed items go back to your bags, and removed items return to the lot, in the right order for stacked decorations. If any placed item came from a stack the undo is one way, and the history says so, matching how single placements already behave.]]></description>
    </item>
    <item>
      <title>Decorating: The blueprint apply engine landed. Applying a layout moves items in batches, returns…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-349b24eec5a5</guid>
      <pubDate>Wed, 29 Jul 2026 06:05:04 -0500</pubDate>
      <description><![CDATA[The blueprint apply engine landed. Applying a layout moves items in batches, returns displaced items to your backpack, places matching items from your bags in the right stacking order, and reports what it did and what it skipped. A refused batch retries its items one at a time so a single stuck item cannot stop the rest, and nothing already applied is ever silently rolled back.]]></description>
    </item>
    <item>
      <title>Decorating: Blueprints shipped. The housing strip has a new Blueprints button: save your lot's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-2f1fa4ffaa3e</guid>
      <pubDate>Wed, 29 Jul 2026 06:16:50 -0500</pubDate>
      <description><![CDATA[Blueprints shipped. The housing strip has a new Blueprints button: save your lot's arrangement under a name, preview what applying it would change, and apply it in one pass that also lands as a single undo step. The preview uses the same denial reasons and count limits as live placement and says plainly what it does not check. Blueprints are files in your game data folder, so two names make a seasonal swap and a file can be shared outside the game.]]></description>
    </item>
    <item>
      <title>Decorating: Groundwork for shareable blueprints: a blueprint item can now carry a recorded layout…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-9136738b9a11</guid>
      <pubDate>Wed, 29 Jul 2026 06:24:34 -0500</pubDate>
      <description><![CDATA[Groundwork for shareable blueprints: a blueprint item can now carry a recorded layout, its title, its author, and its item count as ordinary item data, so trading, mailing, and vendor listing a written blueprint just works. Not craftable or usable yet; the recording tools come next.]]></description>
    </item>
    <item>
      <title>Decorating: The recording wire for shareable blueprints is in: a blank blueprint item can be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-a2d21170fbf9</guid>
      <pubDate>Wed, 29 Jul 2026 06:37:16 -0500</pubDate>
      <description><![CDATA[The recording wire for shareable blueprints is in: a blank blueprint item can be inscribed with a captured layout over the same kind of chunked, size-capped upload player-written books use, with the author stamped by the server. A written blueprint cannot be rewritten; recording again takes a fresh blank.]]></description>
    </item>
    <item>
      <title>Decorating: The Decoration Blueprint item works end to end: use a blank one on your lot to record the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-282ea2870c67</guid>
      <pubDate>Wed, 29 Jul 2026 06:44:12 -0500</pubDate>
      <description><![CDATA[The Decoration Blueprint item works end to end: use a blank one on your lot to record the layout under a title, hand the written blueprint to anyone, and they can preview and apply the arrangement to a lot they may decorate using their own items. The written title shows as the item name the way player-written book titles do.]]></description>
    </item>
    <item>
      <title>Decorating: The Decoration Blueprint recipe is in: Tailoring skill 30, 12 Wood Pulp and 4 Cotton…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-9acd3b63cdf6</guid>
      <pubDate>Wed, 29 Jul 2026 06:53:27 -0500</pubDate>
      <description><![CDATA[The Decoration Blueprint recipe is in: Tailoring skill 30, 12 Wood Pulp and 4 Cotton, with the recipe sheet sold beside the blank book recipe. That completes shareable blueprints: craft a blank, record your lot under a title, and hand the written blueprint to anyone. It arranges decorations they already own and never contains yours.]]></description>
    </item>
    <item>
      <title>Decorating: Saving a decoration blueprint would have failed for everyone. The request left the client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-018c52e3af0d</guid>
      <pubDate>Wed, 29 Jul 2026 08:03:12 -0500</pubDate>
      <description><![CDATA[Saving a decoration blueprint would have failed for everyone. The request left the client and arrived at the server, but nobody had connected it to the code that handles it, so every save came back as an unknown command. Wired it up before the blueprint feature reached a build.]]></description>
    </item>
    <item>
      <title>Decorating: The Blueprints preview now counts stacked decorations whose base item is missing. A saved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-4e2ec1123a63</guid>
      <pubDate>Wed, 29 Jul 2026 12:43:19 -0500</pubDate>
      <description><![CDATA[The Blueprints preview now counts stacked decorations whose base item is missing. A saved table with eight plates on it, applied without the table, warned about one missing item and said nothing about the eight plates that had nowhere to go.]]></description>
    </item>
    <item>
      <title>Decorating: Rows in the blueprint preview's left-out list now read as sentences such as "sits on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-72f12d6ed1e2</guid>
      <pubDate>Wed, 29 Jul 2026 12:43:25 -0500</pubDate>
      <description><![CDATA[Rows in the blueprint preview's left-out list now read as sentences such as "sits on something you do not have". They had been printing the internal reason name, so players saw "(ParentMissing)" whatever language they played in.]]></description>
    </item>
    <item>
      <title>Decorating: The deco bar's recent-changes list no longer swallows the screen. A long list used to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-1987752471ab</guid>
      <pubDate>Wed, 29 Jul 2026 19:05:28 -0500</pubDate>
      <description><![CDATA[The deco bar's recent-changes list no longer swallows the screen. A long list used to grow the bar upward behind an edge you could not see, and clicks aimed at the world landed in that empty space instead: the avatar barely moved, decorations would not drag, and the bar flickered as you clicked. The list is now a small panel floating above the bar with a background of its own, it scrolls once it fills, and the bar stays one row tall.]]></description>
    </item>
    <item>
      <title>Decorating: Rows in that list read what happened. "Moved Oak Table" and "Picked up Oak Table" replace…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-1d2a96b1e354</guid>
      <pubDate>Wed, 29 Jul 2026 19:05:29 -0500</pubDate>
      <description><![CDATA[Rows in that list read what happened. "Moved Oak Table" and "Picked up Oak Table" replace a symbol that was not in the font and drew as the wrong character, and item names that carry formatting now show it rather than the tags around it.]]></description>
    </item>
    <item>
      <title>Decorating: Leaving a lot says the undo history is gone. Walking off the lot, or travelling out of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-4aae8c612ec9</guid>
      <pubDate>Wed, 29 Jul 2026 19:05:30 -0500</pubDate>
      <description><![CDATA[Leaving a lot says the undo history is gone. Walking off the lot, or travelling out of the area, clears the fifty-change history and now puts a line on screen telling you so. The one for leaving the area waits for the new scene to finish loading, since nothing can be read over a loading screen.]]></description>
    </item>
    <item>
      <title>Images: The night sky after the change, rendered through the sky shader the game uses. This is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3bab681d4ba7</guid>
      <pubDate>Wed, 29 Jul 2026 06:49:42 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/night-sky-starfield-compressed.png" data-full="https://catnipgames.net/blog/images/night-sky-starfield-compressed.png" alt="The night sky rendered through the game sky shader after compression, showing scattered white stars and the faint milky band of stars fading across the lower half of the frame"></div>The night sky after the change, rendered through the sky shader the game uses. This is the 4 MB version of a texture that used to take 24 MB.]]></description>
    </item>
    <item>
      <title>Images: The SQUIRREL! page on launch day: the intro, the first three squirrels, and the vote…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d70e5dcda953</guid>
      <pubDate>Wed, 29 Jul 2026 09:56:52 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/squirrel-page-launch.png" data-full="https://catnipgames.net/blog/images/squirrel-page-launch.png" alt="The SQUIRREL! page: an intro card explaining the page, then idea cards titled Bring back the Cave Wrasse, A page for the squirrels, and A chest that builds your dungeon, each with up and down vote arrows and a Discussion link"></div>The SQUIRREL! page on launch day: the intro, the first three squirrels, and the vote arrows waiting for opinions.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-2e1f85b71d27</guid>
      <pubDate>Wed, 29 Jul 2026 12:31:09 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/cave-wrasse-revived.png" alt="The revived Cave Wrasse: a six-legged teal lizard with dorsal spikes and a fanged red maw"><img src="https://catnipgames.net/blog/images/cave-wrasse-tier-ladder.png" alt="All five wrasse tiers side by side, from the teal Cave Wrasse to the molten Broodmother"><img src="https://catnipgames.net/blog/images/cave-wrasse-broodmother.png" alt="The Wrasse Broodmother, the largest and most heavily glowing of the family"></div>]]></description>
    </item>
    <item>
      <title>Images: The Fire school tree after the connector fix, with the lines joining each skill to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-574ae5e5e003</guid>
      <pubDate>Wed, 29 Jul 2026 12:52:40 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/skill-tree-connector-lines.png" data-full="https://catnipgames.net/blog/images/skill-tree-connector-lines.png" alt="The Fire school skill tree with thin connecting lines running between the crest tiles, bending through corners and three-way forks"></div>The Fire school tree after the connector fix, with the lines joining each skill to the ones below it.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d04fc1429790</guid>
      <pubDate>Wed, 29 Jul 2026 13:38:48 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/creature-balance-roster.png" data-full="https://catnipgames.net/blog/images/creature-balance-roster.png" alt="Creature Balance roster: 1,546 creatures with sortable stats and outlier scores"><img src="https://catnipgames.net/blog/images/creature-balance-charts.png" data-full="https://catnipgames.net/blog/images/creature-balance-charts.png" alt="Creature Balance charts: HP, DPS, XP and gold against level with fitted curves">]]></description>
    </item>
    <item>
      <title>Images · 2026-07-29</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-images</guid>
      <pubDate>Wed, 29 Jul 2026 00:01:30 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/night-sky-starfield-compressed.png" data-full="https://catnipgames.net/blog/images/night-sky-starfield-compressed.png" alt="The night sky rendered through the game sky shader after compression, showing scattered white stars and the faint milky band of stars fading across the lower half of the frame"></div>]]></description>
    </item>
    <item>
      <title>UI: Fixed the login window drawing far wider than the original. The converted panel set no…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-1212ed10ddde</guid>
      <pubDate>Wed, 29 Jul 2026 07:06:13 -0500</pubDate>
      <description><![CDATA[Fixed the login window drawing far wider than the original. The converted panel set no width at all, so it sized itself to the welcome message below the form on a single unwrapped line and stretched across most of the screen. It is back to 456px, the width the pre-conversion panel was authored at, and the welcome text wraps to three lines inside it.]]></description>
    </item>
    <item>
      <title>UI: Capped the connecting and login queue message at that same width. It draws on top of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-53ae85ab1013</guid>
      <pubDate>Wed, 29 Jul 2026 07:06:20 -0500</pubDate>
      <description><![CDATA[Capped the connecting and login queue message at that same width. It draws on top of the login window, so a long queue string used to leave it overhanging the panel behind it.]]></description>
    </item>
    <item>
      <title>UI: Skill tree tiles draw their crest frame art again, with the level number back in the tab…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-b255909e0d66</guid>
      <pubDate>Wed, 29 Jul 2026 07:39:37 -0500</pubDate>
      <description><![CDATA[Skill tree tiles draw their crest frame art again, with the level number back in the tab moulded into the top of the frame, a green experience bar along the bottom, and the grandmaster badge as an icon instead of the letters GM. The training marker at the top left is back to its old small, dim form rather than the large triangle it had become.]]></description>
    </item>
    <item>
      <title>UI: Those tiles were 68 pixels wide sitting on a 64 pixel column pitch, so a row of them…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-8b26a1f93b65</guid>
      <pubDate>Wed, 29 Jul 2026 07:39:47 -0500</pubDate>
      <description><![CDATA[Those tiles were 68 pixels wide sitting on a 64 pixel column pitch, so a row of them overlapped and read as one continuous gold bar. They are back to the 78 pixel box the art was drawn for, with the frame inset by the padding it was packed with, which puts an 8 pixel gap between neighbours. Clicks and tooltips also went back to the old 52 pixel hit area, so hovering the gap between two tiles no longer pops a tooltip.]]></description>
    </item>
    <item>
      <title>UI: Picking a school is back to the three circular rings of sigils per tab, in place of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-0aa7e6e6e7b9</guid>
      <pubDate>Wed, 29 Jul 2026 07:39:54 -0500</pubDate>
      <description><![CDATA[Picking a school is back to the three circular rings of sigils per tab, in place of the wrapped row of text buttons the conversion left behind. The rings are rebuilt from the arrangement component that baked the original layout, so all 35 sigil positions land where they always sat.]]></description>
    </item>
    <item>
      <title>UI: With the rings come the things only the rings ever had: the school sigil art, your total…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-9e8ae87d7029</guid>
      <pubDate>Wed, 29 Jul 2026 07:40:03 -0500</pubDate>
      <description><![CDATA[With the rings come the things only the rings ever had: the school sigil art, your total skill levels printed under each one, the school name fading in on hover, the faded state and note for schools a trainer will not teach, and the right-click Train All and Unlearn All menu for a whole school. The plate that marks which skills a trainer can actually teach you was never carried over either, and is back.]]></description>
    </item>
    <item>
      <title>UI: Column headings in the game's list windows can now be dragged to resize, and the sizes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-38bdb21be373</guid>
      <pubDate>Wed, 29 Jul 2026 08:27:05 -0500</pubDate>
      <description><![CDATA[Column headings in the game's list windows can now be dragged to resize, and the sizes you set are remembered per window across a relog. Hover between two headings for the resize cursor; double-click a divider to put those two columns back to their starting widths.]]></description>
    </item>
    <item>
      <title>UI: The Journal's entry list changed width depending on which entry you had selected, because…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-c9d944f83794</guid>
      <pubDate>Wed, 29 Jul 2026 08:27:15 -0500</pubDate>
      <description><![CDATA[The Journal's entry list changed width depending on which entry you had selected, because a long description pushed the list narrower and cut off the titles. Both panes are now pinned to a fixed share of the window.]]></description>
    </item>
    <item>
      <title>UI: The decoration palette's Item Name and Location columns had the same problem as the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-b011155b5b5f</guid>
      <pubDate>Wed, 29 Jul 2026 08:27:16 -0500</pubDate>
      <description><![CDATA[The decoration palette's Item Name and Location columns had the same problem as the Journal: the split between them moved with whatever was in the list. Both are pinned to a ratio now, and that ratio is yours to set.]]></description>
    </item>
    <item>
      <title>UI: Roster list headings had been drifting a few pixels off their own columns whenever a list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3b717d985493</guid>
      <pubDate>Wed, 29 Jul 2026 08:27:16 -0500</pubDate>
      <description><![CDATA[Roster list headings had been drifting a few pixels off their own columns whenever a list was long enough to show a scrollbar. The heading bar now tracks the scrollbar the way the inventory table already did.]]></description>
    </item>
    <item>
      <title>UI: Fixed the map window controls from a tester report. Zoom from the buttons now works on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3118c95f1a73</guid>
      <pubDate>Wed, 29 Jul 2026 08:31:35 -0500</pubDate>
      <description><![CDATA[Fixed the map window controls from a tester report. Zoom from the buttons now works on the middle of the window, the mouse wheel zooms on the spot under the cursor, and the map can be dragged with the left mouse button. Dragging switches the Follow box off and checking it again snaps the map back to the player.]]></description>
    </item>
    <item>
      <title>UI: With Follow on, the map position marker now stays centered at every zoom level while…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3b721c9952d1</guid>
      <pubDate>Wed, 29 Jul 2026 08:31:35 -0500</pubDate>
      <description><![CDATA[With Follow on, the map position marker now stays centered at every zoom level while moving. Scenes that ship a preset map zoom treat it as the starting zoom, so the zoom buttons work there too.]]></description>
    </item>
    <item>
      <title>UI: The jukebox track list joined the same pass: Song, Composer and Album now hold a fixed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-fc450747c2f8</guid>
      <pubDate>Wed, 29 Jul 2026 08:37:04 -0500</pubDate>
      <description><![CDATA[The jukebox track list joined the same pass: Song, Composer and Album now hold a fixed share of the window and can be dragged to whatever split you want.]]></description>
    </item>
    <item>
      <title>UI: Fixed the utility hotbar jumping into the combat bar's place when leaving combat (#2804)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-0772f209e2ba</guid>
      <pubDate>Wed, 29 Jul 2026 12:10:38 -0500</pubDate>
      <description><![CDATA[Fixed the utility hotbar jumping into the combat bar's place when leaving combat (#2804). The bar now remembers its position by its centre and bottom edge, so the utility row stays where you put it and the combat bar appears and disappears centered above it. Saved bar positions reset once with this change.]]></description>
    </item>
    <item>
      <title>UI: The hotbar key numbers sit centred in their brackets again. Slot views are built at 48…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-2ed3bb5d5ca6</guid>
      <pubDate>Wed, 29 Jul 2026 12:13:58 -0500</pubDate>
      <description><![CDATA[The hotbar key numbers sit centred in their brackets again. Slot views are built at 48 pixels and then drawn at their row's own size, 46 on the utility bar, and only the bracket was following that resize, so every digit landed 2.0px below the bulge it belongs in with its bottom edge 0.6px outside the bracket.]]></description>
    </item>
    <item>
      <title>UI: Resizing a hand slot now moves the box and every offset measured from it in one call, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-8075ee21bebf</guid>
      <pubDate>Wed, 29 Jul 2026 12:14:04 -0500</pubDate>
      <description><![CDATA[Resizing a hand slot now moves the box and every offset measured from it in one call, so the two cannot drift apart. The emote bar and the deck swap button carried the same fault without showing it, since neither draws a key caption at all.]]></description>
    </item>
    <item>
      <title>UI: Fixed the quit confirmation opening behind the login box when the game window was closed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-b88663f56071</guid>
      <pubDate>Wed, 29 Jul 2026 12:38:20 -0500</pubDate>
      <description><![CDATA[Fixed the quit confirmation opening behind the login box when the game window was closed from the login screen. Front end screens now always draw beneath open windows, so this layering bug cannot come back for other dialogs on those screens.]]></description>
    </item>
    <item>
      <title>UI: Fixed the connecting lines in the skill tree, reported by a tester on the restored Skills…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-5a80fd08ec33</guid>
      <pubDate>Wed, 29 Jul 2026 12:52:39 -0500</pubDate>
      <description><![CDATA[Fixed the connecting lines in the skill tree, reported by a tester on the restored Skills window. Each piece of path art was stretched across its whole grid slot and drew as a wide block that never reached the tiles; the pieces now draw at their recorded size, so the lines run thin, bend at the right spots, and join tile to tile. The extra empty space the blocks created between skills is gone.]]></description>
    </item>
    <item>
      <title>UI: The chat window follows new messages again. The auto-scroll ran before the arriving line…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-45cc921d37a3</guid>
      <pubDate>Wed, 29 Jul 2026 13:55:36 -0500</pubDate>
      <description><![CDATA[The chat window follows new messages again. The auto-scroll ran before the arriving line had been measured, so it clamped to the old height and stopped one line short, and because that reads as the player having scrolled up it switched following off for the rest of the session.]]></description>
    </item>
    <item>
      <title>UI: Scrolling up to read chat history still holds your place, and reaching the newest line…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-54ce4a41b897</guid>
      <pubDate>Wed, 29 Jul 2026 13:55:41 -0500</pubDate>
      <description><![CDATA[Scrolling up to read chat history still holds your place, and reaching the newest line starts the following again. The same fix covers the NPC conversation and custom NPC story windows, which share the chat log, plus the Oracle transcript window, which carried its own copy of the bug.]]></description>
    </item>
    <item>
      <title>UI: The theme editor could be dragged shorter than the controls it holds, and the colour…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-27e9fcae4bed</guid>
      <pubDate>Wed, 29 Jul 2026 19:07:02 -0500</pubDate>
      <description><![CDATA[The theme editor could be dragged shorter than the controls it holds, and the colour sliders and hex row then drew on the game world with no window frame behind them. Its floor is now measured from the content it actually has (474px against the 320 it carried), and the frame clips anything that would fall outside it.]]></description>
    </item>
    <item>
      <title>UI: The clip that stops a window drawing outside its own frame moved onto the window-body…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-ce98bfe56709</guid>
      <pubDate>Wed, 29 Jul 2026 19:07:10 -0500</pubDate>
      <description><![CDATA[The clip that stops a window drawing outside its own frame moved onto the window-body style itself, so it now covers windows that build their own frame instead of only the ones that use the shared one. The theme editor was the window that had been missing it.]]></description>
    </item>
    <item>
      <title>UI: Windows that manage their own frame now pull themselves back on screen when the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-fa742f0e6aed</guid>
      <pubDate>Wed, 29 Jul 2026 19:07:18 -0500</pubDate>
      <description><![CDATA[Windows that manage their own frame now pull themselves back on screen when the game window shrinks under them, from a resolution change or the UI size slider. The oracle window, table game boards and the theme editor had no such handling, and a window taller than the screen cannot be dragged back. The three copies of that wiring are one shared piece now.]]></description>
    </item>
    <item>
      <title>UI: The Property Manager is back to the shape it shipped in. Your storage is a list on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-9f14ed5ba800</guid>
      <pubDate>Wed, 29 Jul 2026 19:48:02 -0500</pubDate>
      <description><![CDATA[The <strong>Property Manager</strong> is back to the shape it shipped in. Your storage is a list on the left again, each row led by a picture of the house with its name, town, lot type and item count as sortable columns whose widths you can drag and which the window remembers. Your deeds are parchment cards on the right again, each listing the house, the basement and the dungeon on that lot with the art for whatever sits in each one.]]></description>
    </item>
    <item>
      <title>UI: Almost all of that came from one wrong style class. The card was written as three stacked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-6c579ef07921</guid>
      <pubDate>Wed, 29 Jul 2026 19:48:15 -0500</pubDate>
      <description><![CDATA[Almost all of that came from one wrong style class. The card was written as three stacked lines but carried the theme class for a horizontal row, so it laid itself out sideways: the name, town and detail landed on one line, and the three parts of a lot squeezed down to one character each and rendered as three dots. The rows kept reserving 88 pixels for three lines while drawing one.]]></description>
    </item>
    <item>
      <title>UI: Two more bugs were hiding under it. The smaller lines used the modal-veil class for their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-22de85993a78</guid>
      <pubDate>Wed, 29 Jul 2026 19:48:15 -0500</pubDate>
      <description><![CDATA[Two more bugs were hiding under it. The smaller lines used the modal-veil class for their colour, which is a background, so the town and lot type each drew inside a dark box. And a storage with no name of its own fell back to the scene name, the same text the town column already showed, which is why unnamed storage printed its town twice.]]></description>
    </item>
    <item>
      <title>UI: Every existing test on that window checked source text and wiring, so all of them passed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-e393059498bb</guid>
      <pubDate>Wed, 29 Jul 2026 19:48:16 -0500</pubDate>
      <description><![CDATA[Every existing test on that window checked source text and wiring, so all of them passed while the card was sideways. There is now one that lays a deed card out on a real panel and measures the boxes, so slot labels with room for a single character fail the build.]]></description>
    </item>
    <item>
      <title>Audio: Nineteen NPCs in Grusk moved onto a shared kobold voice: a hoarse, hissing rasp layered…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-a8a1fb402071</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[Nineteen NPCs in Grusk moved onto a shared kobold voice: a hoarse, hissing rasp layered over each speaker's existing voice, so the city reads as one race while its shopkeepers stay distinguishable. The storehouse manager who prompted the report had been using an ordinary human voice.]]></description>
    </item>
    <item>
      <title>Audio: Victor, a child in Castle Atos, had a grown man's voice. He and the other junior treasure…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-c68456b421ff</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[Victor, a child in Castle Atos, had a grown man's voice. He and the other junior treasure hunters now speak with young voices. The voice catalogue holds no male child voice at all, which is why the automatic casting had reached for an adult.]]></description>
    </item>
    <item>
      <title>Audio: A player reported the Ebon Dawn ritual master in Solace Bridge Outskirts sounding female…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-4ddd10745c92</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[A player reported the Ebon Dawn ritual master in Solace Bridge Outskirts sounding female with a modern accent. The NPC carrying that title is Mistress Valdis, and a recast in July had changed a different conversation that no creature in the scene uses. She, her ritual assistants and nine other residents of the zone moved to voices that suit the setting.]]></description>
    </item>
    <item>
      <title>Audio: Elder Wyrm the Riddle Dragon and the Ghairmute dragons got a deep, slow treatment, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-572f7432cfb8</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[Elder Wyrm the Riddle Dragon and the Ghairmute dragons got a deep, slow treatment, and trolls got a heavy growl in place of a calm, friendly voice. Seven more kinds of skeleton and lich joined the rasping undead voice, two of which had been speaking with female voices.]]></description>
    </item>
    <item>
      <title>Audio: Options gained an NPC Voice slider in the Audio tab. Spoken dialogue had shared a volume…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-e1c03c239640</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[<b>Options</b> gained an NPC Voice slider in the Audio tab. Spoken dialogue had shared a volume control with combat grunts and death cries, so lowering one lowered the other. Dialogue now has its own bus nested under Voice, which still trims both.]]></description>
    </item>
    <item>
      <title>Audio: New voice treatments are checked against the audio filter engine before any generation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-e1a0d127e0a6</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[New voice treatments are checked against the audio filter engine before any generation run starts, after a bad parameter in a first draft of the dragon voice failed all 92 of its clips once the speech had already been produced. The generator also stopped retrying that kind of failure four times over.]]></description>
    </item>
    <item>
      <title>Audio: Measured the new treatments against the voices already in the game before publishing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-758e5abe7976</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[Measured the new treatments against the voices already in the game before publishing anything. The kobold and dragon sets came out 4 to 6 dB louder than everything else and were regenerated at matching levels.]]></description>
    </item>
    <item>
      <title>Audio: Three of the ten reported voice bugs were already fixed at the source and were closed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-6dd2cd0e46f2</guid>
      <pubDate>Wed, 29 Jul 2026 07:08:37 -0500</pubDate>
      <description><![CDATA[Three of the ten reported voice bugs were already fixed at the source and were closed with the evidence. The tester complaints left over on those were separate problems and were filed on their own: two undead types missing the flag that lets them taunt, one creature with no dialogue written for it, and replies the game assembles while running, which can never have a matching recording.]]></description>
    </item>
    <item>
      <title>Audio: NPCs now speak the "I don't know where that is" reply when asked for directions to a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-b65b5384abf3</guid>
      <pubDate>Wed, 29 Jul 2026 12:09:51 -0500</pubDate>
      <description><![CDATA[NPCs now speak the &quot;I don't know where that is&quot; reply when asked for directions to a place they do not know. That reply is assembled on the fly, so it never had a recorded clip and played as silent text; the fixed opening sentence now has a clip in all 160 cast voices, and the list of places the NPC does know stays on screen as text.]]></description>
    </item>
    <item>
      <title>Audio: Fixed Lich Mages and Skeleton Mages never taunting in combat. Their taunt lines were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d41d20d6e76a</guid>
      <pubDate>Wed, 29 Jul 2026 12:37:07 -0500</pubDate>
      <description><![CDATA[Fixed Lich Mages and Skeleton Mages never taunting in combat. Their taunt lines were missing the combat flag in the exported bark data, so only their death lines ever played. The fix also restores taunts for Lich Lords and the other lich variants that share the same lines. Added a test that catches the flag going missing again.]]></description>
    </item>
    <item>
      <title>Planning: Changed the website plan: the account and store systems stay as they are and get adapted…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-e85d22d27e1e</guid>
      <pubDate>Wed, 29 Jul 2026 08:55:21 -0500</pubDate>
      <description><![CDATA[Changed the website plan: the account and store systems stay as they are and get adapted for the game's new home, and the planned rebuild from scratch is shelved as a fallback. The roadmap and the public roadmap page record the change.]]></description>
    </item>
    <item>
      <title>Planning: Added two-factor account security to the roadmap, planned to follow right after the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-e37282e7446e</guid>
      <pubDate>Wed, 29 Jul 2026 09:19:39 -0500</pubDate>
      <description><![CDATA[Added two-factor account security to the roadmap, planned to follow right after the account website settles into its new home: optional sign-in with a standard authenticator app and backup codes for recovery.]]></description>
    </item>
    <item>
      <title>Planning: Checked the first item on the crafting proposal list before building it and found it had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-1761f1002276</guid>
      <pubDate>Wed, 29 Jul 2026 16:20:04 -0500</pubDate>
      <description><![CDATA[Checked the first item on the crafting proposal list before building it and found it had already shipped on 28 July as part of a pass over every converted item list. The proposal page now marks both the tooltip items as shipped, and the "no tooltips anywhere" entry in the problems list is marked fixed.]]></description>
    </item>
    <item>
      <title>Art Tools: Added a texel density audit to the editor. It walks prefabs, scenes or just what you have…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-56b2a63f0024</guid>
      <pubDate>Wed, 29 Jul 2026 09:24:39 -0500</pubDate>
      <description><![CDATA[Added a texel density audit to the editor. It walks prefabs, scenes or just what you have selected, works out how many texels of a texture actually land on a metre of the surface it is painted on, and ranks every texture by whether it is over- or under-resolved. Output is a set of CSVs plus a console summary; it does not change any assets.]]></description>
    </item>
    <item>
      <title>Art Tools: The audit knows the difference between a texture that is too big and a texture whose…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-16ebe37cbba6</guid>
      <pubDate>Wed, 29 Jul 2026 09:24:39 -0500</pubDate>
      <description><![CDATA[The audit knows the difference between a texture that is too big and a texture whose import cap is merely set high. Around 9,965 textures in the project sit at the default 2048 cap over smaller source art, where changing the cap does nothing at all, and those are filtered out before anything is proposed rather than padding a report.]]></description>
    </item>
    <item>
      <title>Art Tools: Checked the maths against known geometry: quads of 1, 2 and 4 metres carrying the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-98bcf4358a19</guid>
      <pubDate>Wed, 29 Jul 2026 09:24:39 -0500</pubDate>
      <description><![CDATA[Checked the maths against known geometry: quads of 1, 2 and 4 metres carrying the same 512-pixel texture measure 512, 256 and 128 texels per metre exactly. 44 editor tests cover the arithmetic, the target bands and the import-cap filter.]]></description>
    </item>
    <item>
      <title>Art Tools: Running it on the Cistern of Atos turned up a bug in the tool itself: dungeon walls were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-1813a8ee6254</guid>
      <pubDate>Wed, 29 Jul 2026 09:24:39 -0500</pubDate>
      <description><![CDATA[Running it on the Cistern of Atos turned up a bug in the tool itself: dungeon walls were being judged against the band for small props, one step stricter than architecture, so healthy walls read as blurry and genuinely oversized textures stayed hidden. Fixed, and the scene now reports 8 textures on target where it previously reported 5.]]></description>
    </item>
    <item>
      <title>Art Tools: The matching Scene View colour overlay is written but switched off and its menu entries…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-b0f2e23bf644</guid>
      <pubDate>Wed, 29 Jul 2026 09:24:39 -0500</pubDate>
      <description><![CDATA[The matching Scene View colour overlay is written but switched off and its menu entries greyed out. Unity blanks the whole viewport when any replacement shader is applied in this version, including its own built-in ones, so the fault is not ours to fix from the shader side. What was tried and what to try next is written down rather than left to be rediscovered.]]></description>
    </item>
    <item>
      <title>Journal: Renamed three tabs in the Journal window after tester feedback: Tasks is now Active Tasks…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-38f2175b8cfe</guid>
      <pubDate>Wed, 29 Jul 2026 12:18:19 -0500</pubDate>
      <description><![CDATA[Renamed three tabs in the Journal window after tester feedback: <b>Tasks</b> is now <b>Active Tasks</b>, <b>Journal</b> is now <b>Completed Tasks</b> (it lists finished quests), and <b>Entries</b> is now <b>Journal</b> (it holds your journal entries). The Information tab text was rewritten to match.]]></description>
    </item>
    <item>
      <title>Journal: Translated the whole Journal window for the first time. The 16 strings the window gained…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-727914938ef6</guid>
      <pubDate>Wed, 29 Jul 2026 12:18:20 -0500</pubDate>
      <description><![CDATA[Translated the whole Journal window for the first time. The 16 strings the window gained during its UI Toolkit conversion had never reached the translation database, so tab names, column headers, the search field, the settings rows and the help text rendered English in all eight languages while the older strings around them were translated. All 16 are now filled for German, Spanish, French, Italian, Japanese, Portuguese, Russian and Simplified Chinese.]]></description>
    </item>
    <item>
      <title>Journal: Corrected the in-game Journal help topic, which still described a "Current Tasks" page…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-b51c42ab0931</guid>
      <pubDate>Wed, 29 Jul 2026 12:18:21 -0500</pubDate>
      <description><![CDATA[Corrected the in-game Journal help topic, which still described a "Current Tasks" page that no longer exists. It now names the Active Tasks tab, in English and in all eight languages.]]></description>
    </item>
    <item>
      <title>Creatures: Wrote a step-by-step internal guide for building a new monster: model and rig import…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d9e7978c6e49</guid>
      <pubDate>Wed, 29 Jul 2026 09:36:56 -0500</pubDate>
      <description><![CDATA[Wrote a step-by-step internal guide for building a new monster: model and rig import, animation sets, sounds and effects, stats and AI, loot tables, and the registration steps that make a creature spawnable and testable. Fourteen linked pages, with each claim checked against the game code.]]></description>
    </item>
    <item>
      <title>Creatures: The guide closes with a worked example and a pass or fail checklist. Its first real test…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-6f57536860d8</guid>
      <pubDate>Wed, 29 Jul 2026 09:36:57 -0500</pubDate>
      <description><![CDATA[The guide closes with a worked example and a pass or fail checklist. Its first real test comes next: wiring in a completely new model and animation set by following it.]]></description>
    </item>
    <item>
      <title>Creatures: Bloody Bones in Solace Bridge Outskirts was completely mute: no chat bubble, no chat log…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-f9e7b229c086</guid>
      <pubDate>Wed, 29 Jul 2026 12:21:20 -0500</pubDate>
      <description><![CDATA[Bloody Bones in Solace Bridge Outskirts was completely mute: no chat bubble, no chat log line, no voice, because no dialogue had ever been written for him. He now taunts during combat and gets a last word when killed, all drawn from the ballad the ghost children sing about him.]]></description>
    </item>
    <item>
      <title>Creatures: His new lines are translated into all eight supported languages, matching each language's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-ee0a60375eb6</guid>
      <pubDate>Wed, 29 Jul 2026 12:21:21 -0500</pubDate>
      <description><![CDATA[His new lines are translated into all eight supported languages, matching each language's existing name for him from the rhyme, and spoken in the same deep rasping undead voice the liches and Bloodbone skeletons use.]]></description>
    </item>
    <item>
      <title>Creatures: Revived the Cave Wrasse , a six-legged cave lizard that was cut from the game in 2015…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-a135c8379d6a</guid>
      <pubDate>Wed, 29 Jul 2026 12:31:00 -0500</pubDate>
      <description><![CDATA[Revived the <strong>Cave Wrasse</strong>, a six-legged cave lizard that was cut from the game in 2015. Its art came back into the project last September and had been sitting unused, so the creature was rebuilt around it: five of them now, from a skittish Cave Wrasse up through Spineback and Emberglow to the Drakefed, with a Wrasse Broodmother on top.]]></description>
    </item>
    <item>
      <title>Creatures: Wrasses den near dragon lairs and live off what dragons leave behind, and the higher…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-ef7c3cf54469</guid>
      <pubDate>Wed, 29 Jul 2026 12:31:00 -0500</pubDate>
      <description><![CDATA[Wrasses den near dragon lairs and live off what dragons leave behind, and the higher tiers have taken on the traits to match. Hide colour and the glow coming off them both climb with tier, from a dull ember to molten on the Broodmother. From T12 up they breathe fire, the Drakefed adds a tail bash, and the Broodmother enrages below 35% health. Only she is bigger.]]></description>
    </item>
    <item>
      <title>Creatures: Field dressing pays in Serpent Scales and Sulfurous Ash on every tier, Dragon Essence…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-260b0f8e1a6c</guid>
      <pubDate>Wed, 29 Jul 2026 12:31:00 -0500</pubDate>
      <description><![CDATA[Field dressing pays in Serpent Scales and Sulfurous Ash on every tier, Dragon Essence from T12 up, and tier leather and Crown of the Obsidian bundles for the bulk. The Broodmother always drops a <strong>Wrasse Egg</strong> - an item that had been in the files unused since the quest that wanted one was cut. They are not placed anywhere yet.]]></description>
    </item>
    <item>
      <title>Testing: The first full run of the EditMode suite on this checkout surfaced 16 standing failures…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-dffe49b2ba30</guid>
      <pubDate>Wed, 29 Jul 2026 12:25:39 -0500</pubDate>
      <description><![CDATA[The first full run of the EditMode suite on this checkout surfaced 16 standing failures. Diagnosis found five real bugs hiding behind them: the NGUI teardown warning could never fire in the editor (a destroyed-object check defeated its own identity set), blueprint file names saved on one platform could be unwritable on another, the Lua addon sandbox misjudged foreign-style absolute paths, and a shader fix from the engine migration had broken one platform's shadow path. The other eleven were tests whose expectations had drifted from legitimate refactors or whose fixture files never existed in a fresh checkout. All 16 cleared: the suite now passes 5,531 tests with zero failures.]]></description>
    </item>
    <item>
      <title>Testing: Documented a test-suite naming trap: a new test sub-namespace named after a game class…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-187abe62fedd</guid>
      <pubDate>Wed, 29 Jul 2026 12:39:58 -0500</pubDate>
      <description><![CDATA[Documented a test-suite naming trap: a new test sub-namespace named after a game class breaks other test files that use that class, with a compile error pointing at the wrong file. Renamed the new bark test namespace to avoid it.]]></description>
    </item>
    <item>
      <title>Chat: Clicking a combat glyph or a hotbar slot no longer hands your keyboard to the chat box…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-415b3e4a891c</guid>
      <pubDate>Wed, 29 Jul 2026 14:02:30 -0500</pubDate>
      <description><![CDATA[Clicking a combat glyph or a hotbar slot no longer hands your keyboard to the chat box. If you had used chat earlier in the session, clicking a glyph while running stopped your character and the movement key you were holding typed itself into the chat field as a row of repeated letters.]]></description>
    </item>
    <item>
      <title>Chat: Fixed the chat entry row: typing a long unbroken message stretched the text box and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-97a17574919e</guid>
      <pubDate>Wed, 29 Jul 2026 19:12:08 -0500</pubDate>
      <description><![CDATA[Fixed the chat entry row: typing a long unbroken message stretched the text box and pushed the channel arrow button off the window edge. The box now scrolls long text inside itself and the button stays put; the NPC conversation row got the same guard.]]></description>
    </item>
    <item>
      <title>Chat: Follow-up to this morning's chat focus fix, which did not hold: holding W and clicking a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-a1ba073aac0f</guid>
      <pubDate>Wed, 29 Jul 2026 21:05:24 -0500</pubDate>
      <description><![CDATA[Follow-up to this morning's chat focus fix, which did not hold: holding W and clicking a combat glyph still stopped the run and typed a row of w into the chat line. The window found two more ways to take the keyboard back on the new interface: windows coming forward reload their content and the framework hands the focus back afterwards, and chat lines that force the window open (like the error text from a failed glyph use) do the same with no click involved.]]></description>
    </item>
    <item>
      <title>Chat: Closed the whole class this time: the chat box now accepts the keyboard only when you ask…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d70f519d18fa</guid>
      <pubDate>Wed, 29 Jul 2026 21:05:39 -0500</pubDate>
      <description><![CDATA[Closed the whole class this time: the chat box now accepts the keyboard only when you ask for it (Return, slash, Shift plus a letter, a click in the box, or typing), a window coming forward keeps the caret where it was, and once you click away nothing can hand the chat box the keyboard again. New tests pin each rule, including one that drives a real interface panel.]]></description>
    </item>
    <item>
      <title>Testing: Added EditMode coverage for the build-at-one-size, draw-at-another path the old hand slot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-15d52da7f2ae</guid>
      <pubDate>Wed, 29 Jul 2026 12:14:11 -0500</pubDate>
      <description><![CDATA[Added EditMode coverage for the build-at-one-size, draw-at-another path the old hand slot tests skipped: they built each slot at its final size, which is the one case the game never does. The new checks measure the digit against the bracket actually drawn under it, and source guards stop another window setting a slot width directly.]]></description>
    </item>
    <item>
      <title>Interface: Restored the rule that clicking anything other than the text box you are typing in takes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-9285611a68c6</guid>
      <pubDate>Wed, 29 Jul 2026 14:02:37 -0500</pubDate>
      <description><![CDATA[Restored the rule that clicking anything other than the text box you are typing in takes the cursor out of that box. That covers combat glyphs, hotbar and emote slots, other windows, the world, and the chat window's own tabs and title bar. Text you already typed stays where it is.]]></description>
    </item>
    <item>
      <title>Interface: The keyboard focus outline was wired up on two of the thirteen interface surfaces that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d6d28da0f2d9</guid>
      <pubDate>Wed, 29 Jul 2026 14:02:38 -0500</pubDate>
      <description><![CDATA[The keyboard focus outline was wired up on two of the thirteen interface surfaces that use it, and it stopped working after any window was hidden and shown again. It now applies everywhere, including the HUD, context menus, popups and the tool windows.]]></description>
    </item>
    <item>
      <title>Interface: Ctrl+Z while typing in chat no longer undoes a decoration. The keyboard gate that keeps…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-c38247d44b4e</guid>
      <pubDate>Wed, 29 Jul 2026 19:05:37 -0500</pubDate>
      <description><![CDATA[Ctrl+Z while typing in chat no longer undoes a decoration. The keyboard gate that keeps gameplay keys out of a text box had let every Ctrl chord through since the original import, on the reasoning that a player mid-sentence might still want a chorded command. It now holds back the six chords a text field implements itself, so undo, redo, cut, copy, paste and select-all belong to whatever you are typing in. Ctrl+1 through Ctrl+0 still discard cards while you chat.]]></description>
    </item>
    <item>
      <title>Travel: The destination picker you get when a town has more than one way in now lists the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-97bcaec7f2fd</guid>
      <pubDate>Wed, 29 Jul 2026 12:14:20 -0500</pubDate>
      <description><![CDATA[The destination picker you get when a town has more than one way in now lists the entrances you have not found yet. They sit at the bottom in grey italics under the name "Undiscovered" and cannot be picked, so the list shows a town has more ways in without saying where they are. A tester flagged that this was specced but never visible anywhere; the entrances were being filtered out before the window ever saw them, and had been since long before the window was rebuilt.]]></description>
    </item>
    <item>
      <title>Travel: Started a guide light for finding your way: a wisp you summon that flies the walkable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-21076aa46067</guid>
      <pubDate>Wed, 29 Jul 2026 19:37:30 -0500</pubDate>
      <description><![CDATA[Started a guide light for finding your way: a wisp you summon that flies the walkable route ahead of you and shows your next turn rather than the whole way. This first pass is the routing and motion maths with its tests, so there is nothing to see in game yet.]]></description>
    </item>
    <item>
      <title>Travel: Added 15 model classes and 121 tests covering route resampling, corner detection, pacing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-a404c0f64633</guid>
      <pubDate>Wed, 29 Jul 2026 19:37:31 -0500</pubDate>
      <description><![CDATA[Added 15 model classes and 121 tests covering route resampling, corner detection, pacing, the state machine, the expiry clock and the per-scene rules. The guide stays off in dungeons and stops at the edge of ground you have actually explored.]]></description>
    </item>
    <item>
      <title>Docs: Building the wrasses was the first real test of the new-monster guide, so the guide got…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-ad27be65445b</guid>
      <pubDate>Wed, 29 Jul 2026 12:40:24 -0500</pubDate>
      <description><![CDATA[Building the wrasses was the first real test of the new-monster guide, so the guide got corrected where it fell short. The largest catch: picking an animation base is not just about body shape. A creature borrowing the dragon fire attacks needs a base that has the states those attacks play, or the fire lands with no animation at all and nothing anywhere reports a problem.]]></description>
    </item>
    <item>
      <title>Docs: Also corrected: sound event names are matched without regard to case at runtime, where…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-7f58607e2f95</guid>
      <pubDate>Wed, 29 Jul 2026 12:40:24 -0500</pubDate>
      <description><![CDATA[Also corrected: sound event names are matched without regard to case at runtime, where the guide claimed the opposite in three places. Spelling still decides one thing, which is whether a creature death cry follows the voice volume slider. Two suspected errors turned out to be correct and were left alone.]]></description>
    </item>
    <item>
      <title>Creature Balance: Built the Creature Audit : an Editor tool that bakes every shipped creature and tamed pet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-86485cd7075a</guid>
      <pubDate>Wed, 29 Jul 2026 13:07:55 -0500</pubDate>
      <description><![CDATA[Built the <b>Creature Audit</b>: an Editor tool that bakes every shipped creature and tamed pet to JSON. Stats replay through the game's own formulas (health, innate resistances at effective level, per-rune damage and cooldowns), loot bundles flatten with XP and gold called out as the loot items they really are, and spawn points, scene tiers and the taming matrix join in. 14 EditMode tests pin the math to the game code.]]></description>
    </item>
    <item>
      <title>Creature Balance: First full creature bake committed: 1,546 creatures and tamed pets across 66 families…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-525d2a694632</guid>
      <pubDate>Wed, 29 Jul 2026 13:08:35 -0500</pubDate>
      <description><![CDATA[First full creature bake committed: 1,546 creatures and tamed pets across 66 families, every one with effective stats, ability evals, flattened loot and spawn data.]]></description>
    </item>
    <item>
      <title>Creature Balance: analyze.py fits per-level curves over the creature data, flags outliers and tier…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-225111456d72</guid>
      <pubDate>Wed, 29 Jul 2026 13:09:00 -0500</pubDate>
      <description><![CDATA[analyze.py fits per-level curves over the creature data, flags outliers and tier mismatches, and scores everything against committed target curves. The first run surfaced 615 curve outliers, 48 bosses weaker than the regular-creature curve, and a T15 lich that awards almost no XP.]]></description>
    </item>
    <item>
      <title>Creature Balance: Built the Creature Balance page: a sortable, filterable roster of all 1,546 creatures…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-58bd30ab2a8b</guid>
      <pubDate>Wed, 29 Jul 2026 13:31:02 -0500</pubDate>
      <description><![CDATA[Built the <b>Creature Balance</b> page: a sortable, filterable roster of all 1,546 creatures, charts of HP, damage, XP and gold against level with fitted curves and target overlays, a ranked outlier worklist, and a live target-curve editor. Each creature gets a detail page with its full stat block, abilities, loot table and spawn map.]]></description>
    </item>
    <item>
      <title>Creature Balance: The Creature Balance page is live on the dev portal and the tester hub, behind the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-8b47a2f1cde4</guid>
      <pubDate>Wed, 29 Jul 2026 13:36:04 -0500</pubDate>
      <description><![CDATA[The Creature Balance page is live on the dev portal and the tester hub, behind the same login testers already use for the balance audit. Filed a verify task asking testers to check creatures they know well against the page's numbers.]]></description>
    </item>
    <item>
      <title>Creature Balance: A nightly Jenkins job now rebakes the creature data, reruns the analysis, and republishes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-91cce32601f2</guid>
      <pubDate>Wed, 29 Jul 2026 13:36:26 -0500</pubDate>
      <description><![CDATA[A nightly Jenkins job now rebakes the creature data, reruns the analysis, and republishes the page, so the worksheet tracks balance changes as they land.]]></description>
    </item>
    <item>
      <title>Creature Balance: Charts on the Creature Balance page now open full screen from a button on each card, same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-7a7ec28db066</guid>
      <pubDate>Wed, 29 Jul 2026 14:03:25 -0500</pubDate>
      <description><![CDATA[Charts on the Creature Balance page now open full screen from a button on each card, same filters and overlays, close on Escape.]]></description>
    </item>
    <item>
      <title>Creature Balance: Cleaned up after the creature bake: the committed data files carried a build stamp from a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-ec4936f59a84</guid>
      <pubDate>Wed, 29 Jul 2026 18:30:47 -0500</pubDate>
      <description><![CDATA[Cleaned up after the creature bake: the committed data files carried a build stamp from a tree that predated the tool, so they now name the build that actually produced them. The docs were wrong about rebakes leaving those files untouched, and now say what really happens.]]></description>
    </item>
    <item>
      <title>Crafting: Hovering a recipe now shows the whole recipe: what it makes, its tier and school, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-561f9d567b14</guid>
      <pubDate>Wed, 29 Jul 2026 16:19:39 -0500</pubDate>
      <description><![CDATA[Hovering a recipe now shows the whole recipe: what it makes, its tier and school, the skill level it asks for, your chance of success at the station you are standing at, and every ingredient with a have/need count in the same three colours the recipe card uses. It used to show the recipe name and nothing else.]]></description>
    </item>
    <item>
      <title>Crafting: A recipe card has room for eight ingredient rows and stopped there, so a longer recipe…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-d05b484092f0</guid>
      <pubDate>Wed, 29 Jul 2026 16:19:48 -0500</pubDate>
      <description><![CDATA[A recipe card has room for eight ingredient rows and stopped there, so a longer recipe hid the rest. The new hover lists every ingredient, and the recipe book cards answer the same hover as the station list.]]></description>
    </item>
    <item>
      <title>Crafting: The recipe rows were not using the game tooltip system at all: the list carried its own…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-25287b1dc5b9</guid>
      <pubDate>Wed, 29 Jul 2026 16:19:56 -0500</pubDate>
      <description><![CDATA[The recipe rows were not using the game tooltip system at all: the list carried its own plain text plate, which is why the older detailed hover was unreachable. Rows now answer through their list, the same arrangement the other converted windows use, so one hover opens one tooltip.]]></description>
    </item>
    <item>
      <title>Gathering: The harvesting swing meter has a bright centre inside the target zone, and hitting it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-32100121fd7f</guid>
      <pubDate>Wed, 29 Jul 2026 18:31:07 -0500</pubDate>
      <description><![CDATA[The harvesting swing meter has a bright centre inside the target zone, and hitting it used to do nothing but flash the marker. Land it on a bonus pull now and that pull is granted twice: double the materials and a second experience reward, up to three times per node.]]></description>
    </item>
    <item>
      <title>Gathering: That centre band used to shrink with the target zone, down to a sliver worth about 14…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-10c42fb4e571</guid>
      <pubDate>Wed, 29 Jul 2026 18:31:14 -0500</pubDate>
      <description><![CDATA[That centre band used to shrink with the target zone, down to a sliver worth about 14 milliseconds at the end of a long chain, which was luck rather than aim. It now stops shrinking at a size a person can hit. The band shows orange while a node can still pay the bonus and gold once it cannot.]]></description>
    </item>
    <item>
      <title>Gathering: Suggested on the player wishlist, which also asked for rare materials off precise hits…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-eb704dfb84aa</guid>
      <pubDate>Wed, 29 Jul 2026 18:31:23 -0500</pubDate>
      <description><![CDATA[Suggested on the player wishlist, which also asked for rare materials off precise hits. Those already exist on the first pull of a node and never on the bonus pulls, so putting them on the bonus tier is a content pass of its own and is tracked. Ignoring the meter still gathers exactly as it did before.]]></description>
    </item>
    <item>
      <title>Dev Tools: Added a comment count column to the issue tracker list, plus a second column that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-1ab5b13e65a9</guid>
      <pubDate>Wed, 29 Jul 2026 19:14:58 -0500</pubDate>
      <description><![CDATA[Added a comment count column to the issue tracker list, plus a second column that excludes notes posted by the automation account. Both columns sort, so the most-discussed items rank first.]]></description>
    </item>
    <item>
      <title>Dev Tools: Added a Commented by filter that finds every issue a given person has written a note on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-3565605b9a78</guid>
      <pubDate>Wed, 29 Jul 2026 19:14:58 -0500</pubDate>
      <description><![CDATA[Added a <b>Commented by</b> filter that finds every issue a given person has written a note on. The built-in filter for this also matched field changes such as a status flip. It inverts too, listing issues nobody has commented on.]]></description>
    </item>
    <item>
      <title>Dev Tools: Plugin installs on the tracker now boot the app in a separate process as a check before…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-314f2abfd7ec</guid>
      <pubDate>Wed, 29 Jul 2026 19:14:58 -0500</pubDate>
      <description><![CDATA[Plugin installs on the tracker now boot the app in a separate process as a check before restarting the live one, so a bad file fails the install instead of the service.]]></description>
    </item>
    <item>
      <title>Social: Fixed chat repeating "(name) is now online." for a friend who logged in once. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-43d5f99bcd88</guid>
      <pubDate>Wed, 29 Jul 2026 21:31:47 -0500</pubDate>
      <description><![CDATA[Fixed chat repeating "(name) is now online." for a friend who logged in once. The announcement compared each server update against a cache that gets wiped on reconnect and replaced wholesale by friends-list downloads, so every reset re-armed the message; one tester saw the same friend announced 8 times while they were zoning. Announcements now remember the last announced state for the whole session and fire once per real change, with EditMode tests over the new logic.]]></description>
    </item>
    <item>
      <title>Social: Chasing the spam through the server logs turned up a bigger problem: the two social…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-29-032dac9cbb75</guid>
      <pubDate>Wed, 29 Jul 2026 21:31:48 -0500</pubDate>
      <description><![CDATA[Chasing the spam through the server logs turned up a bigger problem: the two social server processes have not been sharing who is online since mid-July, so whether a friend shows online can depend on which one your session landed on. Filed with log evidence as #2833; the chat fix above holds either way.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-28</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-headlines</guid>
      <pubDate>Tue, 28 Jul 2026 21:29:19 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Window hotkeys and the window selector work again: <b>41 of 48 windows</b> would not open on build 67, from a single fault in the shared window controller.</li>
        <li>Effect tooltips name who applied what. Two players rending the same target read as two entries with their own numbers and timers instead of a stack of identical lines. Stack limits are untouched and still belong to the target.</li>
        <li><b>Names no longer show through walls.</b> Floating name labels sat on a layer with no depth information to test against, so they drew over buildings and hills; a character half behind a doorframe now shows only the part of their name you could actually see.</li>
        <li>Windows can no longer be <b>lost off the edge of the screen</b>. Dragging one past an edge saved that spot, and dropping your resolution or raising the UI scale stranded windows outside the visible area with no way to grab them back.</li>
        <li>The inventory's <b>nineteen category buttons</b> fold away. At the narrowest window they wrapped onto five rows, about 148 pixels spent on filter controls before the item list got any. One row now names the active filter and unfolds them on click, and each window remembers whether you left it open.</li>
        <li>Undead summons finally scale with <b>Death Mastery</b>. Their health read the mastery off the summon rather than the summoner, and a summoned skeleton has none of its own, so it counted for nothing. At 100 in Undead Mastery and Death Mastery the bonus health goes from 250 to 562.</li>
        <li>The zone maps have been <b>redrawn, all 25 of them</b>. Seas and lakes are water instead of the ground under them, the docks and bridges the capture camera had been dropping are back, house roofs cover their rooms again, and ore and cotton are no longer painted into the ground.</li>
        <li>Decorations answer <b>who put this here</b>: tooltips name the placer and the last mover with a readable time, and the decoration list gained a Placed By column.</li>
        <li>Item tooltips are back in every list window. Hovering anything in a bag had shown nothing at all since the day before, on every window converted so far.</li>
        <li>A <b>Terrain Leveller</b> for town governors: drop one and the ground across its square goes flat, grass and trees cleared. Three sizes, and the follow-up the flattening work deferred in July.</li>
        <li>Decorating gains full <b>undo and redo</b>: moves, stows, pick-ups and placements step back with Ctrl+Z and forward with Ctrl+Y, with strip buttons and a history list, and shared lots clear the history honestly when someone else edits.</li>
        <li><b>The tester tracker got a full status sweep</b> — 13 tasks testers had passed in prose were closed, 29 sitting on an unanswered failure went back to Feedback with a reply, and 43 that were live on chaos but stuck in New became visible on the in-game board again.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed five wishlist ideas from players — a Ward/specialization…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-3275bf41e2a9</guid>
      <pubDate>Tue, 28 Jul 2026 03:22:44 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed five wishlist ideas from players — a Ward/specialization balance ask, hiding other players' emotes, an aggro meter and dungeon-structure/VFX bundle, a call to revisit the Truth questline, and a batch of smaller QoL asks.]]></description>
    </item>
    <item>
      <title>User Interface: The title screen burn now runs 3.5 seconds instead of 2.5, so the old art reads as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2710facc0e5b</guid>
      <pubDate>Tue, 28 Jul 2026 05:39:17 -0500</pubDate>
      <description><![CDATA[The title screen burn now runs 3.5 seconds instead of 2.5, so the old art reads as catching fire rather than wiping away. It also has sound for the first time: a fire builds while the old title is still up, and a whoosh lands on the first burning holes and dies out as the new artwork settles.]]></description>
    </item>
    <item>
      <title>User Interface: The chat window header is back on the tab line. Tabs and the five buttons share one row…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-9539c69c5876</guid>
      <pubDate>Tue, 28 Jul 2026 10:29:30 -0500</pubDate>
      <description><![CDATA[The chat window header is back on the tab line. Tabs and the five buttons share one row again, the way they did before, and the window no longer spends a row on a title it never had.]]></description>
    </item>
    <item>
      <title>User Interface: Add tab, the tab list arrow and the chat options gear went back to their original artwork…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-f9fbf5655f89</guid>
      <pubDate>Tue, 28 Jul 2026 10:29:30 -0500</pubDate>
      <description><![CDATA[Add tab, the tab list arrow and the chat options gear went back to their original artwork instead of the text symbols the conversion left behind, and each one lights up on hover and while held.]]></description>
    </item>
    <item>
      <title>User Interface: The window pin is a pushpin again on all fifteen windows that have one, replacing the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-538580e7e4de</guid>
      <pubDate>Tue, 28 Jul 2026 10:29:30 -0500</pubDate>
      <description><![CDATA[The window pin is a pushpin again on all fifteen windows that have one, replacing the word "Pin" and a checkbox. It lies on its side when unpinned and swings upright and settles into the bar when pinned, and hovering it says which it is.]]></description>
    </item>
    <item>
      <title>User Interface: Fixed a title bar that let any widget sitting in it start a window drag. The help button…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4f859df8f236</guid>
      <pubDate>Tue, 28 Jul 2026 10:29:30 -0500</pubDate>
      <description><![CDATA[Fixed a title bar that let any widget sitting in it start a window drag. The help button already did this, so pressing it moved the window instead of opening help.]]></description>
    </item>
    <item>
      <title>UI: The check box in the game windows is a square box again. It had been drawn with the round…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-a2fc95ecf876</guid>
      <pubDate>Tue, 28 Jul 2026 05:47:00 -0500</pubDate>
      <description><![CDATA[The check box in the game windows is a square box again. It had been drawn with the round radio-button frame, so an empty check box and an empty radio button were the same picture, and "checked" was only a small tick inside the circle. Radio buttons keep the round frame, so the two shapes now mean different things.]]></description>
    </item>
    <item>
      <title>UI: Hovering a check box no longer erases it. The window styling had restated the hover look…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-c7717f9308dd</guid>
      <pubDate>Tue, 28 Jul 2026 05:47:01 -0500</pubDate>
      <description><![CDATA[Hovering a check box no longer erases it. The window styling had restated the hover look with the right settings but the wrong selector, so the game's own rules were quietly winning and blanking the art. The box now holds still under the pointer, its outline brightens, and the label goes white.]]></description>
    </item>
    <item>
      <title>UI: The check box is drawn from the same backing and hairline the text fields and dropdowns…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-a9836f7cc71d</guid>
      <pubDate>Tue, 28 Jul 2026 05:47:01 -0500</pubDate>
      <description><![CDATA[The check box is drawn from the same backing and hairline the text fields and dropdowns use instead of from a sprite, so it stays sharp at every UI size and picks up all four themes with no new art. Disabled check boxes now dim the way disabled buttons do.]]></description>
    </item>
    <item>
      <title>UI: Nudged the title screen artwork 40 pixels left so the phoenix and the chaos star line up…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-5a64fef0a36f</guid>
      <pubDate>Tue, 28 Jul 2026 06:00:53 -0500</pubDate>
      <description><![CDATA[Nudged the title screen artwork 40 pixels left so the phoenix and the chaos star line up with the column of menu buttons. The composition sits about 55 pixels right of center in the source image, so the buttons looked off to one side even though they were centered on screen.]]></description>
    </item>
    <item>
      <title>UI: The status frame in the top left went back to the layout it had before the interface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ca17fb97a6cb</guid>
      <pubDate>Tue, 28 Jul 2026 07:30:36 -0500</pubDate>
      <description><![CDATA[The status frame in the top left went back to the layout it had before the interface rebuild: the title sits above the name again, both lines left align with the bars under them, and the spacing between lines is tighter. The conversion had been drawing that frame with the floating name plate&#39;s text sizes, so the name came out at 20px instead of 18 and the title and guild at 16 instead of 12, which left the title nearly as large as the name.]]></description>
    </item>
    <item>
      <title>UI: Health and focus bars went from 100 to 133 pixels wide and picked up rounded ends, a dark…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-bc43ec7836c6</guid>
      <pubDate>Tue, 28 Jul 2026 07:30:37 -0500</pubDate>
      <description><![CDATA[Health and focus bars went from 100 to 133 pixels wide and picked up rounded ends, a dark track and a thin outline. The track is what a partly empty bar was missing: with nothing drawn behind the fill, the empty part of the bar simply disappeared. The focus bar went back to its authored blue, and buff icons gained a 3 pixel gap above them.]]></description>
    </item>
    <item>
      <title>UI: Tooltips that opened near the right or bottom of the screen were drawn starting at the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-0c280517bc57</guid>
      <pubDate>Tue, 28 Jul 2026 07:37:31 -0500</pubDate>
      <description><![CDATA[Tooltips that opened near the right or bottom of the screen were drawn starting at the mouse pointer and ran off the edge, cutting off the end of their text. The skill tracker in the top right corner showed this on every hover, losing the description and the next-level block. Tooltips are now placed once their real size is known, so they stay inside the screen, and they stop short of the top and bottom edges again the way the old interface did.]]></description>
    </item>
    <item>
      <title>UI: Two other popups had the same problem and got the same fix: the row tooltips on party and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ac05f874b9c7</guid>
      <pubDate>Tue, 28 Jul 2026 07:37:40 -0500</pubDate>
      <description><![CDATA[Two other popups had the same problem and got the same fix: the row tooltips on party and guild lists, which were placed at a fixed offset with no screen check at all, and the Options gear menu, which only checked its top edge and guessed its own height at 84 pixels instead of measuring it.]]></description>
    </item>
    <item>
      <title>UI: Most windows stopped opening on build 67. The keys for blocked players, emotes, combat…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-967f7329a73e</guid>
      <pubDate>Tue, 28 Jul 2026 08:30:23 -0500</pubDate>
      <description><![CDATA[Most windows stopped opening on build 67. The keys for blocked players, emotes, combat decks, decoration settings, the journal, lot deeds, nearby players, the Price of the Oracle, the recipe book and titles did nothing, and picking a window from the selector menu did nothing either. One fault in the code that opens a window took out 41 of the 48 windows on the shared window controller at once.]]></description>
    </item>
    <item>
      <title>UI: The map key was the odd one out: it put a frame on screen that could not be moved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2e4bf6553bd9</guid>
      <pubDate>Tue, 28 Jul 2026 08:30:33 -0500</pubDate>
      <description><![CDATA[The map key was the odd one out: it put a frame on screen that could not be moved, resized or closed. That was the retired frame the old map used to draw, left visible because the real map window never got to open. It is hidden now, and the map opens in front of whatever is already up rather than behind it. The journal, emotes, lot deeds, titles and six other windows got the same ordering fix.]]></description>
    </item>
    <item>
      <title>UI: A new test walks every window controller in the game UI and checks it against the window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-aaaaada03abf</guid>
      <pubDate>Tue, 28 Jul 2026 08:30:42 -0500</pubDate>
      <description><![CDATA[A new test walks every window controller in the game UI and checks it against the window prefab it is wired to. The refactor that caused this passed every check it had, because all of them asked whether the code compiled and none asked whether a controller could hold the window it was pointed at. Against the old code the new test flags all 41.]]></description>
    </item>
    <item>
      <title>UI: Lined up the tracked skill advancement popups on the right of the screen. Each row was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-aaee7d070232</guid>
      <pubDate>Tue, 28 Jul 2026 09:23:27 -0500</pubDate>
      <description><![CDATA[Lined up the tracked skill advancement popups on the right of the screen. Each row was positioned from its own measured width, so a longer skill name dragged that row's icon, level line and progress bar leftward: Heightened Awareness sat about 70 pixels further left than Textiles, and the longest names ran up against their own close X. Every row is now placed from a single 190 pixel width, so the icons, names, level lines and bars each form a column, and a name too long for the column ends in an ellipsis with the full name still on the hover tooltip.]]></description>
    </item>
    <item>
      <title>UI: The Oracle, Tester and GM windows never came to the front. Clicking or dragging one did…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-7cf394c04a41</guid>
      <pubDate>Tue, 28 Jul 2026 13:54:13 -0500</pubDate>
      <description><![CDATA[The Oracle, Tester and GM windows never came to the front. Clicking or dragging one did nothing, so they stayed buried under whatever else was open. Clicking any of them now lifts it above the other windows, and opening one brings it up.]]></description>
    </item>
    <item>
      <title>UI: Zone loading screens were sometimes coming up as a grey blur, a plain black screen, or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ba3619fa5ea8</guid>
      <pubDate>Tue, 28 Jul 2026 16:31:20 -0500</pubDate>
      <description><![CDATA[Zone loading screens were sometimes coming up as a grey blur, a plain black screen, or the old title screen. Three images belonging to the title screen intro had been sitting in the folder the loading art is drawn from, and every build rebuilt that list by scanning the folder. Moved them out, so all 26 loading screens are scene paintings again.]]></description>
    </item>
    <item>
      <title>UI: The loading screen picker also skipped the last entry in its list, so one of the 26…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-935bab8b5f6f</guid>
      <pubDate>Tue, 28 Jul 2026 16:31:29 -0500</pubDate>
      <description><![CDATA[The loading screen picker also skipped the last entry in its list, so one of the 26 paintings had never been shown to anyone. It is back in the rotation, and new editor tests flag anything other than scene art landing in that folder.]]></description>
    </item>
    <item>
      <title>UI: The character sheet now comes to the front when you open it or click it. It had been…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ffdb07f48bc7</guid>
      <pubDate>Tue, 28 Jul 2026 16:44:22 -0500</pubDate>
      <description><![CDATA[The character sheet now comes to the front when you open it or click it. It had been drawing behind the backpack whichever one you opened last, because its window never took part in the ordering that decides which window sits on top.]]></description>
    </item>
    <item>
      <title>UI: Swept the same window ordering fault across the rest of the interface. 52 windows that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-a59f16a4dd71</guid>
      <pubDate>Tue, 28 Jul 2026 17:05:26 -0500</pubDate>
      <description><![CDATA[Swept the same window ordering fault across the rest of the interface. 52 windows that could never come to the front now do, including the item preview, the vendor and quest item windows, display cases, the deco palette, the jukebox, the list windows, the report forms, the help window, the leaderboard and the loot roll. The hotbar, party frames, timers, compass and the other HUD pieces stay put behind them on purpose.]]></description>
    </item>
    <item>
      <title>UI: A new editor test requires every window to state whether it takes part in the ordering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-e528153d82ec</guid>
      <pubDate>Tue, 28 Jul 2026 17:05:27 -0500</pubDate>
      <description><![CDATA[A new editor test requires every window to state whether it takes part in the ordering, rather than letting it default. The old default was silent: a window that said nothing sat behind everything with no error anywhere, which is how this shipped four separate times.]]></description>
    </item>
    <item>
      <title>UI: Closed a gap at the top of the window stacking range where a window could end up tied…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2df22349279f</guid>
      <pubDate>Tue, 28 Jul 2026 17:07:43 -0500</pubDate>
      <description><![CDATA[Closed a gap at the top of the window stacking range where a window could end up tied with the dropdown menus and one dialog that are meant to sit above it. The tie only became reachable after a very long session, and a test now fails if a new layer is ever added inside that gap.]]></description>
    </item>
    <item>
      <title>UI: Pressing the slash key with chat unfocused now leaves the cursor after the slash, so a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-b4dd92dbb241</guid>
      <pubDate>Tue, 28 Jul 2026 18:09:22 -0500</pubDate>
      <description><![CDATA[Pressing the slash key with chat unfocused now leaves the cursor after the slash, so a command can be typed straight away instead of arrowing past the character first. The same fix puts the cursor at the end of the line when chat takes focus from Enter, from Shift plus a letter, and after linking an item.]]></description>
    </item>
    <item>
      <title>UI: Windows that offer help were drawing two close buttons. The help button had been given…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-b4e9f1c8b1a1</guid>
      <pubDate>Tue, 28 Jul 2026 18:15:18 -0500</pubDate>
      <description><![CDATA[Windows that offer help were drawing two close buttons. The help button had been given the close button's style, and that style is the X artwork itself, so the button painted an X and drew its question mark on top. Clicking the left X opened help instead of closing the window. The help button has its own round question mark icon again, on the skills, book, crafting station, merchant, lot sign, bank, container and vendor windows.]]></description>
    </item>
    <item>
      <title>UI: The tavern game table, the tip jar and the theme editor now come to the front when they…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-d732b6b79890</guid>
      <pubDate>Tue, 28 Jul 2026 18:18:34 -0500</pubDate>
      <description><![CDATA[The tavern game table, the tip jar and the theme editor now come to the front when they open and when they are clicked. All three own their own interface layer and were never entered in the window ordering, so a backpack or character sheet opened earlier in the session stayed in front of them and no click could get past it.]]></description>
    </item>
    <item>
      <title>UI: The small loot window is one column of item names again, with the stack count after the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-7a794ea8495c</guid>
      <pubDate>Tue, 28 Jul 2026 18:21:34 -0500</pubDate>
      <description><![CDATA[The small loot window is one column of item names again, with the stack count after the name, the way it was before. It had been given the full inventory's five-column table, and those columns come to more than the 300 pixel window is wide, so the numbers ran off the right edge and a gold count in the millions came out as "1,23...". In the backpack, the number columns were sized against the heading font at 14 pixels while the rows draw at 16, leaving every one of them about 14 percent short; Qty and Value now hold seven digits and their commas.]]></description>
    </item>
    <item>
      <title>UI: The Nearby Players window used to stay on screen through a scene change while the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1691955e28c2</guid>
      <pubDate>Tue, 28 Jul 2026 18:23:22 -0500</pubDate>
      <description><![CDATA[The Nearby Players window used to stay on screen through a scene change while the game had already written it off as closed, which made the next press of its key do nothing and took a second press to close it. It now closes on the scene change and comes back if it was open before, so the key and the window selector both work on the first press. Arriving in a PvP scene no longer leaves it sitting behind the PvP stats window.]]></description>
    </item>
    <item>
      <title>Client: Added a checkbox under Quit on the first screen, "Use the Original Title Screen". Ticking…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-02332ef1d0ce</guid>
      <pubDate>Tue, 28 Jul 2026 06:02:53 -0500</pubDate>
      <description><![CDATA[Added a checkbox under Quit on the first screen, "Use the Original Title Screen". Ticking it brings back the old forest and logo art with Karelia's Song playing behind it, and skips the burn-away opening. The setting is saved per machine and applies as soon as you tick it, so the background and the music change without a restart.]]></description>
    </item>
    <item>
      <title>Client: The current title screen picked up its own music. It had kept playing the old theme since…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-91850ed300e2</guid>
      <pubDate>Tue, 28 Jul 2026 06:03:01 -0500</pubDate>
      <description><![CDATA[The current title screen picked up its own music. It had kept playing the old theme since the art changed, so the two screens now each have their own: Karelia's Song on the original one, a new track on the current one.]]></description>
    </item>
    <item>
      <title>Client: Models with nested levels of detail stopped fighting over which renderer they own. Unity…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-90f3ec79e6cd</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:40 -0500</pubDate>
      <description><![CDATA[Models with nested levels of detail stopped fighting over which renderer they own. Unity builds one group per node, and each group was sweeping up renderers a nested group already owned, leaving two of them arguing about visibility. The dungeon set alone produced 72 engine warnings a build.]]></description>
    </item>
    <item>
      <title>Lua Addons: The add-on manager reads five optional fields out of an add-on file to fill in its name…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-e77dd4dadd46</guid>
      <pubDate>Tue, 28 Jul 2026 07:39:13 -0500</pubDate>
      <description><![CDATA[The add-on manager reads five optional fields out of an add-on file to fill in its name, creator, version, description, and icon. Those were documented on the authoring guide page and nowhere else, so an author who opened the API reference found nothing. That page now covers them, including the exact form the manager matches and what it falls back to without them.]]></description>
    </item>
    <item>
      <title>Lua Addons: The Submit Addon window now has a Description box and a Creator name box. Both values…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2c7478ac2172</guid>
      <pubDate>Tue, 28 Jul 2026 07:39:24 -0500</pubDate>
      <description><![CDATA[The Submit Addon window now has a Description box and a Creator name box. Both values used to be taken from the add-on file without being shown, so an add-on that declared neither submitted an empty description and the store refused it with nothing the author could change. The boxes pre-fill from the add-on's own metadata when it has any, and are length-checked before the upload.]]></description>
    </item>
    <item>
      <title>Lua Addons: The add-on store capped a package's declared API version at 2 while the client had moved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-fb8785c1f929</guid>
      <pubDate>Tue, 28 Jul 2026 07:39:25 -0500</pubDate>
      <description><![CDATA[The add-on store capped a package's declared API version at 2 while the client had moved on to 4, so it would have rejected the example add-on we ship as a reference. The cap now tracks the client, and a test reads the client value and fails if the two drift apart again.]]></description>
    </item>
    <item>
      <title>Lua Addons: The example add-on declared none of the five metadata fields, so anyone who copied it as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-47b445e0f5a6</guid>
      <pubDate>Tue, 28 Jul 2026 07:39:26 -0500</pubDate>
      <description><![CDATA[The example add-on declared none of the five metadata fields, so anyone who copied it as a starting point got Unknown for the creator and version. It now demonstrates the block the docs describe.]]></description>
    </item>
    <item>
      <title>Interface: The hotbar key numbers are back where they belong. They sat in each slot's top-left…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ff1a1ed72b02</guid>
      <pubDate>Tue, 28 Jul 2026 08:02:39 -0500</pubDate>
      <description><![CDATA[The hotbar key numbers are back where they belong. They sat in each slot's top-left corner since the interface rebuild; they now centre in the small bump below the slot, inside the bracket that gives the slot its bottom edge and side ticks. The numbers carry a dark outline again, so they stay readable over pale stone and bright ground instead of washing out.]]></description>
    </item>
    <item>
      <title>Interface: Combat hand slots no longer draw a white box around all ten. The old bar's slot border…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-46308d6591cd</guid>
      <pubDate>Tue, 28 Jul 2026 08:02:53 -0500</pubDate>
      <description><![CDATA[Combat hand slots no longer draw a white box around all ten. The old bar's slot border was the number bracket itself, so the rebuilt bar was drawing a second frame the game never had. A frame now appears for a locked or lit slot, and the highlight colour reaches the bracket so a selected slot still stands out.]]></description>
    </item>
    <item>
      <title>Interface: The hotbar has a handle again. The middle of each row carries a grip with a four-way…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-95fe4f25501d</guid>
      <pubDate>Tue, 28 Jul 2026 08:03:01 -0500</pubDate>
      <description><![CDATA[The hotbar has a handle again. The middle of each row carries a grip with a four-way arrow on it, replacing the old shovel-shaped one, and the cursor changes to the movement arrows while you hover it. Before this the bar could only be dragged by whatever bare edge you could find around the slots.]]></description>
    </item>
    <item>
      <title>Interface: The on-screen task list answers the mouse again. Hovering a task or the N Tasks in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-5d3f429e0412</guid>
      <pubDate>Tue, 28 Jul 2026 08:10:29 -0500</pubDate>
      <description><![CDATA[The on-screen task list answers the mouse again. Hovering a task or the <b>N Tasks in Journal</b> line brightens it, holding dims it, and letting go opens the Journal. The clickable area is a wide band rather than just the letters, the way it was before the interface rebuild.]]></description>
    </item>
    <item>
      <title>Interface: A click on a task is now a completed press instead of firing the instant the button goes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1b85d6c95b6c</guid>
      <pubDate>Tue, 28 Jul 2026 08:10:37 -0500</pubDate>
      <description><![CDATA[A click on a task is now a completed press instead of firing the instant the button goes down, so pressing a task and dragging away cancels it. The task list also stopped swallowing clicks aimed at the world: only the task lines themselves take a click, not the gaps between them.]]></description>
    </item>
    <item>
      <title>Interface: A source file the hotbar key number fix relied on had missed its commit and is now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-657dcf16ba27</guid>
      <pubDate>Tue, 28 Jul 2026 10:10:45 -0500</pubDate>
      <description><![CDATA[A source file the hotbar key number fix relied on had missed its commit and is now included, so the next build carries the complete fix.]]></description>
    </item>
    <item>
      <title>Interface: The carried weight readout now shows when you are over your limit. Past your carry…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-83c00d6be68e</guid>
      <pubDate>Tue, 28 Jul 2026 13:54:53 -0500</pubDate>
      <description><![CDATA[The carried weight readout now shows when you are over your limit. Past your carry capacity the carried number turns yellow, and past twice your capacity it turns red. The capacity after the slash keeps its normal colour. The paper doll, the character sheet and the backpack footer all read from the same rule, so they cannot disagree.]]></description>
    </item>
    <item>
      <title>Interface: The encumbered warning in the top-right corner has its picture back. The conversion to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-56f522fb5eb9</guid>
      <pubDate>Tue, 28 Jul 2026 13:55:02 -0500</pubDate>
      <description><![CDATA[The encumbered warning in the top-right corner has its picture back. The conversion to the new interface had recorded it as a text-only warning and swept away the symbol the exclamation mark was laid over, leaving a bare mark in the corner. Its hover text, which names your weight and whether you are too loaded to move, works again too.]]></description>
    </item>
    <item>
      <title>Interface: Fixed an error the encumbered icon threw once a frame for as long as you stayed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-0b124e186235</guid>
      <pubDate>Tue, 28 Jul 2026 15:48:24 -0500</pubDate>
      <description><![CDATA[Fixed an error the encumbered icon threw once a frame for as long as you stayed overweight. The countdown ring it drew on was removed during the interface conversion while the code that drew it stayed behind.]]></description>
    </item>
    <item>
      <title>Interface: Movable windows and bars can no longer be dragged off the edge of the screen, or stranded…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-0fb77490b771</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:26 -0500</pubDate>
      <description><![CDATA[Movable windows and bars can no longer be dragged off the edge of the screen, or stranded off it. Dropping your resolution or raising the UI scale used to leave a window outside the visible area with no way to grab it; windows are now pulled back inside, and your chosen spot returns when the screen grows again. Covers the party list, timers, compass, emote bar, tip jar, table games, the theme editor and the GM window plates.]]></description>
    </item>
    <item>
      <title>Interface: Inventory column headings stopped being cut off. The first letter of the name column was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-81ab73581fc6</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:27 -0500</pubDate>
      <description><![CDATA[Inventory column headings stopped being cut off. The first letter of the name column was hidden behind a button frame, so "Item Name" read as though it began with a bar, and the columns were narrower than their own headings; a durability of 120/150 showed as 120/1 followed by dots. Quantity and Durability now abbreviate with the full word on hover.]]></description>
    </item>
    <item>
      <title>Interface: Empty equipment slot labels on the paper doll stopped splitting down the middle. Label…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-f3619db07171</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:27 -0500</pubDate>
      <description><![CDATA[Empty equipment slot labels on the paper doll stopped splitting down the middle. Label margins were eating 9 of the slot's 44 pixels, leaving Necklace one pixel short and wrapping it as "Necklac" and "e". Every slot name now fits on one line except Instrument, which shortens with the full word on hover.]]></description>
    </item>
    <item>
      <title>Interface: The mouse cursor could be left on screen after closing every window. Some windows route…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-119171ddf1a3</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:39 -0500</pubDate>
      <description><![CDATA[The mouse cursor could be left on screen after closing every window. Some windows route an open or close through their own handling first, and the window system was reading that as a failure and popping a cursor level that had never been pushed. Repeated chat toggles were the usual way to hit it.]]></description>
    </item>
    <item>
      <title>Interface: The inventory category buttons now start folded away. Nineteen of them wrap onto five…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-360c48e400b6</guid>
      <pubDate>Tue, 28 Jul 2026 17:35:59 -0500</pubDate>
      <description><![CDATA[The inventory category buttons now start folded away. Nineteen of them wrap onto five rows at the window's narrowest, taking about 148 pixels of the window before the item list gets any. In their place is one row reading "Filter: " and whichever category is active, and clicking it unfolds the buttons. The row keeps naming the active category while folded, so a window left filtered still says why its list is short. Folded or open is remembered per window, so your backpack, the bank and a container each keep their own.]]></description>
    </item>
    <item>
      <title>Interface: Text on the Air theme is readable again. Colours the game bakes into its own strings…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-8ded91b61efe</guid>
      <pubDate>Tue, 28 Jul 2026 18:10:27 -0500</pubDate>
      <description><![CDATA[Text on the <strong>Air</strong> theme is readable again. Colours the game bakes into its own strings, such as the grey behind every character sheet stat line, were sitting at 1.5:1 against a near-white panel; they are now pushed to at least 4.5:1 on their way to the screen, with their hue preserved.]]></description>
    </item>
    <item>
      <title>Interface: The change sits at the single point where a game colour becomes screen text, so every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-a32bb0ebfa83</guid>
      <pubDate>Tue, 28 Jul 2026 18:10:28 -0500</pubDate>
      <description><![CDATA[The change sits at the single point where a game colour becomes screen text, so every converted window picked it up at once: the character sheet, item and skill tooltips, lists and chat. Text drawn straight over the world, such as floating damage numbers, the compass and the hotbar, keeps the colour the game authored.]]></description>
    </item>
    <item>
      <title>Interface: Air panel fills dropped from 0.93 alpha to 0.40, and its tooltips from 0.98 to 0.40. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-5f6dd112f65a</guid>
      <pubDate>Tue, 28 Jul 2026 18:10:28 -0500</pubDate>
      <description><![CDATA[<strong>Air</strong> panel fills dropped from 0.93 alpha to 0.40, and its tooltips from 0.98 to 0.40. The light theme now shows the scene through it.]]></description>
    </item>
    <item>
      <title>Interface: The character and pet sheets stopped repainting their stat lines grey. On the four dark…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-00bbe2136c77</guid>
      <pubDate>Tue, 28 Jul 2026 18:10:28 -0500</pubDate>
      <description><![CDATA[The character and pet sheets stopped repainting their stat lines grey. On the four dark themes the result is identical to before; on the light one the lines take the theme's own ink.]]></description>
    </item>
    <item>
      <title>Interface: Item tooltips came back to every list window. The backpack, containers, the bank, loot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-afe1e90c1e4f</guid>
      <pubDate>Tue, 28 Jul 2026 19:09:05 -0500</pubDate>
      <description><![CDATA[Item tooltips came back to every list window. The backpack, containers, the bank, loot, merchant and vendor windows, trade, the crafting station panes, mail attachments, the deco palette and the jukebox all stopped answering a hover a day earlier, when the converted windows stopped building the old widgets underneath them. The tooltip had been arriving from those hidden widgets the whole time, so the replacement rows had never carried one of their own. Each window now asks its own list for the tooltip, so a merchant listing keeps its price lines and a trophy fish keeps who caught it, where, when and how long it was.]]></description>
    </item>
    <item>
      <title>Interface: Double-click and right-click work again on the mail list, the deck builder lists and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-5a8770e06593</guid>
      <pubDate>Tue, 28 Jul 2026 19:09:12 -0500</pubDate>
      <description><![CDATA[Double-click and right-click work again on the mail list, the deck builder lists and the book list. Those rows are pooled and reused as you scroll, and the tooltip they were given had been stored in the same slot the list keeps each row's identity in, so every row answered the click handler with nothing.]]></description>
    </item>
    <item>
      <title>Crafting: A reported empty ingredient slot in the Garlic Cheese Bread recipe was not empty. A…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-039b428bed96</guid>
      <pubDate>Tue, 28 Jul 2026 08:21:30 -0500</pubDate>
      <description><![CDATA[A reported empty ingredient slot in the Garlic Cheese Bread recipe was not empty. A recipe slot can name a specific item, a whole class of items ("any cheese"), or an item the player supplies at the table, and the report had only looked at the first of the three. A sweep of all 3,283 recipes found no genuinely unassigned slot anywhere in the game.]]></description>
    </item>
    <item>
      <title>Crafting: The crafting reference tables carried the wrong name for two transaction types, labelling…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4b45fa8e0538</guid>
      <pubDate>Tue, 28 Jul 2026 08:21:40 -0500</pubDate>
      <description><![CDATA[The crafting reference tables carried the wrong name for two transaction types, labelling 201 rows "Animal Process" or "Reshape" where the game calls them Special and Apply Pattern. Repair, salvage, planting and book-copying recipes printed their main input as "?" and now name it: Worn Item, Salvageable Item, Seed, Published Book. The tables also picked up a month of crafting content that had landed since they were last built.]]></description>
    </item>
    <item>
      <title>Crafting: The catalog builder now fails if a recipe slot really is unassigned, sets both a specific…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4c24cb4e742a</guid>
      <pubDate>Tue, 28 Jul 2026 08:21:41 -0500</pubDate>
      <description><![CDATA[The catalog builder now fails if a recipe slot really is unassigned, sets both a specific item and a category, or uses an unknown slot type. The first run of that check found one: a pet collar recipe listing both a Yard of Leather and a leather-roll category in the same slot. The game was already using the leather, so the leftover category was removed.]]></description>
    </item>
    <item>
      <title>Crafting: Repairing an item with a gathering skill selected wrote an error to the server log…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-a7f08724cbf2</guid>
      <pubDate>Tue, 28 Jul 2026 10:58:59 -0500</pubDate>
      <description><![CDATA[Repairing an item with a gathering skill selected wrote an error to the server log instead of simply answering no. Any client could trigger it, so the log filled with entries that were not faults.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Started on patch notes for the launcher. Every build now records which code it was built…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-238945d6d6ef</guid>
      <pubDate>Tue, 28 Jul 2026 10:41:05 -0500</pubDate>
      <description><![CDATA[Started on patch notes for the launcher. Every build now records which code it was built from, and that record survives the patch server cleanup that used to erase it within a few days. From two build numbers we can now work out exactly what changed between them.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: The notes are assembled from the work log entries written alongside each change, filtered…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2c97cea46a5c</guid>
      <pubDate>Tue, 28 Jul 2026 10:41:06 -0500</pubDate>
      <description><![CDATA[The notes are assembled from the work log entries written alongside each change, filtered down to what a player can actually see. Development, build and infrastructure work is dropped. A separate check refuses to publish a line carrying an address, a credential or an internal detail, and reports only which rule caught it so the offending text is never reprinted.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Put the patch notes on a page of its own at the site, open to anyone with no login. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-8bb4a3a57c98</guid>
      <pubDate>Tue, 28 Jul 2026 10:55:11 -0500</pubDate>
      <description><![CDATA[Put the patch notes on a page of its own at the site, open to anyone with no login. It takes the build you have and the build you are moving to, and lists what changed between them, newest build first and grouped by area. Builds that shipped the same game content as an earlier one say so instead of showing an empty list.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: The page reads the whole common case in two requests, so opening it from the launcher…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-0b59a3159cc9</guid>
      <pubDate>Tue, 28 Jul 2026 10:55:12 -0500</pubDate>
      <description><![CDATA[The page reads the whole common case in two requests, so opening it from the launcher will not stall on a slow connection. Wider spans load the rest in small batches, and anything past forty builds waits behind a button.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: The launcher now offers a "See what changed" link next to Play. It opens the patch notes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-87bad605e993</guid>
      <pubDate>Tue, 28 Jul 2026 11:15:14 -0500</pubDate>
      <description><![CDATA[The launcher now offers a "See what changed" link next to Play. It opens the patch notes for the version you had and the version you just moved to, so you get the changes since your last build rather than the whole list. It is written and tested but not yet in a released launcher.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: The link carries only two build numbers and nothing about you or your machine. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-44cca233232d</guid>
      <pubDate>Tue, 28 Jul 2026 11:15:15 -0500</pubDate>
      <description><![CDATA[The link carries only two build numbers and nothing about you or your machine. The launcher hands the address to your browser and reads nothing back, so it stays as locked down as the rest of the patching path.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: The launcher now opens the patch notes for you when an update finishes, showing what…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2fb4e836b8eb</guid>
      <pubDate>Tue, 28 Jul 2026 11:31:35 -0500</pubDate>
      <description><![CDATA[The launcher now opens the patch notes for you when an update finishes, showing what changed between the build you had and the one you just got. It only does this when a patch actually installed something, so a fresh install, a repair or simply reopening the launcher leaves it alone, and it happens once per session rather than every time.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: A checkbox next to the link turns it off, and it sits right beside the notes so you can…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-64245caeedf0</guid>
      <pubDate>Tue, 28 Jul 2026 11:31:36 -0500</pubDate>
      <description><![CDATA[A checkbox next to the link turns it off, and it sits right beside the notes so you can switch it off the moment it first appears. The link stays either way. The launcher hands the address to your browser and reads nothing back.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Launcher build 23 is out on Windows and Linux. Start the launcher and it updates itself…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4c1b0566a4c1</guid>
      <pubDate>Tue, 28 Jul 2026 11:42:44 -0500</pubDate>
      <description><![CDATA[Launcher build 23 is out on Windows and Linux. Start the launcher and it updates itself, then shows you the patch notes when a game update finishes. The Windows build is signed as before.]]></description>
    </item>
    <item>
      <title>Images: Patch notes, builds 66 through 69</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-c204a1a63306</guid>
      <pubDate>Tue, 28 Jul 2026 10:55:19 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/patch-notes-page-2026-07-28.png" data-full="https://catnipgames.net/blog/images/patch-notes-page-2026-07-28.png" data-cap="The patch notes page showing the span between two builds. Builds 68 and 69 shipped the same game content as build 67, so they say so rather than showing an empty list." alt="Patch notes page listing builds 69, 68 and 67 with their changes" loading="lazy"><span class="cap">Patch notes, builds 66 through 69</span></div>]]></description>
    </item>
    <item>
      <title>Images: Shores of Malice, before and after The sunken castle, before and after</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ef2f5722a7b9</guid>
      <pubDate>Tue, 28 Jul 2026 17:47:51 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/shores-of-malice-map-water-before-after.png" data-full="https://catnipgames.net/blog/images/shores-of-malice-map-water-before-after.png" data-cap="The Shores of Malice zone map before and after the redraw. The sea had been drawn as the ground beneath it, taking a quarter of the image with it, and the coastline had nothing to mark it." alt="Two versions of the Shores of Malice map side by side, the first showing brown seabed where the sea should be, the second showing open water and a coastline" loading="lazy"><span class="cap">Shores of Malice, before and after</span><img src="https://catnipgames.net/blog/images/east-vauban-sunk-castle-before-after.png" data-full="https://catnipgames.net/blog/images/east-vauban-sunk-castle-before-after.png" data-cap="The castle under the East Vauban Foothills lake. At the old tint a fifth of the lakebed came through and the battlements were legible; at the new one it reads as something under the water." alt="Two crops of the East Vauban lake side by side, the first showing a clearly outlined sunken castle, the second showing only a faint shape" loading="lazy"><span class="cap">The sunken castle, before and after</span></div>]]></description>
    </item>
    <item>
      <title>Images: The inventory category filter, folded and open. Folded is the default and it names…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4b92d68a4fb4</guid>
      <pubDate>Tue, 28 Jul 2026 17:54:41 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/backpack-category-filter-folded.png" data-full="https://catnipgames.net/blog/images/backpack-category-filter-folded.png" alt="Backpack window with the category filter folded: one row reading Filter: All Items above the search box, and nine item rows visible"><img src="https://catnipgames.net/blog/images/backpack-category-filter-open.png" data-full="https://catnipgames.net/blog/images/backpack-category-filter-open.png" alt="The same backpack with the filter row clicked open, showing all nineteen category tabs wrapped across five rows"></div>The inventory category filter, folded and open. Folded is the default and it names whatever category is active, so a window left on Equipment still says why its list is short.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-28</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-images</guid>
      <pubDate>Tue, 28 Jul 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/patch-notes-page-2026-07-28.png" data-full="https://catnipgames.net/blog/images/patch-notes-page-2026-07-28.png" data-cap="The patch notes page showing the span between two builds. Builds 68 and 69 shipped the same game content as build 67, so they say so rather than showing an empty list." alt="Patch notes page listing builds 69, 68 and 67 with their changes" loading="lazy"><span class="cap">Patch notes, builds 66 through 69</span></div>]]></description>
    </item>
    <item>
      <title>Build &amp; Release: The Linux client build failed twice on a branch that did not compile. Two interface fixes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1e3b0cff6cb6</guid>
      <pubDate>Tue, 28 Jul 2026 11:04:19 -0500</pubDate>
      <description><![CDATA[The Linux client build failed twice on a branch that did not compile. Two interface fixes landed calls to three new text-measurement helpers without the file that defines them, so a fresh checkout stopped at three compile errors that a local build never sees, because the local copy of that file was sitting there unsaved to the branch. Committed the missing file and the test that re-derives its numbers from the font file, and both game assemblies build again with no errors. The Windows build was cancelled the moment the Linux one failed, which made this look like a platform problem rather than a branch that would not compile anywhere.]]></description>
    </item>
    <item>
      <title>Tools: Added a commit-time check for the mistake behind that build failure. It compares the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1e367b71729c</guid>
      <pubDate>Tue, 28 Jul 2026 11:04:29 -0500</pubDate>
      <description><![CDATA[Added a commit-time check for the mistake behind that build failure. It compares the files going into a commit against the game sources still sitting uncommitted, and refuses the commit when something being committed calls a type or member that exists only in the local copy, naming the file to add and every call site that needs it. It catches both of the day's misses. Run across the 32 uncommitted sources in the tree it flagged three, all of them real, and nothing false.]]></description>
    </item>
    <item>
      <title>Rendering: Outdoor shadow edges no longer shimmer in daylight. The sun was re-aimed every frame…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-d3113cd8e10d</guid>
      <pubDate>Tue, 28 Jul 2026 12:17:55 -0500</pubDate>
      <description><![CDATA[Outdoor shadow edges no longer shimmer in daylight. The sun was re-aimed every frame, moving under 0.003 degrees each time, too little to read as motion but enough to shift the shadow map and set every shadow edge crawling. It now updates every 2 seconds while the sun is high, easing back to every frame near sunrise and sunset where shadows are long enough for a step to show.]]></description>
    </item>
    <item>
      <title>Rendering: Names floating over characters no longer draw through walls, terrain and buildings…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-aa27b7fc995f</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:24 -0500</pubDate>
      <description><![CDATA[Names floating over characters no longer draw through walls, terrain and buildings. World-space text sits on a layer the main camera does not render, so there was no depth information for it to test against; it now compares itself against the scene depth per pixel, which means a character half behind a doorframe shows only the visible part of their name.]]></description>
    </item>
    <item>
      <title>Combat: Damage-over-time tooltips read other players' stacks at about a tenth of their real…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-98dd4107cfe4</guid>
      <pubDate>Tue, 28 Jul 2026 12:48:07 -0500</pubDate>
      <description><![CDATA[Damage-over-time tooltips read other players' stacks at about a tenth of their real value. Two players rending one target each saw their own line as 0-21 damage per second and the other player's as 0-2. Every client rebuilds another player's effect from what it knows about them, and trained skill levels are the one input that never crosses the wire, so the shared calculation fell back to a level-1 floor. The tooltip now uses the skill level that travels with the effect. The damage actually dealt was never affected, and durations always read correctly. Reported on the forums in 2021.]]></description>
    </item>
    <item>
      <title>Combat: A skill's stack limit still belongs to the target rather than to each attacker. Rend…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-dc97885596b9</guid>
      <pubDate>Tue, 28 Jul 2026 13:36:39 -0500</pubDate>
      <description><![CDATA[A skill's stack limit still belongs to the target rather than to each attacker. Rend allows three bleeds on a target, and that count is shared by everyone attacking it, so a fourth application replaces one that is already there. A change that gave each attacker their own set of three was tried earlier in the day and taken back out before it reached a build: it multiplied what a group does with damage over time by the number of attackers, and it would have done the same for creature packs attacking a player. The complaint behind it was fair, though. A player whose stack was replaced had no way to see it happen, so effect tooltips now name who applied each stack.]]></description>
    </item>
    <item>
      <title>Combat: Effect tooltips now say who applied each effect. A target can carry stacks from more than…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-d20c88b70122</guid>
      <pubDate>Tue, 28 Jul 2026 13:55:03 -0500</pubDate>
      <description><![CDATA[Effect tooltips now say who applied each effect. A target can carry stacks from more than one attacker, each with its own damage numbers and its own countdown, and the icon merged them into a list of lines that all looked alike. The tooltip now groups them under a heading per attacker, with your own listed first as "You". This is a display change only. How many stacks a skill can hold on a target, which application replaces which, and how much each one hits for all follow the same rules they always have. Effects a creature puts on you name the creature the same way, and an effect from someone who has since left the scene still reads the way it used to.]]></description>
    </item>
    <item>
      <title>Combat: Undead summons now gain health from their summoner's Death Mastery. The health granted to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-9436d874d8e2</guid>
      <pubDate>Tue, 28 Jul 2026 17:35:59 -0500</pubDate>
      <description><![CDATA[Undead summons now gain health from their summoner's Death Mastery. The health granted to Skeleton Fighter, Skeleton Mage and Lich Fighter read Death Mastery off the summon instead of the summoner, and a summoned skeleton has none of its own, so the whole term came out as zero. Their damage was already reading it from the summoner, so health and damage now scale the same way. At 80 in Undead Mastery and Death Mastery the bonus health goes from 200 to 333, and at 100 in both from 250 to 562.]]></description>
    </item>
    <item>
      <title>Combat: A test now pins the summoner-versus-summon rule across every summoned and tamed creature…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-af77d08fd054</guid>
      <pubDate>Tue, 28 Jul 2026 17:36:00 -0500</pubDate>
      <description><![CDATA[A test now pins the summoner-versus-summon rule across every summoned and tamed creature package. The two forms both push a number, so reading the wrong one gives zero rather than an error, which is how this sat unnoticed.]]></description>
    </item>
    <item>
      <title>Combat: The Deck Editor draws its glyph icons at the size they were authored at again, and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-c3a6becd2cf7</guid>
      <pubDate>Tue, 28 Jul 2026 18:40:44 -0500</pubDate>
      <description><![CDATA[The Deck Editor draws its glyph icons at the size they were authored at again, and the Combos tab shows the two source glyphs each combo is built from. The list code the window shares had been dropping every column a screen authored as a picture, on the assumption a row has exactly one icon; a combo row has three, so the combo icon shrank from 64 pixels to 16 and both source glyphs were not drawn at all, leaving a colon and a plus with nothing between them. A source glyph you have not learned is greyed out again, and hovering one shows that glyph rather than the combo. Deck list and glyph browser icons go back from 16 to 32, the hand slots along the top from 48 to 64, and mail attachment icons from 16 to 24.]]></description>
    </item>
    <item>
      <title>Hotbar: The key number under each combat glyph is readable again. Every slot hangs its number…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-f473e97ebd64</guid>
      <pubDate>Tue, 28 Jul 2026 13:53:11 -0500</pubDate>
      <description><![CDATA[The key number under each combat glyph is readable again. Every slot hangs its number bracket 13 pixels below itself, the two rows sat 8 pixels apart, so the utility row covered the digits and only the one or two past its right-hand end showed. Each row now reserves its own bracket drop.]]></description>
    </item>
    <item>
      <title>Hotbar: The move handles in the middle of the two rows line up. The deck-swap slot rode on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-304e9077914c</guid>
      <pubDate>Tue, 28 Jul 2026 13:53:19 -0500</pubDate>
      <description><![CDATA[The move handles in the middle of the two rows line up. The deck-swap slot rode on the end of the combat row and its 60 pixels made that row the wider of the two, offsetting it inside the centred bar and putting its handle 30 pixels left of the other.]]></description>
    </item>
    <item>
      <title>Hotbar: The swap deck button moved to the bottom right corner of the screen, with the equipped…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-9ab056c5df23</guid>
      <pubDate>Tue, 28 Jul 2026 13:53:26 -0500</pubDate>
      <description><![CDATA[The swap deck button moved to the bottom right corner of the screen, with the equipped and alternate deck names above it, and it now only appears when you have an alternate deck set. It used to sit on the end of the combat bar whether or not there was a deck to swap to.]]></description>
    </item>
    <item>
      <title>Login: The "Connecting..." and login queue message was drawing behind the username panel, so you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-0cbb9d02ba2c</guid>
      <pubDate>Tue, 28 Jul 2026 13:54:03 -0500</pubDate>
      <description><![CDATA[The "Connecting..." and login queue message was drawing behind the username panel, so you could barely read it and its Cancel button could not be clicked at all. It now sits on top of the panel with a labelled Cancel that takes you back to the login screen.]]></description>
    </item>
    <item>
      <title>Login: Login status text was hidden behind the same panel. The reason a login failed, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4839703393b8</guid>
      <pubDate>Tue, 28 Jul 2026 13:54:04 -0500</pubDate>
      <description><![CDATA[Login status text was hidden behind the same panel. The reason a login failed, the welcome line and the news of the day now show on the panel itself.]]></description>
    </item>
    <item>
      <title>Oracle: The in-game Oracle now has a second AI service to fall back on. The one behind it sheds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-49d3acb944c3</guid>
      <pubDate>Tue, 28 Jul 2026 13:58:14 -0500</pubDate>
      <description><![CDATA[The in-game Oracle now has a second AI service to fall back on. The one behind it sheds load when traffic is heavy, and until now that ended the question outright: the answer never arrived, and the Oracle window printed the raw technical error it got back. Questions now move to the backup service and get answered.]]></description>
    </item>
    <item>
      <title>Oracle: When every service really is unreachable, the Oracle now says so in one plain sentence…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-23f3b38b3165</guid>
      <pubDate>Tue, 28 Jul 2026 13:58:24 -0500</pubDate>
      <description><![CDATA[When every service really is unreachable, the Oracle now says so in one plain sentence and invites you to try again. The technical detail goes to the server log where we can read it, instead of into the chat window.]]></description>
    </item>
    <item>
      <title>Oracle: Three other tools that use the same AI, the character viewer helper, the NPC dialogue…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-75b4f5b018d8</guid>
      <pubDate>Tue, 28 Jul 2026 13:58:24 -0500</pubDate>
      <description><![CDATA[Three other tools that use the same AI, the character viewer helper, the NPC dialogue service and the wiki assistant, were each running their own copy of the old single-service code. All three moved onto the shared fallback in the same pass.]]></description>
    </item>
    <item>
      <title>Oracle: Rewrote the Oracle's What's New guide, which still described the week of July 14, to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-5f85988a361f</guid>
      <pubDate>Tue, 28 Jul 2026 20:56:03 -0500</pubDate>
      <description><![CDATA[Rewrote the Oracle's What's New guide, which still described the week of July 14, to cover the full two weeks through July 28: the interface themes and Theme Editor, decoration undo and redo with grid snap, the Terrain Leveller, dragon totems, the Obsidian Forge recipes, crafting from lot storage, Search All My Stuff, the community addon store, the Frost and Shock enchants, vendor stat search, the patch notes page, the Mac and Linux clients, and the period's bug-fix sweeps grouped by area. Deployed to the live Oracle service, so asking it what changed lately gets a current answer.]]></description>
    </item>
    <item>
      <title>Audio: Two fire spell cues were still decoding on first play and landing behind their animation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-6c81d0b50956</guid>
      <pubDate>Tue, 28 Jul 2026 16:02:41 -0500</pubDate>
      <description><![CDATA[Two fire spell cues were still decoding on first play and landing behind their animation. They now preload with the rest of the gameplay set, which the earlier sweep had missed.]]></description>
    </item>
    <item>
      <title>Inventory: Take All now empties the container you are looking at. With two or more containers open…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-d0c9117add22</guid>
      <pubDate>Tue, 28 Jul 2026 17:06:58 -0500</pubDate>
      <description><![CDATA[Take All now empties the container you are looking at. With two or more containers open it took from whichever one you opened first, because every converted window reported the same position in the stacking order and the code picking the front one could not tell them apart.]]></description>
    </item>
    <item>
      <title>Testing: The tester panel got a time of day section. An hour slider, a Set Time button, a HOLD…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-9c51f9266921</guid>
      <pubDate>Tue, 28 Jul 2026 17:35:59 -0500</pubDate>
      <description><![CDATA[The tester panel got a time of day section. An hour slider, a Set Time button, a HOLD toggle and a Reset button, plus a live readout of the current New Britannia time. It moves the sky for everyone in the scene instance, which the panel says on its status line, and the same controls are on the browser companion page. Testers can reach night and dawn content without waiting for it.]]></description>
    </item>
    <item>
      <title>Testing: HOLD now holds. The old freeze only stopped the scene from overwriting the hour you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-dd4a78a015e2</guid>
      <pubDate>Tue, 28 Jul 2026 17:36:00 -0500</pubDate>
      <description><![CDATA[HOLD now holds. The old freeze only stopped the scene from overwriting the hour you picked, so the sky kept drifting forward at about one game hour every two and a half real minutes. The held hour is now the answer everything gets when it asks for the time, so the sky, daytime checks, creature schedules and the addon time API all stay put. The in-game date still rolls over underneath.]]></description>
    </item>
    <item>
      <title>Testing: Swept every open task and bug on the tester tracker and read the comment threads rather…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-ff4cb2042cc6</guid>
      <pubDate>Tue, 28 Jul 2026 21:28:18 -0500</pubDate>
      <description><![CDATA[Swept every open task and bug on the tester tracker and read the comment threads rather than pattern-matching them. Thirteen tasks testers had already passed in plain prose were still sitting open, because the automatic closer only recognises the structured verdict the in-game window writes; those are closed. Twenty-nine carried an unanswered failure report and were still marked Ready to test, which sends people back through work they had already done and written up; those went back to Feedback with a reply naming what was taken from the report.]]></description>
    </item>
    <item>
      <title>Testing: Forty-three verify tasks were live on chaos but had never left New, so they were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1f92d743617c</guid>
      <pubDate>Tue, 28 Jul 2026 21:28:19 -0500</pubDate>
      <description><![CDATA[Forty-three verify tasks were live on chaos but had never left New, so they were invisible on the in-game board. The at-deploy sweep only moves a task whose body still says it is waiting on a build, so anything filed after its build went out stayed New forever. Also resolved the last three tasks the sweep could not place, added their carrying commits to the lookup it reads, and answered ten tester bug reports that had gone unacknowledged.]]></description>
    </item>
    <item>
      <title>Decorations: Words spelled out in the sky over a player town lost letters at a distance, and which…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-93c8663b8412</guid>
      <pubDate>Tue, 28 Jul 2026 17:29:55 -0500</pubDate>
      <description><![CDATA[Words spelled out in the sky over a player town lost letters at a distance, and which letters were missing changed as you walked. Town decorations stop drawing past a distance picked from their size, and the ice blocks the letters are built from measure 0.87 across the diagonal against a 0.75 threshold, so blocks that look identical were hiding at 75 metres and at 40 metres. A decoration sitting at least 15 metres above its lot now uses the 200 metre draw distance a building gets, so a sign holds together.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Decoration placement now says why it refused. The validator has always computed a precise…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-337c9d61353f</guid>
      <pubDate>Tue, 28 Jul 2026 18:03:01 -0500</pubDate>
      <description><![CDATA[Decoration placement now says why it refused. The validator has always computed a precise reason for every refusal, but the text only existed in developer builds, so players got a red preview and a guess. Every refusal branch now carries a player-facing line, and the one that actually explains the refusal is the one shown. Asked for as <a href="https://catnipgames.net/blog/proposals/decorating/#s1">D1 on the decorating proposals page</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Placement limits name themselves. Hitting a cap used to fail with nothing to read; the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-8d8899400513</guid>
      <pubDate>Tue, 28 Jul 2026 18:03:02 -0500</pubDate>
      <description><![CDATA[Placement limits name themselves. Hitting a cap used to fail with nothing to read; the line now reads like <em>Interior object limit reached: 1000 of 1000</em>, naming the allowance and both numbers. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s1">D1</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Multi-part decorations answer the transform keys. Flip, scale and roll have always been…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-9b379c24149a</guid>
      <pubDate>Tue, 28 Jul 2026 18:03:03 -0500</pubDate>
      <description><![CDATA[Multi-part decorations answer the transform keys. Flip, scale and roll have always been refused on decorations built from several pieces, silently, so the keys looked broken. They now say so. The scale keys also say when an item is already at its smallest or largest size, and items flagged as unrotatable say that too. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s1">D1</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Added a test that fails any future placement rule shipping without a reason, so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1810d047e00e</guid>
      <pubDate>Tue, 28 Jul 2026 18:03:04 -0500</pubDate>
      <description><![CDATA[Added a test that fails any future placement rule shipping without a reason, so the mute-refusal class does not come back. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s1">D1</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Decoration tooltips now name who placed the item and who moved it last, with the time…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-02d804b04e85</guid>
      <pubDate>Tue, 28 Jul 2026 18:33:05 -0500</pubDate>
      <description><![CDATA[Decoration tooltips now name who placed the item and who moved it last, with the time read back as "3h ago" for a recent move and a date for an older one. Both lines existed before and were thrown away whenever the name had not come back from the server yet, which on a first visit to a lot was every time; the names are now asked for as the cursor reaches the item, and the line says what it knows while a name is still on its way. Asked for as <a href="https://catnipgames.net/blog/proposals/decorating/#s5">D5 on the decorating proposals page</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: The decoration list gained a Placed By column beside Location, shown to the same people…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-94e73e5ec208</guid>
      <pubDate>Tue, 28 Jul 2026 18:33:15 -0500</pubDate>
      <description><![CDATA[The decoration list gained a Placed By column beside Location, shown to the same people who can already see where an item sits. The Decoration Placement Settings window now says who each access level admits under the dropdown that picks it, and holding Ctrl over a decoration adds a line naming who its level lets move or remove it. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s5">D5</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Decorating gained undo and redo for moves. Ctrl+Z returns a moved or stowed decoration to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-91600b7015c4</guid>
      <pubDate>Tue, 28 Jul 2026 19:23:31 -0500</pubDate>
      <description><![CDATA[Decorating gained undo and redo for moves. Ctrl+Z returns a moved or stowed decoration to exactly where it stood, rotation, scale and parent surface included; Ctrl+Y re-applies it. The history keeps 50 steps and replays each one as an ordinary move through the same update path the drag uses. Asked for as <a href="https://catnipgames.net/blog/proposals/decorating/#s8">D8 on the decorating proposals page</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Undo on a shared lot follows an honesty rule: the moment another decorator changes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-1d10c64cd347</guid>
      <pubDate>Tue, 28 Jul 2026 19:23:31 -0500</pubDate>
      <description><![CDATA[Undo on a shared lot follows an honesty rule: the moment another decorator changes anything, the history clears with an on-screen message rather than mixing two people's changes. A replay that cannot apply exactly also clears instead of half-applying, and only an item's transform is ever restored, so a permission change made in between is never reverted. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s8">D8</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: The undo engine shipped as a separate tested core before any key was bound: stack…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-a8bad66580e9</guid>
      <pubDate>Tue, 28 Jul 2026 19:23:31 -0500</pubDate>
      <description><![CDATA[The undo engine shipped as a separate tested core before any key was bound: stack semantics, redo, id remapping and the transform-only restore each carry EditMode coverage, plus a ratchet that keeps Ctrl+Z collision-free among the default keybinds. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s8">D8</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Picking a decoration up into a container is undoable too. Ctrl+Z puts the same item back…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-2bd3c8c08a7b</guid>
      <pubDate>Tue, 28 Jul 2026 19:33:46 -0500</pubDate>
      <description><![CDATA[Picking a decoration up into a container is undoable too. Ctrl+Z puts the same item back with its exact spot, rotation, scale and parent, and Ctrl+Y removes it again to the container it went to. Pick-ups that merge into a stack, and removals of items carrying other decorations, stay outside the history on purpose. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s8">D8</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Town governors and stewards get a Terrain Leveller , in three sizes: 8x8, 16x16 and 32x32…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-eaf2bbbdb1a9</guid>
      <pubDate>Tue, 28 Jul 2026 19:45:32 -0500</pubDate>
      <description><![CDATA[Town governors and stewards get a <b>Terrain Leveller</b>, in three sizes: 8x8, 16x16 and 32x32 meters. Drop one and the ground across its square levels to the height of the marker, with the grass and trees inside the square cleared. It is meant for the plazas, markets and event grounds a town needs where the land does not cooperate. Asked for as <a href="https://catnipgames.net/blog/proposals/decorating/#s26">D26 on the decorating proposals page</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Lot markers and houses have levelled the ground under themselves since 25 July. This is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-67b81ecb29e5</guid>
      <pubDate>Tue, 28 Jul 2026 19:45:33 -0500</pubDate>
      <description><![CDATA[Lot markers and houses have levelled the ground under themselves since 25 July. This is the same levelling with a handle on it, so a governor can use it anywhere in the town instead of only under a lot. Each leveller costs the town one object, and towns get a leveller cap that scales with their size, from 2 at the smallest tier to 55 at the largest. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s26">D26</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Ground that rises and falls more than 1.5 meters across the whole square is still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-067e3912c4cf</guid>
      <pubDate>Tue, 28 Jul 2026 19:45:34 -0500</pubDate>
      <description><![CDATA[Ground that rises and falls more than 1.5 meters across the whole square is still refused, and the message now gives you the measured slope next to the limit. The bigger the leveller the more often you will see it, because the limit is measured across the entire square rather than any part of it. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s26">D26</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Placements are undoable too, from inventory, from a stack, or straight into the palette…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-0b1f7f1e3598</guid>
      <pubDate>Tue, 28 Jul 2026 19:47:15 -0500</pubDate>
      <description><![CDATA[Placements are undoable too, from inventory, from a stack, or straight into the palette. Undo sends the item back where it came from, and a container-sourced placement can be redone with the identical item. A stack-sourced placement merges home on undo, which destroys its identity, so that one says plainly it cannot be redone. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s8">D8</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: The deco strip gained undo and redo buttons driving the same history as the keys, greyed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-b482d091a293</guid>
      <pubDate>Tue, 28 Jul 2026 19:47:17 -0500</pubDate>
      <description><![CDATA[The deco strip gained undo and redo buttons driving the same history as the keys, greyed exactly when there is nothing to do, plus a small list of your recent changes, newest first with what redo would bring back shown faded. The strip also stays visible while you are stepping back through changes instead of hiding seconds after a drop. Part of <a href="https://catnipgames.net/blog/proposals/decorating/#s8">D8</a>.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: The decorating proposals page now shows undo and redo as built, on the card, in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-8010a4d1698c</guid>
      <pubDate>Tue, 28 Jul 2026 20:39:54 -0500</pubDate>
      <description><![CDATA[The <a href="https://catnipgames.net/blog/proposals/decorating/">decorating proposals page</a> now shows <a href="https://catnipgames.net/blog/proposals/decorating/#s8">undo and redo</a> as built, on the card, in the catalog, and in the genre comparison, joining the levelling marker <a href="https://catnipgames.net/blog/proposals/decorating/#s26">D26</a> marked earlier today.]]></description>
    </item>
    <item>
      <title>Maps: Only 3 of the 30 captured zone maps carried the fixes made in July, so the other 27 still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4e440d22fd09</guid>
      <pubDate>Tue, 28 Jul 2026 17:47:25 -0500</pubDate>
      <description><![CDATA[Only 3 of the 30 captured zone maps carried the fixes made in July, so the other 27 still had every fault. All 25 surface maps have been redrawn. Seas and large lakes are drawn as water now instead of the ground beneath them: Shores of Malice gained 1,073,887 water pixels, a quarter of the image, and Rhun Ruins 988,040. Seven more zones gained rivers and ponds they never had.]]></description>
    </item>
    <item>
      <title>Maps: The same redraw put back the things the capture camera had been dropping. It was using…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-fbadf449def8</guid>
      <pubDate>Tue, 28 Jul 2026 17:47:26 -0500</pubDate>
      <description><![CDATA[The same redraw put back the things the capture camera had been dropping. It was using visibility data authored for a player standing on the ground, read from 50 metres overhead pointing straight down, so whole structures fell out of the picture. The main docks at Graff Island are back, so are the bridges, and the houses in East Vauban Foothills show their roofs instead of the furniture inside them.]]></description>
    </item>
    <item>
      <title>Maps: Ore and cotton are no longer baked into the map images, which is what put marks all over…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-e106daba7491</guid>
      <pubDate>Tue, 28 Jul 2026 17:47:27 -0500</pubDate>
      <description><![CDATA[Ore and cotton are no longer baked into the map images, which is what put marks all over the ground on Vauban Pass and every other zone with gathering nodes. Vauban Pass also lost a 150 metre square of blue water that was lying across its hills, left behind from a stretch of water belonging to another zone.]]></description>
    </item>
    <item>
      <title>Maps: Water over a sunken building was tinted at 82 percent, so a fifth of the lakebed came…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-91b716487031</guid>
      <pubDate>Tue, 28 Jul 2026 17:47:27 -0500</pubDate>
      <description><![CDATA[Water over a sunken building was tinted at 82 percent, so a fifth of the lakebed came through and the castle under the East Vauban lake was still readable as battlements. Anywhere the tool can prove the ground is below the surface now tints at 95 percent. Shallow ponds and rivers keep the lighter tint, where seeing the bottom is the point.]]></description>
    </item>
    <item>
      <title>Chat: The chat window can be moved again and its tabs pull out into windows of their own. Chat…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-f9916bfcbfee</guid>
      <pubDate>Tue, 28 Jul 2026 18:28:12 -0500</pubDate>
      <description><![CDATA[The chat window can be moved again and its tabs pull out into windows of their own. Chat is the only window with no title text, so once the tab strip filled the top bar there were about three pixels left that would start a drag; there is a move handle at the left end of the tab line now, and the empty part of the strip drags the window too. Detaching a tab was measuring sideways movement only, so pulling a tab straight down out of the window did nothing. A drag in any direction counts now, and a copy of the tab follows the cursor so you can see where it will land.]]></description>
    </item>
    <item>
      <title>Combat UI: When a character carries more buffs than the status bar has room for, the extras collapse…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-c948a71b4490</guid>
      <pubDate>Tue, 28 Jul 2026 18:39:27 -0500</pubDate>
      <description><![CDATA[When a character carries more buffs than the status bar has room for, the extras collapse into a single square with a count. Hovering it listed only the names of the hidden effects, so a bleed that spilled out of the strip lost both its numbers and its countdown. That square now shows what each hidden effect is doing, how much of it, and how long it has left, grouped by who applied it, and the times tick down while the tooltip is open.]]></description>
    </item>
    <item>
      <title>Gathering: Meticulous Collection pays out again for players who ignore the harvesting swing meter. A…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-6dc4cfec988c</guid>
      <pubDate>Tue, 28 Jul 2026 19:01:50 -0500</pubDate>
      <description><![CDATA[Meticulous Collection pays out again for players who ignore the harvesting swing meter. A hands-off harvest was capped at a single meticulous, and that one handed over no resources, so the extra wait bought nothing.]]></description>
    </item>
    <item>
      <title>Gathering: A missed swing at the meter now still pays the pass it ended on. Taking a swing can only…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-6a2d2df4a090</guid>
      <pubDate>Tue, 28 Jul 2026 19:02:04 -0500</pubDate>
      <description><![CDATA[A missed swing at the meter now still pays the pass it ended on. Taking a swing can only extend a harvest and never costs resources you would otherwise have kept.]]></description>
    </item>
    <item>
      <title>Gathering: The Meticulous Collection count on the harvest bar carries across nodes of the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-5902c872f4c5</guid>
      <pubDate>Tue, 28 Jul 2026 19:02:12 -0500</pubDate>
      <description><![CDATA[The Meticulous Collection count on the harvest bar carries across nodes of the same resource type instead of restarting at each one. It goes back to zero on a node that gives no meticulous, on a change of harvest type, and on a scene change.]]></description>
    </item>
    <item>
      <title>Gathering: The harvest bar reads the swing outcome for its result banner and its counter reset. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-030229d23a88</guid>
      <pubDate>Tue, 28 Jul 2026 19:02:20 -0500</pubDate>
      <description><![CDATA[The harvest bar reads the swing outcome for its result banner and its counter reset. It had been reading the roll made before the swing resolved, which put both on the wrong pass whenever the two disagreed.]]></description>
    </item>
    <item>
      <title>Gathering: The bonus a meticulous pays is an experience item, not just materials. All 144 Meticulous…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-28-4f6176ba288a</guid>
      <pubDate>Tue, 28 Jul 2026 19:23:06 -0500</pubDate>
      <description><![CDATA[The bonus a meticulous pays is an experience item, not just materials. All 144 Meticulous Collection reward tables carry one and none of the 348 ordinary harvest tables do, so every meticulous a hands-off harvest swallowed cost adventurer and producer experience as well as resources.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-27</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-headlines</guid>
      <pubDate>Mon, 27 Jul 2026 20:10:35 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Published a <b>Fire Magic Deep Dive</b>: twenty-four proposals, open for comments and votes at <a href="https://catnipgames.net/blog/proposals/fire-magic/">/blog/proposals/fire-magic/</a>. Burning becomes a state you can see, and a new Combust spell spends it.</li>
        <li>The combat and utility bars stopped sharing number keys in combat. One tester's attack key fired the skinning knife mid fight; each key now has exactly one owner.</li>
        <li>Every window help button the migration dropped is restored, with the one-time reminders that pointed at them.</li>
        <li>Finished a full research pass on the new player tutorial: what it teaches, what it skips, how 13 other games do it, and a staged plan to close the gaps.</li>
        <li>Vendor search now answers "how much", not just "does it have any". Filter for <b>Strength at least 10</b>, sort by the stat, across every vendor in the world.</li>
        <li>The black bar across the screen turned out to be the overworld tile readout stretched edge to edge. It is a compact plate again, and the <b>Enter Area</b> button it had swallowed is back, so you can enter zones and player towns from the map.</li>
        <li>A stray <strong>[No Ransom]</strong> tag was sitting on 867 of the game's 868 locations. It is gone, and a location that ever does put your goods at risk will say so instead.</li>
        <li><b>Font settings could be switched off for an entire session.</b> One prefab loading in the wrong order poisoned every font and colour lookup for the rest of the run, and thirteen editor tests were failing because of it. Fixed at the cause, with a test that keeps it fixed.</li>
        <li>Four Death Magic gear bonuses stopped claiming a <b>100%</b> baseline on the character sheet, and now show the bonus your gear actually grants. Spell and summon damage is unchanged.</li>
        <li>Three dead buttons in the top right corner came back: social, Player Guide, and the duplicate Rewards icon that opened nothing.</li>
        <li>Every weapon in the game has been advertising a damage range twice as wide as it rolls. The tooltip and the combat code carried separate numbers: a Longsword read 5 to 16 against a real 8.25 to 13.75. Nothing hits softer today; the label was wrong and is now right.</li>
        <li>Books and notes could not be read at all. Their text is written in dark ink for a page that went missing in the interface rebuild, so every book in the game was dark text on a dark panel. The page is back, one per UI skin.</li>
        <li>Every ward skill was wearing another school's artwork. Air Warding, which grants resistance to air, showed the Earth specialization icon and was indistinguishable from the mastery skill above it.</li>
        <li>Zone maps stopped drawing the seabed where the sea should be. <strong>Graff Island</strong> is an island again, and the castle in East Vauban Foothills is back under its lake.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Filed five items from the nightly forum sweep: a tradesman work-orders crafting-quests…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-dcb75be3d889</guid>
      <pubDate>Mon, 27 Jul 2026 03:24:24 -0500</pubDate>
      <description><![CDATA[Filed five items from the nightly forum sweep: a tradesman work-orders crafting-quests proposal, a request to have Pull from Lot Storage return secondary crafting tools to their container, reusing dungeon-builder deco tech for empty town buildings, per-monitor display/UI settings memory, and a bug report on broken bowl/basket/crate item collision.]]></description>
    </item>
    <item>
      <title>Community: Recolored the links on this work log from blue to orange, with a yellow hover, so they…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-2171e9368b97</guid>
      <pubDate>Mon, 27 Jul 2026 12:35:55 -0500</pubDate>
      <description><![CDATA[Recolored the links on this work log from blue to orange, with a yellow hover, so they read against the gold headings instead of fighting them.]]></description>
    </item>
    <item>
      <title>Magic: Published a fire magic improvement plan: twenty-four proposals covering the whole Fire…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-81677f21f5cc</guid>
      <pubDate>Mon, 27 Jul 2026 06:08:59 -0500</pubDate>
      <description><![CDATA[Published a fire magic improvement plan: twenty-four proposals covering the whole Fire school, from audio and tooltip fixes to a visible burning state, a new <b>Combust</b> spell that detonates your burns, and combos for the four fire glyphs that have none. The illustrated version is public at <a href="https://catnipgames.net/blog/proposals/fire-magic/">catnipgames.net/blog/proposals/fire-magic/</a> with a comment thread and vote arrows on every proposal.]]></description>
    </item>
    <item>
      <title>Magic: The plan asks for no extra damage. Fire is already the strongest elemental school in our…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-a7d7dd6c55c6</guid>
      <pubDate>Mon, 27 Jul 2026 06:09:07 -0500</pubDate>
      <description><![CDATA[The plan asks for no extra damage. Fire is already the strongest elemental school in our balance audit, so the proposals spend that headroom on depth instead: heat you build by committing to fire and spend at the moment you choose, burns that finally do real work against heavily resistant undead, one honest rule for what fire resistance means, and spell visuals that grow with your mastery.]]></description>
    </item>
    <item>
      <title>Magic: The comparison covered eight games, from Ultima Online's fire fields and hand-timed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-eef1f83773d6</guid>
      <pubDate>Mon, 27 Jul 2026 06:09:17 -0500</pubDate>
      <description><![CDATA[The comparison covered eight games, from Ultima Online's fire fields and hand-timed Explosion combos through WoW's Hot Streak, FFXIV's fire gauge, Path of Exile's ignite economy, Guild Wars 2's combo fields, and ESO's standardized Burning. A fourteen-row capability matrix on the page shows where our Fire school stands today against all eight and where the proposals would take it.]]></description>
    </item>
    <item>
      <title>Magic: Published a Life Magic Deep Dive : twenty-four proposals, open for comments and votes at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-4b322d6879b3</guid>
      <pubDate>Mon, 27 Jul 2026 06:11:54 -0500</pubDate>
      <description><![CDATA[Published a <b>Life Magic Deep Dive</b>: twenty-four proposals, open for comments and votes at <a href="https://catnipgames.net/blog/proposals/life-magic/">/blog/proposals/life-magic/</a>. The healing school gets prevention, conversion, and utility instead of another direct heal.]]></description>
    </item>
    <item>
      <title>Magic: The Life page's diagnosis: six of the school's nine spells restore hit points and differ…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d9c63ec84f5f</guid>
      <pubDate>Mon, 27 Jul 2026 06:12:09 -0500</pubDate>
      <description><![CDATA[The Life page's diagnosis: six of the school's nine spells restore hit points and differ only in dice, Life owns zero glyph combos of its own, and an entire authored spell (Summon Ankh) sits dormant in the data. Eighteen months of community threads contain zero requests about Life magic; the page argues that silence is the finding.]]></description>
    </item>
    <item>
      <title>Magic: Tier 1 of the Life page repairs the healer's hands before any new mechanic: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-011a2ebaf5b1</guid>
      <pubDate>Mon, 27 Jul 2026 06:12:19 -0500</pubDate>
      <description><![CDATA[Tier 1 of the Life page repairs the healer's hands before any new mechanic: the ally-cycle key that cannot advance past the first ally, overheal that vanishes without a trace, heal text that never scales with size, and a resurrection cast that hides its success odds. Three of the twenty-four cards are open questions with votes, including healing outside the party.]]></description>
    </item>
    <item>
      <title>Magic: Published an Earth Magic Deep Dive : twenty-two proposals, open for comments and votes at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-2a4bf6093d4b</guid>
      <pubDate>Mon, 27 Jul 2026 06:18:26 -0500</pubDate>
      <description><![CDATA[Published an <b>Earth Magic Deep Dive</b>: twenty-two proposals, open for comments and votes at <a href="https://catnipgames.net/blog/proposals/earth-magic/">/blog/proposals/earth-magic/</a>. Earth is the third school through the process after Fire and Life, and its page starts from a different problem: the school is three buffs on a melee bar. The 2020 mage-builds megathread on the official forum discusses every school of magic except Earth, and the one terrain spell in its 2013 design, Stone Wall, was cut before launch while its skill identifier stayed in the game data. The headline proposal restores it as a placed, destructible wall.]]></description>
    </item>
    <item>
      <title>Magic: The audit under the Earth page found eight real defects and filed them the same day…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-5a9fe314d119</guid>
      <pubDate>Mon, 27 Jul 2026 06:18:33 -0500</pubDate>
      <description><![CDATA[The audit under the Earth page found eight real defects and filed them the same day (#2588 to #2595). Among them: the Root spell carries a leftover mount effect that shrinks its target and force-dismounts riders, every summoned elemental levels off the Water specialization by copy-paste error, and Earthquake is the only spell in the game flagged hidden, so its knockdown never shows on a status bar.]]></description>
    </item>
    <item>
      <title>Magic: The Earth comparison ran from Ultima V, whose earthquake left allies unshaken and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-98edf29a77b3</guid>
      <pubDate>Mon, 27 Jul 2026 06:18:43 -0500</pubDate>
      <description><![CDATA[The Earth comparison ran from Ultima V, whose earthquake left allies unshaken and unharmed in 1988, through UO with Wall of Stone at third circle, EverQuest with the rooting earth pet, Guild Wars and the obsidian tank, ESO with Petrify and its damage budget, Divinity, FFXI, Path of Exile, and Genshin, whose Geo element spent years proving that a purely defensive element goes unplayed. The Earth cards follow the same rules as the sibling pages: mechanics on the page, numbers through the balance program.]]></description>
    </item>
    <item>
      <title>Magic: Reviewed the wording on all nine live proposal pages and tightened two implementation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-836ce14f18d3</guid>
      <pubDate>Mon, 27 Jul 2026 06:25:18 -0500</pubDate>
      <description><![CDATA[Reviewed the wording on all nine live proposal pages and tightened two implementation notes, one on the earth magic page and one on the fire magic page.]]></description>
    </item>
    <item>
      <title>Magic: Published a Death Magic Deep Dive : eighteen proposals, open for comments and votes at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-b1591be8341c</guid>
      <pubDate>Mon, 27 Jul 2026 06:30:16 -0500</pubDate>
      <description><![CDATA[Published a <b>Death Magic Deep Dive</b>: eighteen proposals, open for comments and votes at <a href="https://catnipgames.net/blog/proposals/death-magic/">/blog/proposals/death-magic/</a>. The school of the grave is at its weakest in a grave: undead heavily resist it, its life drains refuse to feed on the dead, and the Lich costs six times normal experience while the community says it is not worth half that. The proposals restore what Ultima Online's own 2003 necromancy retrofit shipped and this school never got: real curses, a corpse economy, and an undead court worth keeping.]]></description>
    </item>
    <item>
      <title>Magic: The audit under the death page found much of the missing school already in the game's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-1d5baf47ca13</guid>
      <pubDate>Mon, 27 Jul 2026 06:30:27 -0500</pubDate>
      <description><![CDATA[The audit under the death page found much of the missing school already in the game's files. The summons' life-drain strike is gated on a stat no skill teaches, a second summon-scaling stat has never been granted by anything, the summon health formula reads the wrong character's mastery, and a complete fourth summon, the Skeleton Mage, has been invisible for years because its school field says None. Nine defects filed the same day (#2598 to #2606).]]></description>
    </item>
    <item>
      <title>Magic: The death comparison ran from Ultima Online's Age of Shadows retrofit through Diablo II's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-3dbed4abcb9b</guid>
      <pubDate>Mon, 27 Jul 2026 06:30:28 -0500</pubDate>
      <description><![CDATA[The death comparison ran from Ultima Online's Age of Shadows retrofit through Diablo II's curse rules, Guild Wars' contested corpses, Path of Exile's manufactured ones, and Diablo IV's Book of the Dead. The counterplay canon shaped the headline card: a stacking resist strip that fires for every Death mage, not just specialists, and pierces the undead wall at one fifth strength, so warded undead become workable instead of untouchable.]]></description>
    </item>
    <item>
      <title>Magic: Death Field and Discharge stopped claiming a minimum casting distance. Both spells…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-7af9dce79b48</guid>
      <pubDate>Mon, 27 Jul 2026 17:02:16 -0500</pubDate>
      <description><![CDATA[Death Field and Discharge stopped claiming a minimum casting distance. Both spells detonate where the caster is standing, so the 5 metre stand-off written into their data described a shape neither spell has, and it told creature AI to hold that distance and refuse the cast up close.]]></description>
    </item>
    <item>
      <title>Magic: Corrected the Death Magic proposal page. Its bug list described Death Field as a ring…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-8947b0f353e2</guid>
      <pubDate>Mon, 27 Jul 2026 17:02:23 -0500</pubDate>
      <description><![CDATA[Corrected the Death Magic proposal page. Its bug list described Death Field as a ring with a degenerate hole in the middle, which the spell never had, and tied the fix to an unbuilt proposal. The fix shipped on its own and the page now says what was actually wrong.]]></description>
    </item>
    <item>
      <title>UI: Planned the Crown Store conversion, the last window not waiting on the front end. Reading…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-c41b656eebc1</guid>
      <pubDate>Mon, 27 Jul 2026 06:28:45 -0500</pubDate>
      <description><![CDATA[Planned the Crown Store conversion, the last window not waiting on the front end. Reading the prefab first found six behaviors that live only there (description links, the Episode 2 link, both Get Crowns buttons, the search clear button, 22 tooltips, the bundled-item 3D preview click), so the plan opens with a full component census. The shelf will drop 9-per-page paging for a scrolling grid.]]></description>
    </item>
    <item>
      <title>UI: Moved the shared dim-and-dialog overlay from the shop window base into the common window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-0bcabcf5bf09</guid>
      <pubDate>Mon, 27 Jul 2026 06:39:24 -0500</pubDate>
      <description><![CDATA[Moved the shared dim-and-dialog overlay from the shop window base into the common window chrome, so any window on the new interface can put a dialog or a busy veil over itself. The vendor price dialog dim now locks the vendor window only; chat, other windows and the game world stay usable while it is open.]]></description>
    </item>
    <item>
      <title>UI: Recipe cards at crafting stations and in the recipe book now draw on a framed plate; they…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-3d2be4ad525f</guid>
      <pubDate>Mon, 27 Jul 2026 06:48:42 -0500</pubDate>
      <description><![CDATA[Recipe cards at crafting stations and in the recipe book now draw on a framed plate; they had rendered with no backing since they moved to the new interface. The unread-mail and invite counts on the corner buttons draw as a small pill instead of bare text over the icon. Both ride two new shared theme classes the Crown Store cards will use next.]]></description>
    </item>
    <item>
      <title>UI: Built a shared item icon element for the new interface: art on a plate, a quantity pill…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-2e85f20c6a7d</guid>
      <pubDate>Mon, 27 Jul 2026 06:56:32 -0500</pubDate>
      <description><![CDATA[Built a shared item icon element for the new interface: art on a plate, a quantity pill, the item tooltip, and a click that opens the 3D item preview where an item supports one. The ransom and loot roll windows moved onto it, dropping their duplicate tooltip code; the Crown Store bundle rack picks it up next.]]></description>
    </item>
    <item>
      <title>UI: Lifted every rule the Crown Store window enforces into tested standalone code ahead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-40006f0b352c</guid>
      <pubDate>Mon, 27 Jul 2026 07:05:41 -0500</pubDate>
      <description><![CDATA[Lifted every rule the Crown Store window enforces into tested standalone code ahead of its conversion: item availability windows and the five-minute selling cutoff, vault round visibility, the search match, the sale-first shelf ordering, the countdown timers with their two-minute warning, sale price presentation, and bundle ownership. Nineteen tests pin behaviors the old window never had under test.]]></description>
    </item>
    <item>
      <title>UI: Built a virtualised tile grid for the new interface: a scrolling grid of fixed-size cards…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d0a0d6457f10</guid>
      <pubDate>Mon, 27 Jul 2026 07:13:41 -0500</pubDate>
      <description><![CDATA[Built a virtualised tile grid for the new interface: a scrolling grid of fixed-size cards that only builds the rows on screen, refits its column count when the window resizes, and tells its owner to cancel loading art for anything that scrolls out of view. The Crown Store shelf rides it next; two earlier windows that hand-rolled wrapping grids can move onto it later.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the Crown Store category rail for the new interface: the On Sale and From The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d838ef2347a7</guid>
      <pubDate>Mon, 27 Jul 2026 07:20:39 -0500</pubDate>
      <description><![CDATA[Rebuilt the Crown Store category rail for the new interface: the On Sale and From The Vault tabs, the category tree with expanding subcategories, per-tab item counts, and time-window visibility, with every rule extracted into tested code. The rail itself only paints what the rules answer.]]></description>
    </item>
    <item>
      <title>UI: Built the Crown Store shelf card for the new interface: art, name, price, sale and owned…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d5198adcac8a</guid>
      <pubDate>Mon, 27 Jul 2026 07:29:24 -0500</pubDate>
      <description><![CDATA[Built the Crown Store shelf card for the new interface: art, name, price, sale and owned badges, and a countdown line, safe to recycle in the scrolling grid. Item art loads one picture at a time through a bounded queue that loads the newest request first and drops what the player scrolled past, so dragging the scrollbar across a big category cannot pile up hundreds of loads.]]></description>
    </item>
    <item>
      <title>UI: Built the Crown Store detail pane for the new interface: the picture carousel with mouse…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-28e3f06f802f</guid>
      <pubDate>Mon, 27 Jul 2026 07:36:39 -0500</pubDate>
      <description><![CDATA[Built the Crown Store detail pane for the new interface: the picture carousel with mouse wheel support, price with its sale caption, the scrolling description with working web links, the bundle contents rack with click-to-preview on each item, and the Buy button. Two behaviors that lived only on the old prefab survived the move: the description link click and the bundle item 3D preview.]]></description>
    </item>
    <item>
      <title>UI: Planned the rest of the interface migration end to end: eight batches from this ledger…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-070da9ddb503</guid>
      <pubDate>Mon, 27 Jul 2026 07:37:03 -0500</pubDate>
      <description><![CDATA[Planned the rest of the interface migration end to end: eight batches from this ledger pass through the removal of the old UI framework. Reading the whole tracker against the code fixed six stale rows (the party frame was recorded as unconverted days after it shipped), confirmed the shop window never got its category filter back, and added a numbered teardown checklist the final batch can execute directly.]]></description>
    </item>
    <item>
      <title>UI: Assembled the full Crown Store window shell on the new interface: search with a clear…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-c1a375d086bd</guid>
      <pubDate>Mon, 27 Jul 2026 07:45:25 -0500</pubDate>
      <description><![CDATA[Assembled the full Crown Store window shell on the new interface: search with a clear button, crowns on hand with the gold crown icon, Get Crowns, the Episode 2 notice with a working webstore link, the category rail, the scrolling shelf and the detail pane, plus a loading veil that leaves the close button usable while store rules are fetched. Everything is built and tested; the next step swaps the live window onto it.]]></description>
    </item>
    <item>
      <title>UI: The Crown Shop opened on the new interface. The nine-item paged shelf became a scrolling…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-a9f6b4486015</guid>
      <pubDate>Mon, 27 Jul 2026 08:09:23 -0500</pubDate>
      <description><![CDATA[The Crown Shop opened on the new interface. The nine-item paged shelf became a scrolling grid that loads card art as it comes into view, so a 300-item category is one drag instead of 34 clicks. Search, categories, sale badges, countdowns, the picture carousel, bundle previews and the buy flow all carried over, and the purchase code itself moved unchanged. A stuck store-rules fetch can now be closed instead of trapping the window. Saved window position resets once with this change.]]></description>
    </item>
    <item>
      <title>UI: Fixed the store button in the corner of the screen not showing its attention dot when a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-2c732d62d783</guid>
      <pubDate>Mon, 27 Jul 2026 08:10:25 -0500</pubDate>
      <description><![CDATA[Fixed the store button in the corner of the screen not showing its attention dot when a new sale or vault round arrives. It had been dark since the corner buttons moved to the new interface. Opening the shop still clears it.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Property Manager: moving a lot's stored contents on and off your lots had been…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-1e1e3be64cf0</guid>
      <pubDate>Mon, 27 Jul 2026 08:11:46 -0500</pubDate>
      <description><![CDATA[Fixed the Property Manager: moving a lot's stored contents on and off your lots had been broken since the window moved to the new interface. Each deed card now carries three per-lot slots (lot, basement, dungeon) that take drops, start drags, show tooltips and open right-click menus; storage entries drag out again and out-of-town entries appear faded. Three old interface prefabs and four classes retired with the fix.]]></description>
    </item>
    <item>
      <title>UI: Moved the build info line back to its top left corner. The interface conversion had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-3b489bd0b067</guid>
      <pubDate>Mon, 27 Jul 2026 08:16:49 -0500</pubDate>
      <description><![CDATA[Moved the build info line back to its top left corner. The interface conversion had dropped it into a centered band at the top of the screen, where the compass sat over it and it drew on top of the frame rate readout as one garbled line. A tester reported it the day after it shipped; new editor tests now pin the corner anchoring so it cannot drift again.]]></description>
    </item>
    <item>
      <title>UI: The compass is now draggable: grab the bracket frame with the left mouse button and put…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-f07c88250887</guid>
      <pubDate>Mon, 27 Jul 2026 08:16:58 -0500</pubDate>
      <description><![CDATA[The compass is now draggable: grab the bracket frame with the left mouse button and put it anywhere. The spot is remembered between sessions, pulled back on screen when the resolution or UI scale shrinks the panel, and the Reset Positions button in Options re-centers it. The text lines under the strip ride along and stay click-through.]]></description>
    </item>
    <item>
      <title>UI: The one-time help reminders beside the top-right warning icons are on the new interface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-0bc41994847f</guid>
      <pubDate>Mon, 27 Jul 2026 08:26:00 -0500</pubDate>
      <description><![CDATA[The one-time help reminders beside the top-right warning icons are on the new interface: damaged equipment, low ammo, and encumbered. Clicking a bubble opens the matching help page and dismisses it for good, past dismissals carry over, and the encumbrance reminder is back after being missing for a few builds. The reset tutorials option restores all of them.]]></description>
    </item>
    <item>
      <title>UI: The recipe book was still stuck on one page on chaos build 65, which carried both of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-851dcd36394e</guid>
      <pubDate>Mon, 27 Jul 2026 08:36:10 -0500</pubDate>
      <description><![CDATA[The recipe book was still stuck on one page on chaos build 65, which carried both of yesterday's fixes. Client logs from a build 65 session showed a third defect, present since the rebuild: every page turn first saved your place in the book, that save crashed every time on the rebuilt window, and the turn stopped before drawing the new page. The fault sat in the shared base all the rebuilt windows use, so the fix covers every one of them, and page turns now draw the new page before saving. Verified in a live login this time: paging, chapter links, search with and without matches, and reopening to the saved page all work with no errors.]]></description>
    </item>
    <item>
      <title>UI: Deleted the Crown Shop old-interface leftovers: the shelf tile, category tab and bundle…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d205f212e204</guid>
      <pubDate>Mon, 27 Jul 2026 08:46:13 -0500</pubDate>
      <description><![CDATA[Deleted the Crown Shop old-interface leftovers: the shelf tile, category tab and bundle icon scripts, their three prefabs, and a window class no asset ever used. A sweep of every serialized asset confirmed nothing else referenced them, and everything they owned had already moved with the conversion.]]></description>
    </item>
    <item>
      <title>UI: Closed out the Crown Shop conversion: verified it live in an offline editor session…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-1bb7f8900627</guid>
      <pubDate>Mon, 27 Jul 2026 08:49:44 -0500</pubDate>
      <description><![CDATA[Closed out the Crown Shop conversion: verified it live in an offline editor session (categories, scrolling shelf, search, details, and repeated open-close cycles), fixed the three defects that session caught, and retired the old interface files. 173 of the 181 tracked interface pieces are now done; everything left waits on the login screens.]]></description>
    </item>
    <item>
      <title>UI: Four pieces the interface conversions had dropped are back: the shopkeeper window's Sell…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-28d3a9707320</guid>
      <pubDate>Mon, 27 Jul 2026 08:51:36 -0500</pubDate>
      <description><![CDATA[Four pieces the interface conversions had dropped are back: the shopkeeper window's Sell category filter, sortable column headers on both crafting table lists (with the sort remembered per pane), right-click on the on-screen task list to hide a task or report a problem, and the skill tooltip on hover over the level-up popup.]]></description>
    </item>
    <item>
      <title>UI: The deck swap button is on the new interface, mounted at the end of the skill bar with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-52fbcb78f74b</guid>
      <pubDate>Mon, 27 Jul 2026 08:52:16 -0500</pubDate>
      <description><![CDATA[The deck swap button is on the new interface, mounted at the end of the skill bar with the deck names glued above it. Nameplate leader stars are back after being missing since the nameplate conversion: white for a party leader, gold for a guild leader. The vendor search window's Refresh reloads in place instead of closing and reopening itself.]]></description>
    </item>
    <item>
      <title>UI: Closed five interface framework rows that had been finished in practice for weeks without…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e8e07346ac2d</guid>
      <pubDate>Mon, 27 Jul 2026 08:56:48 -0500</pubDate>
      <description><![CDATA[Closed five interface framework rows that had been finished in practice for weeks without the tracker saying so (window movement and position saving, stacking, context menus, tweens, and localization), each with a guard test so nothing quietly reopens them. Seven of the fourteen framework rows are now closed.]]></description>
    </item>
    <item>
      <title>UI: Deleted two verified-dead pieces of the old interface (the deck slot glyph prefab and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-bdf06c95663a</guid>
      <pubDate>Mon, 27 Jul 2026 09:08:21 -0500</pubDate>
      <description><![CDATA[Deleted two verified-dead pieces of the old interface (the deck slot glyph prefab and the nameplate rune icon fallback, both unreachable since their hosts converted) and closed the atlas and font framework rows: converted windows ship standalone textures and TextCore faces, with the two remaining atlas reads recorded as teardown work. Nine of fourteen framework rows are now closed.]]></description>
    </item>
    <item>
      <title>UI: Fixed names with an ampersand rendering as the literal text amp-code on the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-8de50d7ded0b</guid>
      <pubDate>Mon, 27 Jul 2026 09:22:43 -0500</pubDate>
      <description><![CDATA[Fixed names with an ampersand rendering as the literal text amp-code on the new interface: Pets and Mounts, VFX and Fireworks and friends in the Crown Shop categories and the backpack dropdown now show a plain ampersand. Found by getting editor screenshots working on the Mac checkout, which had been written off as unable to capture; the real problem was a hidden Game View panel and no repaints while the editor sat unfocused.]]></description>
    </item>
    <item>
      <title>UI: The help buttons are back: six windows (skills, crafting, books, lot signs, shops, bank)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-821ba6ab35ad</guid>
      <pubDate>Mon, 27 Jul 2026 09:48:00 -0500</pubDate>
      <description><![CDATA[The help buttons are back: six windows (skills, crafting, books, lot signs, shops, bank) show their title bar ? again and open the right help page, and the one-time Click for Help reminders show until first use. Books also got their page-turn and table-of-contents reminders back. Past dismissals carry over.]]></description>
    </item>
    <item>
      <title>UI: Planned the next interface batch: the login form and the offline rewards window. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-f34abf85d732</guid>
      <pubDate>Mon, 27 Jul 2026 09:51:37 -0500</pubDate>
      <description><![CDATA[Planned the next interface batch: the login form and the offline rewards window. The rewards window only ever uses the login panel as a credential form, so converting the form alone closes that whole window without touching the login flow, and reading the code first surfaced a GM-only toggle and two direct web links the plan now carries.]]></description>
    </item>
    <item>
      <title>UI: The login form is on the new interface: username and password, Remember User Name, Steam…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-7fbaa0ca1fed</guid>
      <pubDate>Mon, 27 Jul 2026 10:10:49 -0500</pubDate>
      <description><![CDATA[The login form is on the new interface: username and password, Remember User Name, Steam login, the forgot and create-account links, and the CapsLock warning, across the online panel, the offline panel, and the offline rewards window. The login flow itself is untouched, and the automated login paths the build tools rely on are pinned by test.]]></description>
    </item>
    <item>
      <title>UI: The offline Rewards window is on the new interface, a whole batch ahead of schedule: what…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-f3c1c9e06faa</guid>
      <pubDate>Mon, 27 Jul 2026 10:20:12 -0500</pubDate>
      <description><![CDATA[The offline Rewards window is on the new interface, a whole batch ahead of schedule: what actually gated it was the login form converted alongside it, so the claim flow (confirm, log in, connect, result) carried over untouched with the connecting message now drawn over the window itself. Only the login screens and the character appearance editor remain.]]></description>
    </item>
    <item>
      <title>UI: The overworld tile readout has its scene contents tooltip back. Retiring the old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-b75c18cb3d6c</guid>
      <pubDate>Mon, 27 Jul 2026 14:06:11 -0500</pubDate>
      <description><![CDATA[The overworld tile readout has its scene contents tooltip back. Retiring the old interface underneath it had removed the tooltip along with the artwork, so hovering a tile listed nothing.]]></description>
    </item>
    <item>
      <title>UI: Three leftover scripts were still reading pieces of the old interface that had already…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-9b56c38ea456</guid>
      <pubDate>Mon, 27 Jul 2026 14:06:13 -0500</pubDate>
      <description><![CDATA[Three leftover scripts were still reading pieces of the old interface that had already been retired, once every frame each. Between them they were producing about 180 error lines every fifteen minutes, most of the total.]]></description>
    </item>
    <item>
      <title>UI: The retirement helper now warns by name when it leaves a script holding a piece of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-748ec6507b8a</guid>
      <pubDate>Mon, 27 Jul 2026 14:06:22 -0500</pubDate>
      <description><![CDATA[The retirement helper now warns by name when it leaves a script holding a piece of interface it just removed, so the next window conversion reports the problem instead of throwing on every frame.]]></description>
    </item>
    <item>
      <title>UI: An overworld tile whose scene the client has no information for reads as an empty tile…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-ac95f1d63cf7</guid>
      <pubDate>Mon, 27 Jul 2026 14:06:22 -0500</pubDate>
      <description><![CDATA[An overworld tile whose scene the client has no information for reads as an empty tile now instead of failing partway through drawing the readout.]]></description>
    </item>
    <item>
      <title>UI: Fishing was missing from the list of skill schools the filter bar sorts through, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-54a1e1212bf9</guid>
      <pubDate>Mon, 27 Jul 2026 14:06:23 -0500</pubDate>
      <description><![CDATA[Fishing was missing from the list of skill schools the filter bar sorts through, so opening the deck builder or the glyph collection logged an error for every filter box it built.]]></description>
    </item>
    <item>
      <title>UI: The overworld tile readout was drawing its plate the full width of the screen. Because…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-69ed52ceb259</guid>
      <pubDate>Mon, 27 Jul 2026 14:36:05 -0500</pubDate>
      <description><![CDATA[The overworld tile readout was drawing its plate the full width of the screen. Because that plate paints a backing, it showed up as a black band across the view, and since it lives on the shared game UI it was there in towns and dungeons as well as on the map. The plate now sizes to its contents and hides whenever there is nothing under your marker to enter.]]></description>
    </item>
    <item>
      <title>UI: The same band had taken the overworld Enter Area button with it. The caption never made…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e134d1315bbb</guid>
      <pubDate>Mon, 27 Jul 2026 14:36:06 -0500</pubDate>
      <description><![CDATA[The same band had taken the overworld Enter Area button with it. The caption never made it across in the interface conversion, which left the button too small to see, and the full-width plate also blocked the keyboard route into a tile by sitting under the pointer. Clicking and the shortcut both work again.]]></description>
    </item>
    <item>
      <title>UI: Location banners no longer end with "[No Ransom]". The tag was appearing on 867 of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-5c863531a760</guid>
      <pubDate>Mon, 27 Jul 2026 16:53:04 -0500</pubDate>
      <description><![CDATA[Location banners no longer end with "[No Ransom]". The tag was appearing on 867 of the 868 known locations, so it marked almost every town and adventuring area in the game and told players nothing. A location where ransom actually applies will now carry a "[Ransom]" tag instead, so the banner warns about risk rather than its absence. Reported from The Breach, which read "Tier 15+ Adventuring Area [No Ransom]".]]></description>
    </item>
    <item>
      <title>UI: The client had a way to lose its font and colour settings for a whole session. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-480a727b3411</guid>
      <pubDate>Mon, 27 Jul 2026 17:04:14 -0500</pubDate>
      <description><![CDATA[The client had a way to lose its font and colour settings for a whole session. The settings were loaded once at startup from a static constructor, and on the client that load asks the engine whether the game is running, which the engine refuses to answer while a component is still being built. If the first thing to touch the fonts happened to be a prefab loading in that state, the load threw, and the runtime remembers a failure of that kind for as long as the process lives, so every font and colour lookup after it threw as well and all the text fell back to plain white. The settings now load the first time something asks for them, and an attempt that cannot run yet is retried on the next request.]]></description>
    </item>
    <item>
      <title>UI: The need/greed loot roll window was what set it off: its countdown colour was resolved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-b1d3cf49935c</guid>
      <pubDate>Mon, 27 Jul 2026 17:04:36 -0500</pubDate>
      <description><![CDATA[The need/greed loot roll window was what set it off: its countdown colour was resolved while the window was still being constructed. That colour is now picked up when a roll opens, which is where the window already set it anyway. A new editor test holds both ends of the wire, checking that nothing runs at the font manager startup and that no field anywhere in the client resolves a font or a colour that early. In the editor test suite this takes thirteen unrelated failures back to passing.]]></description>
    </item>
    <item>
      <title>UI: The social and Player Guide buttons in the top right corner do something when clicked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-805ae389c68c</guid>
      <pubDate>Mon, 27 Jul 2026 17:15:30 -0500</pubDate>
      <description><![CDATA[The social and Player Guide buttons in the top right corner do something when clicked again. Neither carries a click handler of its own, and the handler gets attached a moment after the converted row takes stock of its buttons, so the row had filed both icons as decoration.]]></description>
    </item>
    <item>
      <title>UI: The corner also stopped showing two Rewards buttons. There are two because one is for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-892ee13e17cb</guid>
      <pubDate>Mon, 27 Jul 2026 17:15:30 -0500</pubDate>
      <description><![CDATA[The corner also stopped showing two Rewards buttons. There are two because one is for online play and one for single player offline, and the game switches off whichever does not apply just after the row was built. The row now follows what is switched on as you play, so anything else hidden on that row is honoured too.]]></description>
    </item>
    <item>
      <title>UI: Windows the player stacks against each other can be ordered again. The teleport scroll's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-0fe3e7174e1e</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:39 -0500</pubDate>
      <description><![CDATA[Windows the player stacks against each other can be ordered again. The teleport scroll's destination list was opening behind the backpack it was used from, Players in Scene and Social could not be put either way round, and the Options menu let clicks through to the Crown Store behind it. Four windows had never joined the window ordering, so they sat behind everything that had.]]></description>
    </item>
    <item>
      <title>UI: Long names stay inside their windows. A container name on a window shrunk to its smallest…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-23999b92134e</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:40 -0500</pubDate>
      <description><![CDATA[Long names stay inside their windows. A container name on a window shrunk to its smallest size pushed the pin and close buttons out of the frame, chat tabs ran past the right edge and were cut through the middle of a letter, and a long house description shoved the arrow off the property window. All three came from labels never being allowed to shrink, so the ellipsis they were meant to get never appeared.]]></description>
    </item>
    <item>
      <title>UI: Books and notes are printed on a page again. Book text is authored in dark ink because…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-df336c74e720</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:40 -0500</pubDate>
      <description><![CDATA[Books and notes are printed on a page again. Book text is authored in dark ink because the old window drew it on a page texture; the rebuilt window kept the ink and lost the page, leaving dark text on a dark panel. The page is a theme colour, so each of the four UI skins gets its own.]]></description>
    </item>
    <item>
      <title>UI: Right-clicking an item shows its properties again. The menu was opening and then being…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-005089d5fc11</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:40 -0500</pubDate>
      <description><![CDATA[Right-clicking an item shows its properties again. The menu was opening and then being torn down two frames later, because the same right-click was also handled as a click on the world behind the window, and that path closes whatever menu is open before showing its own.]]></description>
    </item>
    <item>
      <title>UI: The emote bar can be dragged. It is shrink-wrapped around its slots, so only a three…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-adc45748ee79</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:40 -0500</pubDate>
      <description><![CDATA[The emote bar can be dragged. It is shrink-wrapped around its slots, so only a three pixel border and the gaps between icons counted as somewhere to grab; the row holding the turn and close buttons is now the handle. It also keeps itself on screen when the resolution or UI size changes.]]></description>
    </item>
    <item>
      <title>UI: Direction keys keep working while you place a property marker or a decoration. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-9fc948a88d7f</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:40 -0500</pubDate>
      <description><![CDATA[Direction keys keep working while you place a property marker or a decoration. The backpack search box was still holding the keyboard, and while a text box holds it the game ignores every key but Enter, so the placement rectangle moved once and then stopped with the key presses landing in the search box.]]></description>
    </item>
    <item>
      <title>UI: Two carried maps can no longer land exactly on top of each other. The offset that keeps…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-5b1e3e98b52d</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:40 -0500</pubDate>
      <description><![CDATA[Two carried maps can no longer land exactly on top of each other. The offset that keeps them apart came from a counter that handed the same slot out again as soon as any map closed, leaving one map directly under another where no click could reach it. Pinned windows also come back pinned after a restore.]]></description>
    </item>
    <item>
      <title>Images: From the fire magic proposal page: the loop in one fight. Burn pips appear under the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-12b772aa9787</guid>
      <pubDate>Mon, 27 Jul 2026 06:09:27 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/fire-magic-proposal-hud-mockup.png" data-full="https://catnipgames.net/blog/images/fire-magic-proposal-hud-mockup.png" alt="Mockup of the proposed combat readout: burn pips on the target nameplate, heat building cast by cast, and a Combust detonation line"></div>From the fire magic proposal page: the loop in one fight. Burn pips appear under the target, heat builds on the right as committed casts land, and <b>Combust</b> trades the burns for one immediate hit.]]></description>
    </item>
    <item>
      <title>Images: From the life magic proposal page: the healer's screen after the program. Party rows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e90288accf05</guid>
      <pubDate>Mon, 27 Jul 2026 06:12:31 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/life-magic-proposal-healer-screen.png" data-full="https://catnipgames.net/blog/images/life-magic-proposal-healer-screen.png" alt="Mockup of the proposed healer screen: party rows with heal-over-time and ward marks, an attunement and Bloom chip line, and a stack-transform preview"></div>From the life magic proposal page: the healer's screen after the program. Party rows carry heal-over-time and ward marks, the chip line shows attunement and banked <b>Bloom</b> charges, and three stacked Healing Touches preview the spell they would become.]]></description>
    </item>
    <item>
      <title>Images: From the Earth magic proposal page: the tree as the twenty-two cards would rebuild it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-c9b5b6c45437</guid>
      <pubDate>Mon, 27 Jul 2026 06:18:53 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/earth-proposal-tree.png" data-full="https://catnipgames.net/blog/images/earth-proposal-tree.png" alt="Mockup of the proposed Earth magic skill tree with new nodes in green: Petrify, Fracture, Upheaval, Earthen Weapon, the Greater Elemental, and Stone Wall restored"></div>From the Earth magic proposal page: the tree as the twenty-two cards would rebuild it. New nodes in green, reworked glyphs starred, and <b>Stone Wall</b> back in the branch it was cut from in 2014.]]></description>
    </item>
    <item>
      <title>Images: From the Death magic proposal page: the tree as the eighteen cards would rebuild it. New…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-1ac68c72c17a</guid>
      <pubDate>Mon, 27 Jul 2026 06:30:40 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/death-proposal-composed-tree.png" data-full="https://catnipgames.net/blog/images/death-proposal-composed-tree.png" alt="Mockup of the proposed Death magic skill tree with new nodes in green: Grave Siphon, Exhume, the Skeleton Mage, Feed the Dead, The Last Command, Grave Omen, the necrotic weapon enchant, Blood Price, and Bonepiercer"></div>From the Death magic proposal page: the tree as the eighteen cards would rebuild it. New nodes in green, changed behavior on shipping skills in gold, and the authored-but-invisible <b>Skeleton Mage</b> finally placed on a branch.]]></description>
    </item>
    <item>
      <title>Images: From the home decorating proposal page: the decorator's workbench after the program. A…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-b94b1a40f72d</guid>
      <pubDate>Mon, 27 Jul 2026 06:33:30 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/deco-workbench-mockup.png" data-full="https://catnipgames.net/blog/images/deco-workbench-mockup.png" alt="Mockup of the proposed decoration mode strip: a mode row with Move, Place, Select, Align, undo and redo, an overhead camera toggle, numbered limit meters, and a status line explaining a failed placement"></div>From the home decorating proposal page: the decorator's workbench after the program. A mode row with <b>Select</b> and <b>Align</b>, undo and redo, numbers on every meter, and a status line that finally says why a placement failed.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-8eaf40d92d55</guid>
      <pubDate>Mon, 27 Jul 2026 09:22:55 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/crown-shop-uitk-2026-07-27.png" data-full="https://catnipgames.net/blog/images/crown-shop-uitk-2026-07-27.png" alt="The Crown Shop on the new interface: category list with counts, scrolling shelf of item cards, and the detail pane with the Buy button" loading="lazy"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-0a5ac0ac43de</guid>
      <pubDate>Mon, 27 Jul 2026 20:09:35 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/graff-island-map-water.png" alt="The Graff Island zone map before and after, showing the sea painted in around the island"></div>]]></description>
    </item>
    <item>
      <title>Images · 2026-07-27</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-images</guid>
      <pubDate>Mon, 27 Jul 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/fire-magic-proposal-hud-mockup.png" data-full="https://catnipgames.net/blog/images/fire-magic-proposal-hud-mockup.png" alt="Mockup of the proposed combat readout: burn pips on the target nameplate, heat building cast by cast, and a Combust detonation line"></div>]]></description>
    </item>
    <item>
      <title>User Interface: Fixed the combat and utility bars fighting over the number keys. In combat a key could…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-3b7dce118f75</guid>
      <pubDate>Mon, 27 Jul 2026 06:12:14 -0500</pubDate>
      <description><![CDATA[Fixed the combat and utility bars fighting over the number keys. In combat a key could fire the utility slot instead of the combat glyph (one tester tried to skin the wolf they were still fighting), and around the start and end of a fight a key could fire both bars at once or neither. Both bars now read one shared answer for who owns the plain number keys: the combat bar whenever it is on screen, the utility bar otherwise, and Shift always reaches the utility row.]]></description>
    </item>
    <item>
      <title>User Interface: The combat bar drew its glyphs at 48 pixels, the same size as the utility icons, instead…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-0ae7ef9811bc</guid>
      <pubDate>Mon, 27 Jul 2026 06:12:22 -0500</pubDate>
      <description><![CDATA[The combat bar drew its glyphs at 48 pixels, the same size as the utility icons, instead of their designed 56. The rows looked identical and the hand came out about 15 percent small. Each row now uses its own size again, 46 for utility and 56 for combat.]]></description>
    </item>
    <item>
      <title>User Interface: Hiding and re-showing the interface disconnected the hotbar from screen changes: after…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-948bca175a74</guid>
      <pubDate>Mon, 27 Jul 2026 06:12:23 -0500</pubDate>
      <description><![CDATA[Hiding and re-showing the interface disconnected the hotbar from screen changes: after one hide it stopped re-centring on resolution or interface scale changes, and the invisible layer it sits on began catching clicks meant for the world. Both are re-armed every time the interface comes back.]]></description>
    </item>
    <item>
      <title>User Interface: The top right corner buttons drew no icons on the newest build: the converted interface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e6126b641eb6</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:32 -0500</pubDate>
      <description><![CDATA[The top right corner buttons drew no icons on the newest build: the converted interface loaded art from a short hand-copied list, none of the corner icon names were on it, and a miss was silent. Icons now come straight out of the old interface texture atlas at conversion time, and a missing icon writes a warning to the log.]]></description>
    </item>
    <item>
      <title>User Interface: The window selector button did nothing when clicked: its handler still asked the old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-43daecda3a02</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:33 -0500</pubDate>
      <description><![CDATA[The window selector button did nothing when clicked: its handler still asked the old input system whether a click was in progress, which is never true for the new interface. The same dead check was removed from character rotation on the character, inspect and pet sheets.]]></description>
    </item>
    <item>
      <title>User Interface: With auto hide on, the top right buttons hid once and never came back. The row now fades…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d2feb471a833</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:33 -0500</pubDate>
      <description><![CDATA[With auto hide on, the top right buttons hid once and never came back. The row now fades out instead of leaving the screen, so hovering the corner restores it. The community and help icons also render again with their tooltips.]]></description>
    </item>
    <item>
      <title>User Interface: The Crown Shop button could go dead with nothing in the log. Window open and close…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-235e63d4caca</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:44 -0500</pubDate>
      <description><![CDATA[The Crown Shop button could go dead with nothing in the log. Window open and close failures now clean up after themselves and record which check stopped them, so a report of a dead button comes with its reason.]]></description>
    </item>
    <item>
      <title>User Interface: A long narrow blank window could cut across the screen and could not be moved or closed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-22626d11f101</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:45 -0500</pubDate>
      <description><![CDATA[A long narrow blank window could cut across the screen and could not be moved or closed. It was a window position saved before the window had ever been laid out; bad positions are now refused on save and discarded on load, and the first login cleans up ones already saved wrong.]]></description>
    </item>
    <item>
      <title>User Interface: The character sheet lost all of its statistics: the equipment row refused to shrink and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-11798977faeb</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:45 -0500</pubDate>
      <description><![CDATA[The character sheet lost all of its statistics: the equipment row refused to shrink and pushed the whole stats area below the window edge at short heights. The stats, the Show More button and the adventurer and producer levels on the title are back, and the character picture rotates again.]]></description>
    </item>
    <item>
      <title>User Interface: Opened the next stage of the interface migration: the list framework and the input layer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-b63bb894f273</guid>
      <pubDate>Mon, 27 Jul 2026 10:43:25 -0500</pubDate>
      <description><![CDATA[Opened the next stage of the interface migration: the list framework and the input layer, the two shared pieces every converted window still leans on. The reading behind it moved five assumptions the plan had made, and turned up a setting that has quietly done nothing for weeks.]]></description>
    </item>
    <item>
      <title>User Interface: The invert-scroll-wheel option turned out to do nothing in any window that has moved to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e5f393d15b98</guid>
      <pubDate>Mon, 27 Jul 2026 10:43:30 -0500</pubDate>
      <description><![CDATA[The invert-scroll-wheel option turned out to do nothing in any window that has moved to the new interface: it was only ever wired to the old one. Fixing it leads the batch.]]></description>
    </item>
    <item>
      <title>User Interface: The Invert Scroll Wheel setting now works in every window that has moved to the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e70a79166e27</guid>
      <pubDate>Mon, 27 Jul 2026 11:14:26 -0500</pubDate>
      <description><![CDATA[The Invert Scroll Wheel setting now works in every window that has moved to the new interface. It had only ever been connected to the old one, so switching it on reversed some lists and left the rest alone.]]></description>
    </item>
    <item>
      <title>User Interface: Took the old interface out of the shared list code that handles searching and sorting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-feaffdd91059</guid>
      <pubDate>Mon, 27 Jul 2026 11:29:58 -0500</pubDate>
      <description><![CDATA[Took the old interface out of the shared list code that handles searching and sorting. Those two run on every keystroke and every column click and had nothing to do with drawing, so they were keeping the old library alive in lists that draw nothing.]]></description>
    </item>
    <item>
      <title>User Interface: Every window converted to the new interface had been drawing its list twice: the copy you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-a842db61ee47</guid>
      <pubDate>Mon, 27 Jul 2026 11:55:24 -0500</pubDate>
      <description><![CDATA[Every window converted to the new interface had been drawing its list twice: the copy you see, plus a complete hidden copy in the old interface that was rebuilt on every refresh. An inventory list showing 28 rows across 6 columns was carrying about 170 old-interface pieces and now carries 13.]]></description>
    </item>
    <item>
      <title>User Interface: Right-clicking something in the world now opens the same menu as right-clicking a row in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-c0994178f5ba</guid>
      <pubDate>Mon, 27 Jul 2026 12:11:36 -0500</pubDate>
      <description><![CDATA[Right-clicking something in the world now opens the same menu as right-clicking a row in a list. The world was the last thing still using the old menu, so the two had looked and behaved differently since the lists moved across.]]></description>
    </item>
    <item>
      <title>User Interface: A confirmation box now takes the typing cursor with it. Before, keystrokes still went…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-a50f161f31ce</guid>
      <pubDate>Mon, 27 Jul 2026 12:11:45 -0500</pubDate>
      <description><![CDATA[A confirmation box now takes the typing cursor with it. Before, keystrokes still went into the window behind the box even though you could not see or click it.]]></description>
    </item>
    <item>
      <title>User Interface: Closed the list framework off the old interface. The plan had it as a rewrite onto a new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-ac9f0ef05643</guid>
      <pubDate>Mon, 27 Jul 2026 12:15:27 -0500</pubDate>
      <description><![CDATA[Closed the list framework off the old interface. The plan had it as a rewrite onto a new list control; reading it showed that was never needed, because converted windows have drawn their own rows for weeks. What was left was the hidden second copy, and that is what went.]]></description>
    </item>
    <item>
      <title>User Interface: You can now click a creature or player floating name to target them, and right-click it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-ca01d6b88645</guid>
      <pubDate>Mon, 27 Jul 2026 13:54:16 -0500</pubDate>
      <description><![CDATA[You can now click a creature or player floating name to target them, and right-click it for their menu. Clicking through a name to whatever is behind it still works, which is why the names stay untouchable to the interface and are measured by hand instead.]]></description>
    </item>
    <item>
      <title>User Interface: All 77 converted windows came off the old interface window class. It looked like they…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-1cc14883ba1e</guid>
      <pubDate>Mon, 27 Jul 2026 13:55:06 -0500</pubDate>
      <description><![CDATA[All 77 converted windows came off the old interface window class. It looked like they needed it; reading what the window framework actually asks for turned out to be five things, so those became a small interface and the inheritance went away. That clears the old window frame, mover and resizer for deletion.]]></description>
    </item>
    <item>
      <title>User Interface: The combat reticle turned out to be smaller work than recorded: the markers that follow…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-18bc5d3d4e81</guid>
      <pubDate>Mon, 27 Jul 2026 14:07:30 -0500</pubDate>
      <description><![CDATA[The combat reticle turned out to be smaller work than recorded: the markers that follow your target are never actually drawn. They exist to hold a number that feeds the glow on the character, which is the thing you see. The planned replacement would have drawn nothing, so the arithmetic moved out instead.]]></description>
    </item>
    <item>
      <title>Housing: Published a home decorating improvement plan: twenty-six proposals covering the tools of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-bbbd169a9644</guid>
      <pubDate>Mon, 27 Jul 2026 06:32:50 -0500</pubDate>
      <description><![CDATA[Published a home decorating improvement plan: twenty-six proposals covering the tools of placement, from failure messages and default keybinds to an undo stack, marquee multi-select, copy transform, magnet snap, a free placement mode, a decorator camera, and blueprints with seasonal layout slots. The illustrated version is public at <a href="https://catnipgames.net/blog/proposals/decorating/">catnipgames.net/blog/proposals/decorating/</a> with a comment thread and vote arrows on every proposal.]]></description>
    </item>
    <item>
      <title>Housing: The plan is built on a fresh read of the demand: about one hundred of the three hundred…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-28d5de73d38b</guid>
      <pubDate>Mon, 27 Jul 2026 06:33:02 -0500</pubDate>
      <description><![CDATA[The plan is built on a fresh read of the demand: about one hundred of the three hundred wishlist forum threads posted since January 2025 are decoration asks, and roughly ninety were catalogued for this review, from the July snap-alignment thread to the ten-name access list complaint. One rule holds across all twenty-six cards: tools change how you place, never what you may place. Limits and permissions stay on in every proposed mode.]]></description>
    </item>
    <item>
      <title>Housing: The review also surfaced work that needs no vote: dungeon NPC allowances are computed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-ae1983ffb47a</guid>
      <pubDate>Mon, 27 Jul 2026 06:33:15 -0500</pubDate>
      <description><![CDATA[The review also surfaced work that needs no vote: dungeon NPC allowances are computed from the wrong per-point value, six named bowls accept no contents, the placement system already writes a reason for every rejection and then hides it behind a developer flag, and about 1,750 decorations from this month's mirror-flip audit still wait on per-item fixes. Each is carded as a fix or a scheduled workstream in the plan.]]></description>
    </item>
    <item>
      <title>Housing: Entering decoration mode showed no decoration interface on chaos. The strip is back on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-368ec998f72d</guid>
      <pubDate>Mon, 27 Jul 2026 09:32:45 -0500</pubDate>
      <description><![CDATA[Entering decoration mode showed no decoration interface on chaos. The strip is back on the new interface: allowance meters with counts on hover, the permissions summary and its options button, the indicators checkbox, and pin and close controls.]]></description>
    </item>
    <item>
      <title>Infrastructure: The test shard now backs up to a separate machine on the local network. The game database…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-64e9e1660a4a</guid>
      <pubDate>Mon, 27 Jul 2026 08:13:09 -0500</pubDate>
      <description><![CDATA[The test shard now backs up to a separate machine on the local network. The game database copies every four hours and the whole server copies nightly, both encrypted at rest. Before this there were no off-server backups at all, so a drive failure would have taken the database, the account records and the server configuration with it.]]></description>
    </item>
    <item>
      <title>Infrastructure: Each night the backup is opened and started as a working database on the backup machine…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-b4d5cb9b7d2e</guid>
      <pubDate>Mon, 27 Jul 2026 08:13:10 -0500</pubDate>
      <description><![CDATA[Each night the backup is opened and started as a working database on the backup machine, then checked for the expected number of records before the copy is kept. A backup that exists is therefore one that has already been restored at least once, rather than one we assume would work.]]></description>
    </item>
    <item>
      <title>Infrastructure: Backups were built to stay out of the way of play. The heavy work runs on the backup…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-4c94a19078d5</guid>
      <pubDate>Mon, 27 Jul 2026 08:13:10 -0500</pubDate>
      <description><![CDATA[Backups were built to stay out of the way of play. The heavy work runs on the backup machine instead of the game server, transfers are speed limited and run at low priority, and a four-hour database copy finishes in about five seconds.]]></description>
    </item>
    <item>
      <title>Testing: The automated test suite is fully green for the first time in weeks: 4,343 checks, no…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-a08ee110bad7</guid>
      <pubDate>Mon, 27 Jul 2026 10:42:26 -0500</pubDate>
      <description><![CDATA[The automated test suite is fully green for the first time in weeks: 4,343 checks, no failures. Six had been failing long enough that anything new would have read as "the usual six", so each was fixed at the cause instead of by moving the expectation. Two were real defects. Lot storage cards were drawn shorter than the three lines of text they always hold, so the bottom line was sliced through the letters. And two colours for a selected list row never reached the four alternate interface looks, so a selected row painted with the default look's blue no matter which look you picked.]]></description>
    </item>
    <item>
      <title>Testing: Three of the six were the tests themselves being wrong. One pinned the exact size of a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-283303584af5</guid>
      <pubDate>Mon, 27 Jul 2026 10:42:41 -0500</pubDate>
      <description><![CDATA[Three of the six were the tests themselves being wrong. One pinned the exact size of a window that had since been resized on purpose, so it now checks the rule it exists for: a container opens clear of the backpack rather than on top of it. Another hand-checks a spell's damage against the audit tool, but only counted damage the spell deals directly, and one of Chaos Bolt's branches deals its damage through a follow-on effect, which left the hand figure 37% under the tool. The frame rate limit setting also had a label that was never registered for translation.]]></description>
    </item>
    <item>
      <title>Build &amp; Release: The build farm lost its editor licence at the monthly expiry mark, which failed a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-dbda9653c0b1</guid>
      <pubDate>Mon, 27 Jul 2026 11:38:25 -0500</pubDate>
      <description><![CDATA[The build farm lost its editor licence at the monthly expiry mark, which failed a release: the checks passed and then every client build stopped a few seconds after startup. Renewed the seat and wrote down the symptom, the renewal steps, and which account can actually perform it.]]></description>
    </item>
    <item>
      <title>New Player Experience: Researched the new player experience end to end. Mapped every teaching beat in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-86dd7120462d</guid>
      <pubDate>Mon, 27 Jul 2026 11:58:52 -0500</pubDate>
      <description><![CDATA[Researched the new player experience end to end. Mapped every teaching beat in the current starting scene and the original Isle of Storms flow, catalogued which game systems are taught, shown, or never covered, and traced how the start changed across releases since 2013.]]></description>
    </item>
    <item>
      <title>New Player Experience: Compared how 13 other games teach their openings and wrote the findings into an internal…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-20e2549ae4b7</guid>
      <pubDate>Mon, 27 Jul 2026 11:58:53 -0500</pubDate>
      <description><![CDATA[Compared how 13 other games teach their openings and wrote the findings into an internal deep dive with a staged teaching plan and a proposal for short in-game tutorial videos.]]></description>
    </item>
    <item>
      <title>Combat: Four Death Magic bonuses (Death Ray Damage, Banish Undead Damage, Summoned Death Creature…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-67faead66ad3</guid>
      <pubDate>Mon, 27 Jul 2026 17:06:03 -0500</pubDate>
      <description><![CDATA[Four Death Magic bonuses (Death Ray Damage, Banish Undead Damage, Summoned Death Creature Damage, Corpse Explosion Damage) were built on a different maths convention from the rest of the school, so a character with no gear granting them read <b>100%</b> on the character sheet while Death Touch Damage and Death Field Power correctly read 0%. All four now use the school convention, and an enchant granting +15% shows as 15% rather than 115%.]]></description>
    </item>
    <item>
      <title>Combat: The old form also meant the bonus was only ever set up for your own character. Read from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-dd1ceb333d23</guid>
      <pubDate>Mon, 27 Jul 2026 17:06:04 -0500</pubDate>
      <description><![CDATA[The old form also meant the bonus was only ever set up for your own character. Read from anywhere else it came back as zero, and because it was a bare multiplier that took the whole damage figure to zero with it. The new form falls back to no bonus instead. Spell and summon damage is unchanged either way; the fix carries a pinned damage figure that fails loudly if it ever moves.]]></description>
    </item>
    <item>
      <title>Vendor search: Vendor search can now filter on how much of a stat an item has, not just whether it has…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-5bc0eefebc92</guid>
      <pubDate>Mon, 27 Jul 2026 14:32:03 -0500</pubDate>
      <description><![CDATA[Vendor search can now filter on how much of a stat an item has, not just whether it has any: chest armour with Strength at least 10 and Fire Attunement at least 5, sorted by the stat. Results can also be ordered by a stat's value.]]></description>
    </item>
    <item>
      <title>Vendor search: The stat filter list grew from 40 entries to about 75. Crafting, gathering and taming…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-71c5b841a0cd</guid>
      <pubDate>Mon, 27 Jul 2026 14:32:15 -0500</pubDate>
      <description><![CDATA[The stat filter list grew from 40 entries to about 75. Crafting, gathering and taming gear had no filter at all before, so blacksmithing, mining, fishing and taming bonuses are now searchable alongside combat stats.]]></description>
    </item>
    <item>
      <title>Vendor search: Ten item effects work out their value from whoever is wearing them, so no fixed number…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-5228d5dbbf51</guid>
      <pubDate>Mon, 27 Jul 2026 14:32:15 -0500</pubDate>
      <description><![CDATA[Ten item effects work out their value from whoever is wearing them, so no fixed number can be indexed. Those items still come back from a threshold search and are marked, rather than disappearing from results while the player can see the stat on the item in game.]]></description>
    </item>
    <item>
      <title>Vendor search: A mistyped stat name in a search now returns an error instead of quietly dropping the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-4221d746edf7</guid>
      <pubDate>Mon, 27 Jul 2026 14:32:15 -0500</pubDate>
      <description><![CDATA[A mistyped stat name in a search now returns an error instead of quietly dropping the filter and returning every item in the world.]]></description>
    </item>
    <item>
      <title>Tools: Fixed a scene-registry editor field that rewrote itself when drawn. The "Ransom Style"…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-e788b81827f8</guid>
      <pubDate>Mon, 27 Jul 2026 16:53:12 -0500</pubDate>
      <description><![CDATA[Fixed a scene-registry editor field that rewrote itself when drawn. The "Ransom Style" dropdown read a value the code had already overridden and wrote that overridden value straight back, so opening the registry on a location was enough to change what it said. Roughly half the catalogue has been rewritten this way over the years; the field now shows and keeps what was actually set.]]></description>
    </item>
    <item>
      <title>Combat: Weapon tooltips print the damage range the game actually rolls. The tooltip and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-83895cc6b192</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:55 -0500</pubDate>
      <description><![CDATA[Weapon tooltips print the damage range the game actually rolls. The tooltip and the combat roll carried separate sets of numbers, and the tooltip's were twice as wide in both directions: a Longsword read 5 to 16 against a real 8.25 to 13.75. No weapon changed, only the label, so the printed low number rises and the high number falls on every weapon in the game. A test now fails if the two ever drift apart again.]]></description>
    </item>
    <item>
      <title>Skills: Ward skills carry the icon of the school they ward against. Every ward was showing the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-bc5118d36f7e</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:55 -0500</pubDate>
      <description><![CDATA[Ward skills carry the icon of the school they ward against. Every ward was showing the specialization icon of the tree it sits in, so Air Warding, which grants resistance to air, wore the Earth icon and looked identical to the mastery skill directly above it. Ward Magic, which wards all nine schools, takes the Resist Magic icon.]]></description>
    </item>
    <item>
      <title>Maps: Zone map captures stopped dropping geometry and water. The capture camera was reading…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-7aa8b917c8aa</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:55 -0500</pubDate>
      <description><![CDATA[Zone map captures stopped dropping geometry and water. The capture camera was reading baked visibility data authored for a player standing on the ground while looking straight down from fifty metres above the scene, which is how Graff Island lost its docks. The pass that draws water was also matching a water system that is no longer in the project, so lakes baked as their own bed and East Vauban Foothills showed its submerged castle. Both fixed; the affected scenes still need recapturing.]]></description>
    </item>
    <item>
      <title>Maps: Gathering nodes stop putting markers on the zone map. A resource carrying quest data was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-2edc0ce25c85</guid>
      <pubDate>Mon, 27 Jul 2026 18:17:55 -0500</pubDate>
      <description><![CDATA[Gathering nodes stop putting markers on the zone map. A resource carrying quest data was being swept into the map location list as a point of interest, which put ore and cotton pointers across Vauban Pass.]]></description>
    </item>
    <item>
      <title>Maps: Zone maps now draw the water instead of the ground under it. Graff Island was drawn as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-38e325bea0cf</guid>
      <pubDate>Mon, 27 Jul 2026 20:09:26 -0500</pubDate>
      <description><![CDATA[Zone maps now draw the water instead of the ground under it. Graff Island was drawn as though the sea around it were dry land, with its docks lost in the same gap, and East Vauban Foothills showed the castle sitting in the bottom of an empty lake basin. The seas and the large lakes are built at run time, so the map tool had nothing to photograph and quietly baked the seabed; it now paints them from the waterline the game itself uses.]]></description>
    </item>
    <item>
      <title>Maps: Fixed the same fault running the other way: river and pond surfaces are flat panels that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-9a6c6d276651</guid>
      <pubDate>Mon, 27 Jul 2026 20:09:27 -0500</pubDate>
      <description><![CDATA[Fixed the same fault running the other way: river and pond surfaces are flat panels that hang past their banks, and drawing them whole laid rectangles of blue across dry ground. Vauban Pass carried a 150m square of water over its hills, left behind by a panel belonging to another zone. Water on maps is now cut to the land it actually covers, with a carve-out for rivers running downhill, which have no single waterline.]]></description>
    </item>
    <item>
      <title>Maps: Recaptured and shipped the three affected zone maps: Graff Island, East Vauban Foothills…</title>
      <link>https://catnipgames.net/blog/week-2026-07-27.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-27-d70f1b7e6b51</guid>
      <pubDate>Mon, 27 Jul 2026 20:09:27 -0500</pubDate>
      <description><![CDATA[Recaptured and shipped the three affected zone maps: Graff Island, East Vauban Foothills and Vauban Pass.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-26</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-headlines</guid>
      <pubDate>Sun, 26 Jul 2026 21:46:05 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Forty-five silent NPCs got their voices back, starting with <b>Eugena</b> in Solace Bridge.</li>
        <li>Nameplates are readable again: the dark edge that kept names legible had been eating the letters instead of backing them, and the text is back to its authored size at every distance.</li>
        <li>Ten more windows off the old interface in one batch: crafting, the skill tree, the deck builder, the glyph collection, the emote bar, mail and every book and seasonal card. Nine rows left, all of them subsystems.</li>
        <li><b>Chat is on the new interface.</b> Log, text box and tab strip all moved together, since the two interfaces stack as whole layers and a half-converted window would not clip to its own frame. Tabs, names, font sizes, channel filters and the pinned state all carry over. Window position resets once. Tearing a tab out into its own window was unavailable for a few hours and is back.</li>
        <li>The compass got its look back and learned the wind: the fancy lettering and bracket frame returned, and a new arrow tracks the heading flags stream to, with a GM command to steer a whole scene's wind.</li>
        <li>Published a twenty-eight-item <b>taming improvement plan</b>: pet combat measured against Ultima Online and the pet classes since, pairing an open rebalance of passive pet power, level cap bug fix included, with a pet ability bar, real stances, a revived Veterinarian, and a Bond system, open for comment and voting at <a href="https://catnipgames.net/blog/proposals/taming/">Taming Deep Dive</a>.</li>
        <li>The <strong>combat bar</strong> is on the new interface, with the combat hand and the decoration strip that share its frame. Five pieces of the old interface left, and only two of them can be picked up on their own.</li>
        <li>Three proposal pages went up for the gear bench: <a href="https://catnipgames.net/blog/proposals/enhancement/">the enhancement chain</a>, <a href="https://catnipgames.net/blog/proposals/weapons/">weapons</a> and <a href="https://catnipgames.net/blog/proposals/armor/">armor</a>. The headline finding is that maximum durability was never a condition meter, it is the enhancement budget, and a crafted one-handed weapon can absorb five failures in its whole life.</li>
        <li>Taming collars stop going No Trade for good when a pet dies. The collars players already have stuck in their banks are tradeable again with no action needed.</li>
        <li>Recipe book fixed for a tester report the same day: its page controls had opened below the bottom edge of the screen at a raised UI size, and a search that matched nothing froze the book on whatever page it was showing.</li>
        <li>Three crafting table fixes: the item list no longer empties when you filter your inventory, the capacity line stops reporting items that are not there, and choosing a recipe no longer deletes it from the craftable list.</li>
        <li>The <strong>combat bar</strong> and utility bar are fixed the same day a tester reported them. Both rows had come up pinned to the left edge of the screen, the combat slots empty, and a second copy of the glyphs stuck below under a permanent cooldown wash. Three separate faults from the day the bar moved over.</li>
        <li>The <strong>in-game HUD is off the old interface</strong>, closing the biggest single item on the migration list. Sixteen surfaces moved and no prefab was edited to do it. Four rows left, one of them ungated.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Filed a player suggestion from the forums: options to lock and reset UI window position…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-a814460b75e5</guid>
      <pubDate>Sun, 26 Jul 2026 03:20:11 -0500</pubDate>
      <description><![CDATA[Filed a player suggestion from the forums: options to lock and reset UI window position and size after an accidental drag or resize.]]></description>
    </item>
    <item>
      <title>Community: The work log header now has a Proposals link collecting design proposals that are open…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-1ed9e54561f0</guid>
      <pubDate>Sun, 26 Jul 2026 14:38:13 -0500</pubDate>
      <description><![CDATA[The work log header now has a Proposals link collecting design proposals that are open for public comment. Each proposal on the inventory page grew its own Discussion box plus an up or down vote (one vote per person, click again to take it back), so feedback on one idea stays with that idea.]]></description>
    </item>
    <item>
      <title>UI: The crafting station moved to the new interface, the first of the two windows that close…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-eb41497c11f9</guid>
      <pubDate>Sun, 26 Jul 2026 06:06:52 -0500</pubDate>
      <description><![CDATA[The crafting station moved to the new interface, the first of the two windows that close out crafting. Recipes on the left as cards showing your ingredient counts live, the table in the middle with the station art, your tool, the batch controls and the progress bar, and your inventory on the right. The window class and its lifecycle stayed put, so everything wired to it, including the close guard that refuses to shut the window mid-craft and sweeps the table back into your bag, runs unchanged. The recipe search box, category filter, Only craftable filter and the lot storage option all carried over.]]></description>
    </item>
    <item>
      <title>UI: The crafting recipe book followed the station onto the new interface, which closes out…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-6354ab520290</guid>
      <pubDate>Sun, 26 Jul 2026 06:29:09 -0500</pubDate>
      <description><![CDATA[The crafting recipe book followed the station onto the new interface, which closes out crafting: every crafting window is now on the new UI. The book kept its shape, two facing pages, the table of contents, the Crafting Basics pages, chapter pages with category links, and four recipes per spread with live ingredient counts, plus the page turn sound and the page you left it on. The page structure came out as a tested model on the way, which also fixed a quiet defect: jumping to a recipe while a search was active could land on the wrong page. About 36,000 lines of old window data were deleted with it.]]></description>
    </item>
    <item>
      <title>UI: Groundwork for the skill tree window: the tree layout, tile positions on the grid and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-96d5b916ec3c</guid>
      <pubDate>Sun, 26 Jul 2026 06:34:08 -0500</pubDate>
      <description><![CDATA[Groundwork for the skill tree window: the tree layout, tile positions on the grid and the connector pieces that join them, now comes out of the skill graph as plain data with the maths under test, and a new canvas element renders it with pan and scroll. The graph and the auto layout code did not move. The sign convention is the part worth testing: the tree grid grows downward, the old UI flipped it for its upward coordinate space, and the new one must not flip it or every school renders upside down.]]></description>
    </item>
    <item>
      <title>UI: The skill tree window and its tiles moved to the new interface. Tabs for adventuring and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-62b7bc5eb455</guid>
      <pubDate>Sun, 26 Jul 2026 06:53:43 -0500</pubDate>
      <description><![CDATA[The skill tree window and its tiles moved to the new interface. Tabs for adventuring and crafting, the schools as a row of buttons, and the tree itself on a canvas you can pan and scroll, with each tile carrying its level, session change, progress, training mode and trainer cost as before. The state machine behind the window, which decides what a trainer will teach you and which school you are looking at, was left alone and now just hands the view its answer. Two defects turned up in the wiring: the old tree told its own panel to become visible, which would have painted a floating copy of the old window over the game, and freshly built tiles arrived with live click zones that the window sweeps at startup, before those tiles exist.]]></description>
    </item>
    <item>
      <title>UI: Planned the next batch of interface work, and it is chat. The chat window and the NPC…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7e986b70da05</guid>
      <pubDate>Sun, 26 Jul 2026 09:17:20 -0500</pubDate>
      <description><![CDATA[Planned the next batch of interface work, and it is chat. The chat window and the NPC conversation window convert together, because both run on the same base class, so porting that once covers both. Reading the code first moved the estimate: message formatting is already independent of the display, and the link parser and chat log that the hardest part needs already shipped alongside the custom NPC story window. Two things the notes called risks are smaller than recorded, and the scrollback limit is one of them. One question gets bought before anything is built on it, whether text fields on the new interface can carry Japanese and Chinese input composition at all.]]></description>
    </item>
    <item>
      <title>UI: Answered the one question that could have changed the shape of the chat conversion. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-3e904e312ea0</guid>
      <pubDate>Sun, 26 Jul 2026 09:28:59 -0500</pubDate>
      <description><![CDATA[Answered the one question that could have changed the shape of the chat conversion. The new interface text fields can do what item linking needs: rewriting what is in the box and putting the cursor back, from inside the handler that reacts to the edit, runs once, does not loop, and holds through a redraw. So the chat input gets built on the new interface rather than kept on the old one behind a wrapper. Japanese and Chinese input composition turned out not to be a design question at all, because the framework handles it internally with nothing to hook, which moves it from something to engineer around to something a person has to sit down and type at.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the bookkeeping behind linking an item into chat. A line being typed exists twice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-2c9ec53ace35</guid>
      <pubDate>Sun, 26 Jul 2026 09:36:13 -0500</pubDate>
      <description><![CDATA[Rebuilt the bookkeeping behind linking an item into chat. A line being typed exists twice over, as the version the server receives with the full item tag in it and the version in the box showing just the item name, and the old code held those together with two lists of positions nudged by hand on every keystroke. Positions can fall out of step, which is a whole category of bug, so the new model does not store positions at all: a line is a list of runs, each either typed text or one whole link, and both versions are just those runs joined up. Edits arrive as a comparison of before and after, which handles typing, backspace, delete, paste, cut and typing over a selection under one rule, and makes moving the cursor a non-event. The old rules were kept on purpose, including that editing into the middle of a link removes the link rather than leaving a broken one. 29 tests cover it. Nothing is wired to it yet, which is the point of landing it on its own.]]></description>
    </item>
    <item>
      <title>UI: Wired chat item linking to the new model and deleted what it replaced: 251 lines of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0ed27ad2c445</guid>
      <pubDate>Sun, 26 Jul 2026 09:52:40 -0500</pubDate>
      <description><![CDATA[Wired chat item linking to the new model and deleted what it replaced: 251 lines of hand-rolled position arithmetic became 49. Out with it went the two lists of positions, the frame-late sampling of what the player had selected, and all three checks that existed to spot those positions drifting before they broke something. A line held as runs cannot drift, so there is nothing left to spot. One old annoyance goes away for free rather than being fixed: editing a selection while an item was linked used to throw away the whole line and put it back, because the old code could not work out what had happened. Two edge cases were deliberately dropped and both are in the tester notes, including a stray bracket that could show up on the last item linked in a line. A length check that measured against an empty line instead of the real one is also corrected. Full test suite green against the known baseline.]]></description>
    </item>
    <item>
      <title>UI: Fixed a colouring bug in the new chat rendering, found while planning the chat conversion…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-09d4a52e6360</guid>
      <pubDate>Sun, 26 Jul 2026 10:00:22 -0500</pubDate>
      <description><![CDATA[Fixed a colouring bug in the new chat rendering, found while planning the chat conversion and live today in the custom NPC conversation window. A chat line gets wrapped in its channel colour, and a clickable link inside that line splits it into pieces, so the colour opened at the start was being closed at the end of the first piece and never picked back up. The link and every word after it on that line came out plain white. Lines without a link looked fine, which is why it read as a link problem. The fix already existed for something else entirely: the code that lets a book keep its formatting across a page break answers exactly the same question, so it now carries the open tags across the pieces of a chat line as well. Nested colours come back in the right order and a colour the line already closed stays closed. 12 tests, including the bug itself from both sides.]]></description>
    </item>
    <item>
      <title>UI: Put the chat text box behind a single shared piece. Chat was reaching into the old text…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-965c6215c58b</guid>
      <pubDate>Sun, 26 Jul 2026 10:24:29 -0500</pubDate>
      <description><![CDATA[Put the chat text box behind a single shared piece. Chat was reaching into the old text widget from about seventy places, but only ever using twelve things from it, so those twelve are now one small contract and the several thousand lines of command parsing, channel routing and history above the box no longer know what kind of field it is. That is what lets the box itself be replaced next without any of that moving. The event wiring got tidied in the process: text, submit and focus arrived in three different shapes for no chosen reason, and are one shape now. Six tests hold the seam shut, checking that the rest of chat never names the widget again. No behaviour change intended, and the full suite is green against the known baseline.]]></description>
    </item>
    <item>
      <title>UI: Built the chat text box on the new interface. It sits behind the contract added earlier…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-544ff34cf881</guid>
      <pubDate>Sun, 26 Jul 2026 10:53:45 -0500</pubDate>
      <description><![CDATA[Built the chat text box on the new interface. It sits behind the contract added earlier, so the thousands of lines of command parsing and channel routing above it carry on without knowing the box changed underneath them. Two things the new framework has no equivalent for are absorbed here rather than pushed upwards: filtering characters as they are typed, and anything to do with Japanese and Chinese input composition, which the framework handles internally with nothing to hook. It also carries the fix for a problem that would otherwise appear the moment the box goes live, where pressing return to send would also reopen chat on the same frame. 13 tests run against a real live panel, and the first of them exists purely so that a future engine version quietly changing the behaviour this was designed around fails loudly instead. Three of those tests failed on the first run and were right to: an empty box on the new interface has no cursor at all and ignores attempts to place one, which is a trap for every future window that puts the cursor back after rewriting text, so it is written up.]]></description>
    </item>
    <item>
      <title>UI: Deleted the dead Discord integration out of the chat code. It was built behind two build…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-9558bba41a59</guid>
      <pubDate>Sun, 26 Jul 2026 12:05:28 -0500</pubDate>
      <description><![CDATA[Deleted the dead Discord integration out of the chat code. It was built behind two build switches that are not turned on in any build and never have been, so none of it has ever run for a player. That is 24 guarded blocks across the tab, the tabbed window and the chat base, plus three whole classes for a channel list nothing could open, checked by asset id rather than by name to be sure no prefab still pointed at them. About 500 lines gone. Two things stay on purpose: the manager object is still created at startup, so retiring the rest of it is its own job, and the Discord channel type stays alongside each tab saved channel settings, because those describe what an existing player tab filter means on disk and changing them would change the meaning of settings people already have.]]></description>
    </item>
    <item>
      <title>UI: Pulled the chat tab strip layout out into a tested model: which tabs fit the bar, where…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-daa99ab11ec6</guid>
      <pubDate>Sun, 26 Jul 2026 12:14:04 -0500</pubDate>
      <description><![CDATA[Pulled the chat tab strip layout out into a tested model: which tabs fit the bar, where each one sits, and which slot a tab you are dragging drops into. It was all arithmetic hiding behind transforms. Three oddities were kept on purpose and each has a test saying so, because a tab bar that quietly reflows differently after a port is the sort of thing nobody reports and everybody notices. The selected tab always shows even when it alone is wider than the bar, and the row of tabs grows rightwards from it before it grows leftwards, which is what makes picking an off-screen tab scroll the row onto it. 13 tests.]]></description>
    </item>
    <item>
      <title>UI: Container rows in chests and bags printed their contents count twice, in two different…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-170b3fb929bd</guid>
      <pubDate>Sun, 26 Jul 2026 12:51:49 -0500</pubDate>
      <description><![CDATA[Container rows in chests and bags printed their contents count twice, in two different formats: a bag holding 21 of 42 read <em>Buildings (21/42) (21 / 42)</em>. Two code paths were both writing it. The shared one keeps the job; the table view now only reports containers that have no limit, which is the case the shared one says nothing about.]]></description>
    </item>
    <item>
      <title>UI: The same duplication one column over: a stack of 12 torches showed (12) after the name…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-34a744003e2b</guid>
      <pubDate>Sun, 26 Jul 2026 12:51:59 -0500</pubDate>
      <description><![CDATA[The same duplication one column over: a stack of 12 torches showed <em>(12)</em> after the name and 12 again in the Quantity column. The list rows the table view replaced had no quantity column, so the count was written into the name; the table has one, and now asks for the name without it.]]></description>
    </item>
    <item>
      <title>UI: Escape opened the Options menu and then would not close it. The input check gives up the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0574856e825d</guid>
      <pubDate>Sun, 26 Jul 2026 12:51:59 -0500</pubDate>
      <description><![CDATA[Escape opened the Options menu and then would not close it. The input check gives up the moment the pointer is over UI, and the rebuilt Options window covers the screen with a click-catching veil, so every Escape after the first was dropped. The Escape handling now runs outside that check. The confirmation popups, which use the same veil, were ignoring Escape for the same reason and now close too.]]></description>
    </item>
    <item>
      <title>UI: Bags sort to the top of the inventory again. The UI Toolkit window ran the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e076ce090a9e</guid>
      <pubDate>Sun, 26 Jul 2026 12:57:54 -0500</pubDate>
      <description><![CDATA[Bags sort to the top of the inventory again. The UI Toolkit window ran the same comparison the old window did but asked it not to lift containers, and it did not sort at all until you clicked a column heading. Bags now group at the top the moment the window opens, under every column sort including Quantity, and rows with the same name stop swapping places on each refresh.]]></description>
    </item>
    <item>
      <title>UI: New Show Objects in Containers checkbox under the inventory search box. Ticked, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-cd67680590ac</guid>
      <pubDate>Sun, 26 Jul 2026 12:58:01 -0500</pubDate>
      <description><![CDATA[New <b>Show Objects in Containers</b> checkbox under the inventory search box. Ticked, the window lists what is inside each bag alongside the bags themselves, so a whole pack reads as one list. The setting persists and works on chests and other containers; the quick-loot window is unchanged.]]></description>
    </item>
    <item>
      <title>UI: Finished the chat log on the new interface, ahead of the window itself moving onto it. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-24f41df81bbb</guid>
      <pubDate>Sun, 26 Jul 2026 13:06:05 -0500</pubDate>
      <description><![CDATA[Finished the chat log on the new interface, ahead of the window itself moving onto it. It now stops at 300 lines the way the old one did, rather than growing a row per message for a whole session, and it only follows new messages down when you are already reading the newest one. Before, scrolling up to read something back on a busy channel was pointless, because the next line to arrive pulled you straight to the bottom again. The copy and translate commands got their line accessors back too, including an old quirk where asking to copy the whole log hands back everything except the oldest line. That is kept deliberately and has a test saying so, since changing it would change what those commands do for people who already use them.]]></description>
    </item>
    <item>
      <title>UI: Put the chat log behind the same kind of contract the text box got earlier, so the window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-283dd1355bc6</guid>
      <pubDate>Sun, 26 Jul 2026 13:06:06 -0500</pubDate>
      <description><![CDATA[Put the chat log behind the same kind of contract the text box got earlier, so the window can swap the old view for the new one without the chat logic above it changing. The part that drops a linked item into what you are typing is not drawing work, so it stays where it is and runs the same on both paths. Also added the way chat will ask which of its windows is in front: the old answer comes from a part of the old framework that a converted window never builds, so it would have failed outright the moment chat moved across. 20 tests.]]></description>
    </item>
    <item>
      <title>UI: Built the chat window itself on the new interface: the frame, the tab strip, the message…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-63578281bc24</guid>
      <pubDate>Sun, 26 Jul 2026 13:14:54 -0500</pubDate>
      <description><![CDATA[Built the chat window itself on the new interface: the frame, the tab strip, the message log, the text box and the channel prompt, assembled into one piece. Nothing uses it yet. The next step is the one players see, and keeping it separate means that step is a wiring change rather than a wiring change plus a new window arriving at the same time. The tab strip is the first real user of the layout rules pulled out earlier, and it has to work differently to get the same answer: the new framework only knows how wide a tab is after it has laid it out, so the strip draws them all, measures, then hides the ones that did not fit. Two smaller things were caught on the way. The window would have opened refusing to shrink as small as it used to, because the shared frame has a larger minimum than chat was built with. And the fade that hides chat when you stop using it asks whether the mouse is over the window, in a way that only understands the old framework, so left alone it would have faded the window out from under your cursor. 15 tests.]]></description>
    </item>
    <item>
      <title>UI: Wrote the piece that retires the old drawing from a converted window without taking its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-152fd319e39b</guid>
      <pubDate>Sun, 26 Jul 2026 13:25:09 -0500</pubDate>
      <description><![CDATA[Wrote the piece that retires the old drawing from a converted window without taking its scripts with it, ahead of chat switching over. Two mistakes are easy to make here and both have bitten before. Sweeping the old panels alone leaves the individual widgets behind, and a leftover widget builds itself a fresh panel the moment it wakes, so the interface you just retired comes back. Going the other way and deleting whole objects takes working code with them: on a chat tab, the thing that opens the tab options window sits underneath a piece of decoration, so deleting the decoration deletes the options window. It now deletes objects that are nothing but drawing and strips the drawing off everything else in place. 9 tests. Also finished the last two seams chat needs, so the switch itself is a wiring change. One of them settled a real ordering trap: the window, the chat logic and the log view all start up on the same object in an order the engine does not promise, so none of them can ask whether the new interface exists yet and get a stable answer on the first frame. A message arriving in that gap would have been drawn into things that had already been deleted. They now all ask the same fixed question instead.]]></description>
    </item>
    <item>
      <title>UI: Chat is on the new interface. The log, the text box and the tab strip had to move…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-558b4f52b3f6</guid>
      <pubDate>Sun, 26 Jul 2026 13:59:48 -0500</pubDate>
      <description><![CDATA[<b>Chat is on the new interface.</b> The log, the text box and the tab strip had to move together, because the two interfaces stack against each other as whole layers, so a half-converted chat window would not have clipped to its own frame. It now has the same frame, title bar, pin and close button as the other rebuilt windows, and resizes from the corner grip. Your tabs, their names, their font sizes and the channels each one shows all carry over, and so does whether the window was pinned. Window position and size reset once: the old and new frames store that in different coordinate systems, and reusing the old numbers would have put windows in the wrong place, which is worse than starting from a default. Set it once and it stays. One thing is temporarily missing and is next: dragging a tab out of the window to make a second one, or onto another window to merge them. Reordering tabs inside a window works.]]></description>
    </item>
    <item>
      <title>UI: Four things would each have broken chat on the first frame, and are worth writing down…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-51f8034511ee</guid>
      <pubDate>Sun, 26 Jul 2026 13:59:49 -0500</pubDate>
      <description><![CDATA[Four things would each have broken chat on the first frame, and are worth writing down because three of them are traps for every window still to be converted. Asking which window is in front reads a piece of the old framework that a converted window never builds, and it fails outright rather than returning nothing: seven places asked. Pressing return to send also re-opened chat on the same frame, because the input gate deliberately lets return through so other windows can use it to confirm. The fade that hides chat when you stop using it asks whether the mouse is over the window in a way that only understands the old framework, so it would have faded the window out from under your cursor. And the six chat windows would have shared one saved position between them and stacked on top of each other. 14 new tests, four of which run the real teardown against the real window and tab files, which is the part nothing else would have caught: strip too little and the old window draws over the new one, strip too much and the tab options window loses the thing that opens it.]]></description>
    </item>
    <item>
      <title>UI: Closed the chat window and chat tab rows on the interface migration list, which closes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ced6e3078381</guid>
      <pubDate>Sun, 26 Jul 2026 14:01:39 -0500</pubDate>
      <description><![CDATA[Closed the chat window and chat tab rows on the interface migration list, which closes the chat area of it. The tab row had two things recorded against it that turned out not to exist: there is no per-tab unread marker and no per-tab scrollback anywhere in the chat code. A tab is a filter, a channel to send on, a name and a font size, and one log serves the whole window, so switching tabs re-derives the view from the shared history. That is why the tab folded into the window instead of being its own job.]]></description>
    </item>
    <item>
      <title>UI: Reviewed the inventory system against Ultima Online and the modern games that solved bag…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e4b6286b86ba</guid>
      <pubDate>Sun, 26 Jul 2026 14:22:58 -0500</pubDate>
      <description><![CDATA[Reviewed the inventory system against Ultima Online and the modern games that solved bag management, and wrote a sixteen-item improvement plan: search that understands weight, value, durability and item state, a column picker, one-row category tabs, quick deposit into matching chests, junk marking with a sell-all button at merchants, and container colour tags among them.]]></description>
    </item>
    <item>
      <title>UI: The full illustrated proposal is public at catnipgames.net/blog/proposals/inventory and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-02a0ea645778</guid>
      <pubDate>Sun, 26 Jul 2026 14:23:32 -0500</pubDate>
      <description><![CDATA[The full illustrated proposal is public at <a href="https://catnipgames.net/blog/proposals/inventory/">catnipgames.net/blog/proposals/inventory</a> and takes comments with no account needed. Tell us which of the sixteen you want first.]]></description>
    </item>
    <item>
      <title>UI: Restored the compass strip's authored look after the UI Toolkit port dropped it: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-29e19a277ddc</guid>
      <pubDate>Sun, 26 Jul 2026 16:34:29 -0500</pubDate>
      <description><![CDATA[Restored the compass strip's authored look after the UI Toolkit port dropped it: the fancy font is back on all four text lines, the zone line went back to its authored 20px size (the port had it at the theme's 16px, which is what made town names and POT sizes read small), the black halo behind the text returned, and the bracket frame draws around the strip again.]]></description>
    </item>
    <item>
      <title>UI: The Solo/Private/Offline line under the compass is back; the port had left it writing to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ff6ed27598c5</guid>
      <pubDate>Sun, 26 Jul 2026 16:34:29 -0500</pubDate>
      <description><![CDATA[The Solo/Private/Offline line under the compass is back; the port had left it writing to a widget that no longer existed.]]></description>
    </item>
    <item>
      <title>UI: New wind arrow on the compass: it sits at the heading the wind blows toward, the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0042e9d87e8c</guid>
      <pubDate>Sun, 26 Jul 2026 16:34:29 -0500</pubDate>
      <description><![CDATA[New wind arrow on the compass: it sits at the heading the wind blows toward, the same heading flags stream to, parks at the strip's end when the wind is behind you, and shows the wind strength on hover. Outdoor scenes only.]]></description>
    </item>
    <item>
      <title>UI: Chat tabs keep their width when they are selected. Clicking a tab collapsed it to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-982ebd3c1efc</guid>
      <pubDate>Sun, 26 Jul 2026 17:32:51 -0500</pubDate>
      <description><![CDATA[Chat tabs keep their width when they are selected. Clicking a tab collapsed it to the width of its small options arrow while the name went on drawing at full length, so names spilled over the tabs either side and several ran together into one unreadable line. A tab now carries its name in its own label, and every tab reserves room for the arrow whether or not it is showing, so the row no longer changes shape as you click through it.]]></description>
    </item>
    <item>
      <title>UI: Two more fixes in the same tab row. A long tab name is shortened with an ellipsis instead…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-28a2faeccbd3</guid>
      <pubDate>Sun, 26 Jul 2026 17:32:52 -0500</pubDate>
      <description><![CDATA[Two more fixes in the same tab row. A long tab name is shortened with an ellipsis instead of pushing every other tab off the row, and dragging a tab to reorder it drops it where you let go. Drop positions had been worked out as though every tab were the width of the one being dragged, which held while a tab was a fixed-width sprite and stopped holding once tabs sized to their own names.]]></description>
    </item>
    <item>
      <title>UI: Added a test for the rule the bug broke: a tab may not carry both its own text and child…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-dff1db106cfa</guid>
      <pubDate>Sun, 26 Jul 2026 17:32:52 -0500</pubDate>
      <description><![CDATA[Added a test for the rule the bug broke: a tab may not carry both its own text and child buttons. The tests that already existed described the shape that caused it, and never ran a layout pass, so there was nothing for them to catch.]]></description>
    </item>
    <item>
      <title>UI: Fixed the name floating above player vendors, which had shrunk to about a tenth of its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-955cd713eb10</guid>
      <pubDate>Sun, 26 Jul 2026 18:17:24 -0500</pubDate>
      <description><![CDATA[Fixed the name floating above player vendors, which had shrunk to about a tenth of its size and read as a smudge at any normal distance. The label is built at load from the old one, and the new text renderer scales world text down by a factor of ten unless it is told the size is already in world units. Every hand-authored label in the game says so; the ones built at load did not. Names over cash registers and placed deco pets came back with it. Character and creature plates were never affected.]]></description>
    </item>
    <item>
      <title>UI: A tester found the new recipe book stuck on one page. Its back, forward, last-page and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-80e08efa113d</guid>
      <pubDate>Sun, 26 Jul 2026 19:23:22 -0500</pubDate>
      <description><![CDATA[A tester found the new recipe book stuck on one page. Its back, forward, last-page and contents buttons all sit in a row along the bottom of the window, and the book opened tall enough that on a 768-pixel-tall screen with the UI size setting at 1.25 that whole row landed 86 pixels below the edge, with the window too tall to drag up and nothing else in the book able to turn a page. The book now sizes itself to the interface area instead of the display, and every window is pulled back on screen when it opens or when the interface area changes, so a window whose saved size came from a bigger screen can no longer strand its controls out of reach.]]></description>
    </item>
    <item>
      <title>UI: The recipe book also froze on a search that matched nothing. A filter collapses the book…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-a591c650af22</guid>
      <pubDate>Sun, 26 Jul 2026 19:23:32 -0500</pubDate>
      <description><![CDATA[The recipe book also froze on a search that matched nothing. A filter collapses the book to matching recipes only, so a word none of your recipes contain left it with no pages at all, and the window drew nothing for that case: the old page stayed up, no message said the search came up empty, and the page buttons still looked live. An empty result now clears the page, says so, and greys the buttons. The book search matches the same text the crafting table filter matches, including the name of the item a recipe makes, and both now ignore stray spaces.]]></description>
    </item>
    <item>
      <title>Audio: Forty-five NPCs who had never spoken a word now have their voices. Eugena in Solace…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-640ffc09e274</guid>
      <pubDate>Sun, 26 Jul 2026 05:29:50 -0500</pubDate>
      <description><![CDATA[Forty-five NPCs who had never spoken a word now have their voices. Eugena in Solace Bridge was the one reported, but the same fault covered most of the Estgard and Harvest townsfolk, the Artifice barkers, three children in Resolute, two Superstition Canyon mages, Emilia in Sanctus Spine, Arnice DeMalo, and the Forgetful Ghost. Their audio was recorded under the wrong name, so the game asked for a voice that was filed somewhere else and heard nothing back.]]></description>
    </item>
    <item>
      <title>Audio: Added a guard on the casting tool so this cannot come back: it now reads an NPC prefab…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d9daccc8f757</guid>
      <pubDate>Sun, 26 Jul 2026 05:29:58 -0500</pubDate>
      <description><![CDATA[Added a guard on the casting tool so this cannot come back: it now reads an NPC prefab the way the game does, and a whole-tree sweep checks that every voice is filed under a name the game will actually ask for.]]></description>
    </item>
    <item>
      <title>Audio: Fireflies and Clumsy now play a sound when you cast them. Neither skill had any audio…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4a7e4acdc13a</guid>
      <pubDate>Sun, 26 Jul 2026 06:12:48 -0500</pubDate>
      <description><![CDATA[Fireflies and Clumsy now play a sound when you cast them. Neither skill had any audio authored on its effects, so both were silent every time regardless of how often you used them.]]></description>
    </item>
    <item>
      <title>Audio: The fix gave each skill its own cast effect rather than adding sound to the buff effect…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e6a9d3ac7bd0</guid>
      <pubDate>Sun, 26 Jul 2026 06:12:48 -0500</pubDate>
      <description><![CDATA[The fix gave each skill its own cast effect rather than adding sound to the buff effect they share with Absorb Impacts, Reckless Stance, Taunt and the armour bonuses, which would have handed the same noise to all of them. A test now holds that shared effect silent. Enfeeblement is silent for the same reason and is on the list.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Ported the shared hand-slot rendering (the icon, the two cooldown rings, the hotkey…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-893b5699d6a0</guid>
      <pubDate>Sun, 26 Jul 2026 07:20:02 -0500</pubDate>
      <description><![CDATA[Ported the shared hand-slot rendering (the icon, the two cooldown rings, the hotkey caption, the reagent counter, the stack count and success chance, and the mastery badges) to the new interface behind a per-prefab opt-in, so the deck builder's slots can move while the combat hand and the hotbar's ten icons stay untouched. Opting a slot in also drops the two cooldown sprite objects it used to create and stops its readouts refreshing at all while its window is closed.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Rebuilt the deck builder on the new interface: deck name, glyph and slug counts, the ten…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-85e9d705341b</guid>
      <pubDate>Sun, 26 Jul 2026 07:44:44 -0500</pubDate>
      <description><![CDATA[Rebuilt the deck builder on the new interface: deck name, glyph and slug counts, the ten hand slots with their assigned-glyph stacks and padlocks, the glyphs in the deck, the glyph and combo browser, and linked equipment. Every drag that worked before still works, including dragging a whole selection at once, and right clicking a glyph in the deck still takes it out.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Rebuilt the glyph collection window on the new interface, with the school filter gaining…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-91d7078018f2</guid>
      <pubDate>Sun, 26 Jul 2026 07:44:44 -0500</pubDate>
      <description><![CDATA[Rebuilt the glyph collection window on the new interface, with the school filter gaining All and None buttons. Both it and the deck builder now render their lists through one shared piece of code instead of each restating columns, colours, sorting, tooltips and drag; hovering a row finally shows the full glyph tooltip rather than just its name.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Rebuilt the emote bar on the new interface as a strip you can drag anywhere, turn between…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7f25d6afbc1f</guid>
      <pubDate>Sun, 26 Jul 2026 07:55:04 -0500</pubDate>
      <description><![CDATA[Rebuilt the emote bar on the new interface as a strip you can drag anywhere, turn between upright and along the bottom, and put away. It remembers where you left it and which way round it was. The main hotbar shares the same slot code and is deliberately untouched: the rendering port is opted into one prefab at a time, and a test holds the hotbar to that.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Rebuilt the mail window on the new interface: the inbox and the piece you are reading…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-55ff8cb8202c</guid>
      <pubDate>Sun, 26 Jul 2026 08:09:21 -0500</pubDate>
      <description><![CDATA[Rebuilt the mail window on the new interface: the inbox and the piece you are reading side by side, then the recipient picker and the writing screen. All of the rules stayed where they were, including sending one copy each to several people at once, the per-recipient fee, and the item and gold limits. The two discard prompts now use the same confirmation box as the rest of the game, Always Discard included.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Rebuilt the book window on the new interface, which covers books, letters, sheet music…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e6e59c9e2229</guid>
      <pubDate>Sun, 26 Jul 2026 08:22:58 -0500</pubDate>
      <description><![CDATA[Rebuilt the book window on the new interface, which covers books, letters, sheet music, lot decoration logs and every seasonal card at once, since all eleven share one script. Reading, chapters, pictures, writing a book by hand or loading it from a file, and publishing all work the way they did; the page layout itself is untouched, so a book breaks its pages exactly where it used to.]]></description>
    </item>
    <item>
      <title>World: Monsters in six player dungeon rooms could not move once they appeared. The Hilt Basement…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-fec6901e5118</guid>
      <pubDate>Sun, 26 Jul 2026 06:56:58 -0500</pubDate>
      <description><![CDATA[Monsters in six player dungeon rooms could not move once they appeared. The Hilt Basement spider room had 16 of its 33 spider spawn points sitting off the walkable ground, and the Ravensmoor lich room, The Fall throne hall, The Rise dog room, The Rise library and the Lyceum room had almost no walkable ground recorded at all. The walkable ground for all of them has been rebuilt, so spiders chase from where they appear and monsters in the other rooms can path across the whole room.]]></description>
    </item>
    <item>
      <title>Tools: The player dungeon navigation baker was rebuilding walkable ground from where a room used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-142a6541b17a</guid>
      <pubDate>Sun, 26 Jul 2026 06:57:07 -0500</pubDate>
      <description><![CDATA[The player dungeon navigation baker was rebuilding walkable ground from where a room used to be. Ten room pieces are authored rotated or offset, and the baker moved them to the origin without letting the physics system catch up first, so it recorded ground for the old position. Rooms that happened to be authored square were unaffected, which is why it went unnoticed for so long.]]></description>
    </item>
    <item>
      <title>Tools: The NPC voice casting tool now keeps a voice with the character it was cast for when a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-10ddda26925a</guid>
      <pubDate>Sun, 26 Jul 2026 08:16:42 -0500</pubDate>
      <description><![CDATA[The NPC voice casting tool now keeps a voice with the character it was cast for when a name stops covering both sexes. Previously the remaining character could inherit the voice belonging to the one that moved out, which is how a boy ended up cast with a female voice.]]></description>
    </item>
    <item>
      <title>Tools: Turned the inventory proposal work into a repeatable playbook: the research recipe, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-56b53d2a2740</guid>
      <pubDate>Sun, 26 Jul 2026 14:52:05 -0500</pubDate>
      <description><![CDATA[Turned the inventory proposal work into a repeatable playbook: the research recipe, the page format, the build tooling, and the discussion and voting machinery are all captured, so the next system that needs this treatment gets it in a fraction of the time.]]></description>
    </item>
    <item>
      <title>Testing: Read back through every tester verification task the last deploy sweep had marked ready…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-adb0feea46aa</guid>
      <pubDate>Sun, 26 Jul 2026 07:36:45 -0500</pubDate>
      <description><![CDATA[Read back through every tester verification task the last deploy sweep had marked ready to test and found 53 where the testers had already run the pass and reported the change still failing. Those tasks are now set to Feedback with a note on each one, so nobody is asked to redo work they already wrote up.]]></description>
    </item>
    <item>
      <title>Testing: The at-deploy sweep now reads the comments before it announces anything. A task is held…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4940416c8b05</guid>
      <pubDate>Sun, 26 Jul 2026 07:36:46 -0500</pubDate>
      <description><![CDATA[The at-deploy sweep now reads the comments before it announces anything. A task is held back when the newest tester comment came after the fix was written, reads as a failure report, and nobody has answered it yet. Held tasks are listed with the commenter and the failing line instead of going out to testers.]]></description>
    </item>
    <item>
      <title>Testing: The chaos deploy now tells the testers itself. Marking verification tasks live was a hand…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7cf3ba554b53</guid>
      <pubDate>Sun, 26 Jul 2026 07:52:43 -0500</pubDate>
      <description><![CDATA[The chaos deploy now tells the testers itself. Marking verification tasks live was a hand step that only happened when someone was there to do it, which is how one nightly release left 39 tasks hidden from the board. The deploy script does it at the moment the build goes live, and a background check every fifteen minutes covers anything that path misses.]]></description>
    </item>
    <item>
      <title>Testing: The in-game task board only ever showed the newest 100 open tasks, so with 376 open the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-a62dbc6162ef</guid>
      <pubDate>Sun, 26 Jul 2026 09:18:38 -0500</pubDate>
      <description><![CDATA[The in-game task board only ever showed the newest 100 open tasks, so with 376 open the rest had no way onto the screen. It now lists tasks by number, and typing a task number in the filter box pulls that task from the tracker even when it is not on the page.]]></description>
    </item>
    <item>
      <title>Testing: The board also reordered itself whenever a batch of old tasks got commented on, which…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4d1d85fe7515</guid>
      <pubDate>Sun, 26 Jul 2026 09:18:38 -0500</pubDate>
      <description><![CDATA[The board also reordered itself whenever a batch of old tasks got commented on, which pushed the newest testing directives off the one page it holds. Sorting by task number instead keeps new work at the top.]]></description>
    </item>
    <item>
      <title>Testing: The board's one-minute refresh used to clear the list, throwing away every row loaded…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4568de444056</guid>
      <pubDate>Sun, 26 Jul 2026 09:18:38 -0500</pubDate>
      <description><![CDATA[The board's one-minute refresh used to clear the list, throwing away every row loaded with Load more. It now folds the fresh page into the rows already on screen, so what a tester loaded stays loaded.]]></description>
    </item>
    <item>
      <title>Testing: Worked the whole tester bug queue, 55 reports that had been sitting without a reply, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-be084c9982d2</guid>
      <pubDate>Sun, 26 Jul 2026 14:07:42 -0500</pubDate>
      <description><![CDATA[Worked the whole tester bug queue, 55 reports that had been sitting without a reply, the oldest since the 11th. Seven turned out to be already fixed and closed against the check that covers them, one was withdrawn by the testers who filed it, and every one of the rest got an answer saying what we understand the report to be and that it is still open.]]></description>
    </item>
    <item>
      <title>Testing: Two merchant window checks went back to us rather than out to testers: a report filed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-46950cd96a4c</guid>
      <pubDate>Sun, 26 Jul 2026 14:07:42 -0500</pubDate>
      <description><![CDATA[Two merchant window checks went back to us rather than out to testers: a report filed against the current build lists several problems with that window, so asking anyone to test it again first would have wasted their time.]]></description>
    </item>
    <item>
      <title>Testing: The thirteen tests on the rebuilt bar all passed while it was drawing in the wrong place…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-b9426acc4f3a</guid>
      <pubDate>Sun, 26 Jul 2026 21:32:38 -0500</pubDate>
      <description><![CDATA[The thirteen tests on the rebuilt bar all passed while it was drawing in the wrong place with nothing in it, because every one of them read a setting off an element that was never laid out. Added a test that mounts the bar in a real panel and asserts where it actually lands, and another that drives the slot and checks the element changed rather than checking the element in isolation.]]></description>
    </item>
    <item>
      <title>User Interface: Fixed floating nameplates drawing their names as dark smears. The black edge that keeps a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-78a78a04d342</guid>
      <pubDate>Sun, 26 Jul 2026 08:16:29 -0500</pubDate>
      <description><![CDATA[Fixed floating nameplates drawing their names as dark smears. The black edge that keeps a name legible over bright scenery was being drawn inward from the letter edges, and at nameplate text sizes it filled the letters in completely; it now sits behind the letters the way it originally did, so colour tinted names on pets and friendly players read properly again.]]></description>
    </item>
    <item>
      <title>User Interface: Nameplate text is back to the sizes originally authored for it. The name, title and guild…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-73f4736b3cd8</guid>
      <pubDate>Sun, 26 Jul 2026 08:16:42 -0500</pubDate>
      <description><![CDATA[Nameplate text is back to the sizes originally authored for it. The name, title and guild lines had all been drawing smaller than intended, and the whole plate shrank as you walked toward it, so a nameplate now holds one apparent size at every distance it is visible at.]]></description>
    </item>
    <item>
      <title>User Interface: NPC conversations moved to the new interface. The window carries the same conversation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-84be3754e8da</guid>
      <pubDate>Sun, 26 Jul 2026 15:18:41 -0500</pubDate>
      <description><![CDATA[NPC conversations moved to the new interface. The window carries the same conversation log, text box and topic buttons, plus the goodbye button and the buy, bank, mail or training button an NPC offers. It can now be dragged and resized and remembers where you left it, where before it was fixed to one spot.]]></description>
    </item>
    <item>
      <title>User Interface: Every topic the NPC has is still there and in the same order, with the ones you have not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-5ec69aac1417</guid>
      <pubDate>Sun, 26 Jul 2026 15:18:42 -0500</pubDate>
      <description><![CDATA[Every topic the NPC has is still there and in the same order, with the ones you have not asked about yet first. Clicking a topic inside the conversation text works again as well.]]></description>
    </item>
    <item>
      <title>User Interface: Dragging a chat tab out of a window, or onto another window, works again. It had done…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-08783e448907</guid>
      <pubDate>Sun, 26 Jul 2026 15:18:43 -0500</pubDate>
      <description><![CDATA[Dragging a chat tab out of a window, or onto another window, works again. It had done nothing since the chat window moved across. A tab dragged out keeps its name, text size, channels and the channel it sends to, and dropping one onto another window now merges it whatever the tab count is instead of only when the window had a single tab left.]]></description>
    </item>
    <item>
      <title>User Interface: Planned the next stretch of the interface migration: the main in-game HUD, the last big…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-981c96f87dd7</guid>
      <pubDate>Sun, 26 Jul 2026 18:33:55 -0500</pubDate>
      <description><![CDATA[Planned the next stretch of the interface migration: the main in-game HUD, the last big piece that nothing else is waiting on. Reading the file it lives in moved three of our own notes about it, including that the targeting reticle it was supposed to contain is somewhere else entirely.]]></description>
    </item>
    <item>
      <title>User Interface: Found a bug while planning it. Hiding the interface for a screenshot fades the old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-55b3f6fd0cf6</guid>
      <pubDate>Sun, 26 Jul 2026 18:33:56 -0500</pubDate>
      <description><![CDATA[Found a bug while planning it. Hiding the interface for a screenshot fades the old interface out, and pieces already moved to the new one do not fade with it, so the charge bar, combat bar, equipped deck, party list and a few others have stayed on screen and kept swallowing clicks. That gets fixed before anything else in this stretch converts.]]></description>
    </item>
    <item>
      <title>User Interface: Hiding the interface for a screenshot now hides all of it. Parts of the interface have…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0063c834a5bf</guid>
      <pubDate>Sun, 26 Jul 2026 18:45:09 -0500</pubDate>
      <description><![CDATA[Hiding the interface for a screenshot now hides all of it. Parts of the interface have been moving to a new framework, and anything already moved was ignoring the hide key: the glyph charge bar, the combat bar, the equipped deck, the party list, the timers and the centre message banner all stayed on screen with everything else gone, and kept catching clicks meant for the world behind them.]]></description>
    </item>
    <item>
      <title>User Interface: The fix sits in the shared window base rather than in each piece, so the roughly…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d75bea8ff465</guid>
      <pubDate>Sun, 26 Jul 2026 18:45:10 -0500</pubDate>
      <description><![CDATA[The fix sits in the shared window base rather than in each piece, so the roughly ninety-six windows and overlays on the new framework all pick it up, and anything converted from here on gets it without anyone remembering to ask. A test now fails the build if someone adds a new one that neither inherits the behaviour nor opts out on purpose.]]></description>
    </item>
    <item>
      <title>User Interface: One case that needed handling on its own: hiding the interface while typing in chat used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e732b0174d96</guid>
      <pubDate>Sun, 26 Jul 2026 18:45:11 -0500</pubDate>
      <description><![CDATA[One case that needed handling on its own: hiding the interface while typing in chat used to be able to strand you, because the text box kept keyboard focus, hidden text boxes cannot be clicked away, and holding focus swallows the key that brings the interface back. Hiding now releases that focus.]]></description>
    </item>
    <item>
      <title>User Interface: Pulled the shared arithmetic behind the HUD progress bars into one tested piece, ahead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-89321118ef59</guid>
      <pubDate>Sun, 26 Jul 2026 18:52:51 -0500</pubDate>
      <description><![CDATA[Pulled the shared arithmetic behind the HUD progress bars into one tested piece, ahead of moving the casting bar, the free attack bar and the harvesting bar over. Six bars on screen use it and none of it had ever been covered by a test.]]></description>
    </item>
    <item>
      <title>User Interface: Writing the tests turned up a marker fade that has never worked the way it reads. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-f3af46b7a3c6</guid>
      <pubDate>Sun, 26 Jul 2026 18:52:52 -0500</pubDate>
      <description><![CDATA[Writing the tests turned up a marker fade that has never worked the way it reads. The code zeroes the marker out at the very bottom of the bar and then immediately overwrites that with a calculation that goes negative there, so the first line has never once run. The old renderer treated a negative value as invisible, which is what the dead line was for, so nothing looked wrong and nothing changes now, but it is written down.]]></description>
    </item>
    <item>
      <title>User Interface: The casting bar and the melee attack charge bar are on the new interface, the first two…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bf3bc733e15f</guid>
      <pubDate>Sun, 26 Jul 2026 19:02:31 -0500</pubDate>
      <description><![CDATA[The casting bar and the melee attack charge bar are on the new interface, the first two pieces of the main HUD to move. Both keep everything they did: the spell name and taming chance, the separate colours for a normal cast, a cast you can move during and an interrupted one, the pause before an interrupted bar fades, the per-tick marks and tick sounds on the attack bar, and the instant disappearance when a charge is cancelled.]]></description>
    </item>
    <item>
      <title>User Interface: The tick dividers on the attack bar were being placed by mixing two different coordinate…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-73da5223c948</guid>
      <pubDate>Sun, 26 Jul 2026 19:02:32 -0500</pubDate>
      <description><![CDATA[The tick dividers on the attack bar were being placed by mixing two different coordinate systems, so where they landed depended on your interface scale. They are evenly spaced along the bar now whatever the scale.]]></description>
    </item>
    <item>
      <title>User Interface: The control point capture meter, the resurrection shrine meter and the death countdown…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-216dcbce10dd</guid>
      <pubDate>Sun, 26 Jul 2026 19:11:57 -0500</pubDate>
      <description><![CDATA[The control point capture meter, the resurrection shrine meter and the death countdown moved to the new interface. With the casting and attack bars, the whole strip above the hotbar is now off the old one.]]></description>
    </item>
    <item>
      <title>User Interface: All three hid themselves through a call that fades the old interface panels underneath…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-74d4ba978f2b</guid>
      <pubDate>Sun, 26 Jul 2026 19:11:58 -0500</pubDate>
      <description><![CDATA[All three hid themselves through a call that fades the old interface panels underneath them, which does nothing once those panels are gone. Left alone it would have pinned all three permanently on screen with nothing in the logs to show why, so hiding now goes through the new view instead.]]></description>
    </item>
    <item>
      <title>User Interface: The death countdown needed care for a different reason: it is not only a readout. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-8e86cba88a96</guid>
      <pubDate>Sun, 26 Jul 2026 19:11:59 -0500</pubDate>
      <description><![CDATA[The death countdown needed care for a different reason: it is not only a readout. The same code that draws the seconds is what sends you back when they run out, so it keeps running whether or not it is on screen.]]></description>
    </item>
    <item>
      <title>User Interface: The harvesting bar is on the new interface: chopping, mining, fishing, filling a bucket…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bb1eaa2d97e5</guid>
      <pubDate>Sun, 26 Jul 2026 19:24:29 -0500</pubDate>
      <description><![CDATA[The harvesting bar is on the new interface: chopping, mining, fishing, filling a bucket and breaking things open all draw through it. It keeps the success chance line for resource nodes, the meticulous collection streak and its list of what you accumulated, and the pause an interrupted gather takes before fading.]]></description>
    </item>
    <item>
      <title>User Interface: It reuses the casting bar built two days earlier rather than getting its own, since it is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-9eca89087ca1</guid>
      <pubDate>Sun, 26 Jul 2026 19:24:30 -0500</pubDate>
      <description><![CDATA[It reuses the casting bar built two days earlier rather than getting its own, since it is the same widget underneath. The only thing it needed adding was a second line under the name for the success chance, which hides itself when there is nothing to show.]]></description>
    </item>
    <item>
      <title>User Interface: The floating damage and healing numbers moved to the new interface, which closes their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bb01c06b8786</guid>
      <pubDate>Sun, 26 Jul 2026 19:34:04 -0500</pubDate>
      <description><![CDATA[The floating damage and healing numbers moved to the new interface, which closes their own line on the migration list. They keep the same rise, fade, scatter and colours, still follow a moving target, and still turn off with the nameplates option.]]></description>
    </item>
    <item>
      <title>User Interface: This was the one piece of the HUD that has to work out where a point in the world lands…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e53e5cb6c420</guid>
      <pubDate>Sun, 26 Jul 2026 19:34:05 -0500</pubDate>
      <description><![CDATA[This was the one piece of the HUD that has to work out where a point in the world lands on your screen every frame, and it needed nothing new: the same helper the nameplates already use does the job, and all the numbers share the one drawing surface the nameplates share rather than each target getting its own.]]></description>
    </item>
    <item>
      <title>User Interface: One thing did have to change shape. Numbers are recycled rather than created fresh for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-583957f397c3</guid>
      <pubDate>Sun, 26 Jul 2026 19:34:06 -0500</pubDate>
      <description><![CDATA[One thing did have to change shape. Numbers are recycled rather than created fresh for each hit, and a recycled number moves between targets, so it now re-homes itself onto the current target every time it plays. Getting that wrong would have parked damage numbers over whoever you hit first, which only shows up in a fight with more than one thing in it.]]></description>
    </item>
    <item>
      <title>User Interface: The overworld readout moved to the new interface: the name of the place your marker is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-1dacd7ef42d5</guid>
      <pubDate>Sun, 26 Jul 2026 19:40:26 -0500</pubDate>
      <description><![CDATA[The overworld readout moved to the new interface: the name of the place your marker is standing on, its description, the tooltip listing what is inside, and the button that takes you in. Scenes closed for repairs still say so and still cannot be entered.]]></description>
    </item>
    <item>
      <title>User Interface: It is the first piece of this stretch of HUD work you can actually click, which flips the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e55b83040276</guid>
      <pubDate>Sun, 26 Jul 2026 19:40:27 -0500</pubDate>
      <description><![CDATA[It is the first piece of this stretch of HUD work you can actually click, which flips the rule the others follow. Everything converted so far deliberately ignores the mouse so a click reaches the world behind it; this one has to catch the mouse for its button and its tooltip, while the text inside it stays out of the way.]]></description>
    </item>
    <item>
      <title>User Interface: Your own health and focus bars, your target bars and your pet bars moved to the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bd865a20591e</guid>
      <pubDate>Sun, 26 Jul 2026 19:49:06 -0500</pubDate>
      <description><![CDATA[Your own health and focus bars, your target bars and your pet bars moved to the new interface. Name, title and guild line, the flash when you take damage or heal, buff icons, target name colours, and pet follow and attack state all carry over unchanged.]]></description>
    </item>
    <item>
      <title>User Interface: Dragging them is untouched on purpose. The drag still works the old way and your saved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-5ed2c199c5b2</guid>
      <pubDate>Sun, 26 Jul 2026 19:49:07 -0500</pubDate>
      <description><![CDATA[Dragging them is untouched on purpose. The drag still works the old way and your saved positions still load, so the new drawing pins itself to whatever the old drag moves. That bridge comes out when the drag itself converts.]]></description>
    </item>
    <item>
      <title>User Interface: One trap caught before it shipped: the routine that clears away old interface pieces also…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4d17075bad88</guid>
      <pubDate>Sun, 26 Jul 2026 19:49:08 -0500</pubDate>
      <description><![CDATA[One trap caught before it shipped: the routine that clears away old interface pieces also removes the invisible click targets underneath them, and the click target under each bar is exactly what dragging tests against. Using it here would have killed dragging with nothing in the logs to explain it, so these three use a narrower cleanup, and two tests now hold that line.]]></description>
    </item>
    <item>
      <title>User Interface: Closed the first half of the main HUD work. Eight things came off the old interface: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-af1d3828eb84</guid>
      <pubDate>Sun, 26 Jul 2026 19:51:14 -0500</pubDate>
      <description><![CDATA[Closed the first half of the main HUD work. Eight things came off the old interface: the casting bar, the melee charge bar, the control point meter, the resurrection shrine meter, the death countdown, the harvesting bar, the floating damage numbers and the player, target and pet status bars. The damage numbers close their own line on the migration list.]]></description>
    </item>
    <item>
      <title>User Interface: The premise this stretch was scoped on held: not one prefab was edited. Every piece of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0897a3ed9f86</guid>
      <pubDate>Sun, 26 Jul 2026 19:51:15 -0500</pubDate>
      <description><![CDATA[The premise this stretch was scoped on held: not one prefab was edited. Every piece of the HUD turned out to be the only copy of itself, so switching each one over is a line of code rather than a change to the 43,000-line file everything else shares. That kept the file everyone merges through completely untouched.]]></description>
    </item>
    <item>
      <title>User Interface: Still to come in the second half: the icon rows in the top right, the equipment status…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-54e08a53be4a</guid>
      <pubDate>Sun, 26 Jul 2026 19:51:16 -0500</pubDate>
      <description><![CDATA[Still to come in the second half: the icon rows in the top right, the equipment status panel, the frame rate and build labels, the drag rewrite for the status bars, and the component that wires the whole interface together.]]></description>
    </item>
    <item>
      <title>User Interface: The in-game HUD is off the old interface. The rest of it followed the bars: the equipment…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-18488feb508e</guid>
      <pubDate>Sun, 26 Jul 2026 21:45:03 -0500</pubDate>
      <description><![CDATA[The in-game HUD is off the old interface. The rest of it followed the bars: the equipment and encumbrance warnings, the mail, ransom and friend notices, the network trouble warning, the button row that slides in at the top right, the frame rate meter, the build label and the housing message banner. Dragging your status bars around also came off the physics system it was using to work out what you had grabbed.]]></description>
    </item>
    <item>
      <title>User Interface: That closes the biggest single item on the migration list. Four rows are left and only…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-18e003a44961</guid>
      <pubDate>Sun, 26 Jul 2026 21:45:04 -0500</pubDate>
      <description><![CDATA[That closes the biggest single item on the migration list. Four rows are left and only one of them, the Crown Store, can be picked up on its own; the rest wait on the login and character select screens, which go last because login must never break.]]></description>
    </item>
    <item>
      <title>User Interface: Some of that prefab stays on the old interface on purpose and is a different piece of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-9ba0a8618a66</guid>
      <pubDate>Sun, 26 Jul 2026 21:45:05 -0500</pubDate>
      <description><![CDATA[Some of that prefab stays on the old interface on purpose and is a different piece of work: the contextual help pop-ups, the party frame, the ninety window registrations, the cameras and character model rigs, and the master switch that still hides all of it when you hide the interface.]]></description>
    </item>
    <item>
      <title>Crafting: Fixed the Use lot storage checkbox on crafting tables, which drew above the recipe list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ce30530dec7d</guid>
      <pubDate>Sun, 26 Jul 2026 09:26:15 -0500</pubDate>
      <description><![CDATA[Fixed the <b>Use lot storage</b> checkbox on crafting tables, which drew above the recipe list but never took a click. It sat one row below the header divider, inside the recipe list background, which won the click instead. The checkbox row is now anchored to the header the way the rest of that header already was, so it also stops sliding down over the recipes when the window is resized. The label beside it now hides along with the checkbox at a station that is not on a lot.]]></description>
    </item>
    <item>
      <title>Crafting: Published a crafting improvement plan: twenty-two proposals covering the station window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d25508e6f119</guid>
      <pubDate>Sun, 26 Jul 2026 15:44:50 -0500</pubDate>
      <description><![CDATA[Published a crafting improvement plan: twenty-two proposals covering the station window, the recipe book, and the recipe system, measured against Ultima Online, Star Wars Galaxies, Final Fantasy XIV, World of Warcraft, Elder Scrolls Online, Guild Wars 2, and New World. Seventeen are client-only changes that need no server work.]]></description>
    </item>
    <item>
      <title>Crafting: Highlights: the station answers instantly when you change the table instead of waiting on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-95b973e662fe</guid>
      <pubDate>Sun, 26 Jul 2026 15:44:59 -0500</pubDate>
      <description><![CDATA[Highlights: the station answers instantly when you change the table instead of waiting on the server, Craft Again and Make Max buttons, a visible craft queue, search that understands ingredient and result names, a full materials breakdown on any recipe, and bulk salvage that respects item locks.]]></description>
    </item>
    <item>
      <title>Crafting: The illustrated version is public at catnipgames.net/blog/proposals/crafting with a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4a9aebcd7e14</guid>
      <pubDate>Sun, 26 Jul 2026 15:45:09 -0500</pubDate>
      <description><![CDATA[The illustrated version is public at <a href="https://catnipgames.net/blog/proposals/crafting/">catnipgames.net/blog/proposals/crafting</a> with a comment box and vote arrows on every proposal. Tell us which to build first; each crafting school gets its own deep dive later.]]></description>
    </item>
    <item>
      <title>Crafting: Published a deep dive on the masterwork and enchantment chain at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-00d6a20242ad</guid>
      <pubDate>Sun, 26 Jul 2026 17:46:14 -0500</pubDate>
      <description><![CDATA[Published a deep dive on the masterwork and enchantment chain at <a href="https://catnipgames.net/blog/proposals/enhancement/">/blog/proposals/enhancement/</a>, eighteen proposals with a vote and a comment thread on each. The audit behind it found that maximum durability is really the enhancement budget: every enhancement spends it, every failure spends 25 of it permanently, repairs never give any of it back, and the bench refuses to work below 30. A crafted one-handed weapon can absorb five failures in its entire life, so the ten-effect ceiling the system advertises has never been reachable by anyone.]]></description>
    </item>
    <item>
      <title>Crafting: Published a weapons deep dive at /blog/proposals/weapons/ , thirteen proposals covering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-092d55a530b4</guid>
      <pubDate>Sun, 26 Jul 2026 17:46:27 -0500</pubDate>
      <description><![CDATA[Published a weapons deep dive at <a href="https://catnipgames.net/blog/proposals/weapons/">/blog/proposals/weapons/</a>, thirteen proposals covering what is specific to weapons rather than the shared bench. Enchanting a bow, a crossbow or a shield currently offers three choices drawn from eleven, and all eleven are attributes whichever of the nine gems is spent. Both archery enchants in the game are fitted to swords, maces, spears and wands instead of anything that fires an arrow. Forty-eight unique weapon parts ship with their bonuses already written and no recipe makes a single one of them.]]></description>
    </item>
    <item>
      <title>Crafting: The armor deep dive and the weapons deep dive were written the same day and reached the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0c762102b6bb</guid>
      <pubDate>Sun, 26 Jul 2026 17:46:36 -0500</pubDate>
      <description><![CDATA[The armor deep dive and the weapons deep dive were written the same day and reached the same conclusions about the bench they share, so the duplicated proposals moved into the new <a href="https://catnipgames.net/blog/proposals/enhancement/">enhancement chain page</a> and the two content pages were trimmed to what is actually theirs. The armor page published earlier today as twenty proposals now carries seven, covering the worn suit: which pieces count toward the set bonus, the cliff where a broken piece protects for nothing, and what each piece is contributing. The weapons page carries thirteen. Nothing was dropped; the shared eighteen are all on the new page with their own votes.]]></description>
    </item>
    <item>
      <title>Crafting: Filed eight defects found while auditing weapons. Among them: the weapon tooltip…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-5238c1319246</guid>
      <pubDate>Sun, 26 Jul 2026 17:46:45 -0500</pubDate>
      <description><![CDATA[Filed eight defects found while auditing weapons. Among them: the weapon tooltip advertises a damage range twice as wide as the one combat actually rolls, so a longsword that reads 5 to 16 really rolls 8.25 to 13.75; and the crafted-effect section of an item tooltip decides what is a masterwork and what is an enchantment by matching English words, so the grouping and the failure tally quietly collapse on the Japanese and Chinese clients.]]></description>
    </item>
    <item>
      <title>Crafting: The crafting table's item pane no longer empties when you narrow the Show dropdown on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d867609a3401</guid>
      <pubDate>Sun, 26 Jul 2026 19:47:18 -0500</pubDate>
      <description><![CDATA[The crafting table's item pane no longer empties when you narrow the Show dropdown on your own inventory. Both panes were wired to one category filter and only the inventory pane had a control for it, so choosing a category hid the table's contents while the Capacity line went on counting them.]]></description>
    </item>
    <item>
      <title>Crafting: The crafting table's Capacity line now clears when the station releases the table. It was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d578840e0825</guid>
      <pubDate>Sun, 26 Jul 2026 19:47:20 -0500</pubDate>
      <description><![CDATA[The crafting table's Capacity line now clears when the station releases the table. It was reading back the last text written to it, so a pane that had already gone blank could still report three items sitting there.]]></description>
    </item>
    <item>
      <title>Crafting: With Only craftable ticked, choosing a recipe no longer removes it from the list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-fcf2903c3106</guid>
      <pubDate>Sun, 26 Jul 2026 19:47:28 -0500</pubDate>
      <description><![CDATA[With Only craftable ticked, choosing a recipe no longer removes it from the list. Choosing a recipe moves its ingredients out of your backpack onto the table, and the filter counted the backpack alone, so the recipe you picked and everything sharing its materials dropped out. The count includes the table now, and the recipe card stops reading 0 / 3 for ingredients sitting in front of you.]]></description>
    </item>
    <item>
      <title>Crafting: Choosing a recipe twice inside the 0.4 second double-click window now runs one staging…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-8e786c92b753</guid>
      <pubDate>Sun, 26 Jul 2026 19:47:28 -0500</pubDate>
      <description><![CDATA[Choosing a recipe twice inside the 0.4 second double-click window now runs one staging pass instead of two overlapping ones emptying and refilling the same table. Staging reports itself in chat as well, with the number of items moved and the recipe name.]]></description>
    </item>
    <item>
      <title>Crafting: Use lot storage now appears at every crafting station, greyed out with a tooltip where it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-c3f6646de7dc</guid>
      <pubDate>Sun, 26 Jul 2026 19:47:29 -0500</pubDate>
      <description><![CDATA[Use lot storage now appears at every crafting station, greyed out with a tooltip where it does not apply. It used to hide itself, which read as a missing feature. Seven crafting strings that had never been registered for translation went into the source database at the same time.]]></description>
    </item>
    <item>
      <title>Oracle: The Oracle kept answering as though a reported problem had never been reported. It could…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-f376ea18e5a7</guid>
      <pubDate>Sun, 26 Jul 2026 10:25:37 -0500</pubDate>
      <description><![CDATA[The Oracle kept answering as though a reported problem had never been reported. It could only see one of the tracker's four project areas, so it was looking at 475 of 2,302 reports. It now searches all of them: one test query went from 1 result to 38.]]></description>
    </item>
    <item>
      <title>Oracle: Asking the Oracle about a report by its number could never work, because the search it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-39fb25c576c1</guid>
      <pubDate>Sun, 26 Jul 2026 10:25:37 -0500</pubDate>
      <description><![CDATA[Asking the Oracle about a report by its number could never work, because the search it ran does not match on report numbers. A number is now a direct lookup.]]></description>
    </item>
    <item>
      <title>Oracle: The Oracle also skipped closed reports, so anything already fixed came back as never…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bdaa0bd643e6</guid>
      <pubDate>Sun, 26 Jul 2026 10:25:37 -0500</pubDate>
      <description><![CDATA[The Oracle also skipped closed reports, so anything already fixed came back as never reported. Closed reports are usually the answer to "is this known", and they are included now.]]></description>
    </item>
    <item>
      <title>Oracle: When the Oracle cannot search at all it now says so, rather than reporting that nothing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7c78f6ebb286</guid>
      <pubDate>Sun, 26 Jul 2026 10:25:37 -0500</pubDate>
      <description><![CDATA[When the Oracle cannot search at all it now says so, rather than reporting that nothing matched. The two came out as the same sentence before.]]></description>
    </item>
    <item>
      <title>Oracle: The daily cap on Oracle bug reports is gone on the live service. The cap was removed in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-1aac8b18b517</guid>
      <pubDate>Sun, 26 Jul 2026 17:14:15 -0500</pubDate>
      <description><![CDATA[The daily cap on Oracle bug reports is gone on the live service. The cap was removed in the code on 20 July, but the Oracle runs as its own service and had not been updated since 17 July, so players were still stopped at 5 reports a day. Testers reported hitting it, and the counters confirmed one player stopped at exactly 5 earlier that day. The service is now up to date and neither the per-player nor the service-wide daily limit applies.]]></description>
    </item>
    <item>
      <title>Oracle: The Oracle can find reports that already exist. It searches all four project areas…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-6f8ec7d57d80</guid>
      <pubDate>Sun, 26 Jul 2026 17:14:16 -0500</pubDate>
      <description><![CDATA[The Oracle can find reports that already exist. It searches all four project areas instead of one, treats a bare report number as a direct lookup, and includes closed reports. Its view of the tracker went from 475 reports to 2,334.]]></description>
    </item>
    <item>
      <title>Oracle: Raised the ceiling on how much work the Oracle can do across all players in an hour, from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d20ec7baefaf</guid>
      <pubDate>Sun, 26 Jul 2026 17:14:16 -0500</pubDate>
      <description><![CDATA[Raised the ceiling on how much work the Oracle can do across all players in an hour, from 600 to 1500. The ceiling counts reasoning steps rather than questions, and a question can use up to 8, so the old value could be spent by roughly 75 to 150 questions and then answer everyone with a busy message.]]></description>
    </item>
    <item>
      <title>Launcher: Read the automatic crash reports for the current build. The one crash wave in the whole…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-20b0708423de</guid>
      <pubDate>Sun, 26 Jul 2026 12:48:29 -0500</pubDate>
      <description><![CDATA[Read the automatic crash reports for the current build. The one crash wave in the whole store was last night's build, already fixed and shipped; the current build came back clean, with a 75-minute session and no errors at all. Details below.]]></description>
    </item>
    <item>
      <title>Launcher: Every crash report the Linux client has ever sent was a false alarm - 25 of them, one per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-c44192575bf0</guid>
      <pubDate>Sun, 26 Jul 2026 12:48:29 -0500</pubDate>
      <description><![CDATA[Every crash report the Linux client has ever sent was a false alarm - 25 of them, one per launch, and 20 ended with a completely normal quit. The launcher decides a session went badly when the game left no clean-exit marker, and on Linux it was never finding the settings file that marker lives in. It now checks the places that file can be, records which one answered so the next report says so outright, and treats an unreadable settings file as "we do not know" rather than "it crashed".]]></description>
    </item>
    <item>
      <title>Client: Pulled a day of shard logs and de-duplicated them: 182 error lines collapsed to seven…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-268653f313df</guid>
      <pubDate>Sun, 26 Jul 2026 13:44:50 -0500</pubDate>
      <description><![CDATA[Pulled a day of shard logs and de-duplicated them: 182 error lines collapsed to seven distinct problems. Splitting them by client build did the rest of the work, since the two oldest builds accounted for 179 of those lines across 29 sessions and the three newest for one line across 21. Three of the seven were already fixed and just had not reached those clients yet.]]></description>
    </item>
    <item>
      <title>Client: Fixed the four that were left. A window resize handle could throw partway through a drag…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-1e0f4479a3ac</guid>
      <pubDate>Sun, 26 Jul 2026 13:44:59 -0500</pubDate>
      <description><![CDATA[Fixed the four that were left. A window resize handle could throw partway through a drag on windows with no resizable parent, dungeon room links stopped being built when a doorway sat outside the navmesh, and a half-built link then threw on every navmesh update for the rest of the session.]]></description>
    </item>
    <item>
      <title>Client: The floating name labels over vendors, registers and pets were logging a missed typeface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0663b29d8b6b</guid>
      <pubDate>Sun, 26 Jul 2026 13:45:00 -0500</pubDate>
      <description><![CDATA[The floating name labels over vendors, registers and pets were logging a missed typeface lookup 258 times a day. The registry loads from one place and the nameplate prefabs from another, so each held its own copy of the same font file and the lookup compared them by identity. It only ever worked because the fallback happened to be the row it failed to find.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-26</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-images</guid>
      <pubDate>Sun, 26 Jul 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/InventoryProposalBackpackMockup.png" data-full="https://catnipgames.net/blog/images/InventoryProposalBackpackMockup.png" alt="Mockup of the proposed backpack window from the inventory improvement plan: search box with filter tokens, one row of category tabs, a lock column, a NEW marker on fresh loot, and weight and gold readouts">
        <img src="https://catnipgames.net/blog/images/crafting-proposal-composed-mockup.png" data-full="https://catnipgames.net/blog/images/crafting-proposal-composed-mockup.png" alt="Mockup of the proposed crafting station window from the crafting improvement plan: favorites and sort on the recipe list, a materials source selector, an expanded shopping-list card, instant success chances, a Max button, and a visible craft queue">
        <img src="https://catnipgames.net/blog/images/alchemy-proposal-hero.jpg" data-full="https://catnipgames.net/blog/images/alchemy-proposal-hero.jpg" alt="Title card of the alchemy deep dive: an oil painting of a candlelit alchemist workshop with shelves of glowing potions behind the page title">
        <img src="https://catnipgames.net/blog/images/alchemy-proposal-consumables-strip.png" data-full="https://catnipgames.net/blog/images/alchemy-proposal-consumables-strip.png" alt="Mockup of the proposed consumables strip from the alchemy improvement plan: a Consumable Power meter, food and drink slot counters, and active buff timers">
      </div>]]></description>
    </item>
    <item>
      <title>Roadmap: Re-synced the public roadmap page against what is actually running on the test shard. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d1a9a5bcc50d</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:32 -0500</pubDate>
      <description><![CDATA[Re-synced the public roadmap page against what is actually running on the test shard. It had not had a content pass since July 8 while 358 commits landed, so it was promising work for October that players have had for weeks. <b>Done now</b> went from 12 items to 22, split under Platform and In the game headings.]]></description>
    </item>
    <item>
      <title>Roadmap: The whole-game interface rebuild got its first entry on the page. 157 of 181 screens are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e458463dc24a</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:33 -0500</pubDate>
      <description><![CDATA[The whole-game interface rebuild got its first entry on the page. 157 of 181 screens are converted and it has been on by default with no opt-out for a while now, but the roadmap had never mentioned it.]]></description>
    </item>
    <item>
      <title>Roadmap: Replaced "German and Portuguese translations complete" with the eight languages that ship…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bb7c9c0dd150</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:33 -0500</pubDate>
      <description><![CDATA[Replaced "German and Portuguese translations complete" with the eight languages that ship today: German, French, Spanish, Italian, Portuguese, Russian, Simplified Chinese and Japanese. Re-measured the database to check the claim first, and NPC dialogue is 66,792 of 66,792 lines in every one of them.]]></description>
    </item>
    <item>
      <title>Roadmap: Bumped "100+ bugs and exploits fixed" to 300+, which is the 304 bug reports now closed on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-c3235cbaa6ca</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:44 -0500</pubDate>
      <description><![CDATA[Bumped "100+ bugs and exploits fixed" to 300+, which is the 304 bug reports now closed on the tracker. Tavern games and community add-on sharing moved out of the future list, where both still read "In development now" long after they shipped.]]></description>
    </item>
    <item>
      <title>Roadmap: Added Done entries for the native Linux and Mac clients, automatic crash reports, search…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d5ac85690668</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:45 -0500</pubDate>
      <description><![CDATA[Added Done entries for the native Linux and Mac clients, automatic crash reports, search all my stuff, the gathering mini-game, the tip jar, ground levelling for lots and houses, and paired dancing.]]></description>
    </item>
    <item>
      <title>Roadmap: The October list dropped from 7 items to 5. Three of them stayed put because they have…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ea75d4fe8aaf</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:45 -0500</pubDate>
      <description><![CDATA[The October list dropped from 7 items to 5. Three of them stayed put because they have not shipped: the priority-one combat balance pass, self-service player support, and crash alerting. Crash reports already arrive on their own, so that one split into a Done entry for the reports and an October entry for the alerting on top.]]></description>
    </item>
    <item>
      <title>Roadmap: Checked every Done entry against the build the shard is actually running before…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-00cbd95f712e</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:46 -0500</pubDate>
      <description><![CDATA[Checked every Done entry against the build the shard is actually running before publishing, since that tab promises everything on it is playable right now. Today's commits, including the chat window, are described as October work instead.]]></description>
    </item>
    <item>
      <title>Roadmap: Corrected three internal docs that contradicted the new page: four "not on chaos yet"…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-2c73940a0e3e</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:56 -0500</pubDate>
      <description><![CDATA[Corrected three internal docs that contradicted the new page: four "not on chaos yet" notes for features that have been live since build 58, a note claiming the <b>/balance</b> client had never shipped when it went out on June 25, and a translation coverage snapshot whose "nothing is stale" and "the gap is all books" lines had both stopped being true.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-32c6eb22a1b3</guid>
      <pubDate>Sun, 26 Jul 2026 15:08:56 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/roadmap-refresh-2026-07-26.png" alt="The refreshed Done now tab on the public roadmap page"></div>]]></description>
    </item>
    <item>
      <title>Images: The weapon enchant line with the squares in agreement, left to right Ignite Weapon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d55a356d6e8f</guid>
      <pubDate>Sun, 26 Jul 2026 15:10:46 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/weapon-enchant-icons-frost-shock.png" data-full="https://catnipgames.net/blog/images/weapon-enchant-icons-frost-shock.png" alt="The three weapon enchant glyphs side by side, each with a blue square border and a different colour circle inside"></div>The weapon enchant line with the squares in agreement, left to right <b>Ignite Weapon</b>, <b>Frost Weapon</b> and <b>Shock Weapon</b>. Blue square on all three because all three are self buffs, with the school colour still on the circle inside: red for Fire, icy blue for Water, yellow for Air.]]></description>
    </item>
    <item>
      <title>Images: Compass restored look + wind arrow</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bde8479a6c15</guid>
      <pubDate>Sun, 26 Jul 2026 16:34:40 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/compass-restored-look-wind-arrow.png" data-full="https://catnipgames.net/blog/images/compass-restored-look-wind-arrow.png" data-cap="The compass with its restored lettering, bracket frame and the new wind arrow, rendered in the editor preview." alt="Compass strip with bracket frame, wind arrow, and restored text lines" loading="lazy"><span class="cap">Compass restored look + wind arrow</span>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7948dd6cdd7d</guid>
      <pubDate>Sun, 26 Jul 2026 17:18:36 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/armor-proposal-composed-station.png" alt="Mockup of the proposed enhancement panel at the blacksmithing station from the enhancement chain plan: a durability budget bar, the full odds ladder with a practice bonus, the bonus pool with costs, a focus selector, and a priced certain-work button"><img src="https://catnipgames.net/blog/images/armor-proposal-hero.jpg" alt="Title card of the armor deep dive: an oil painting of a blacksmith at night fitting a plate cuirass onto an armor stand beside a glowing forge"></div>]]></description>
    </item>
    <item>
      <title>Images: The chat tab row with the fix in. Universe is the selected tab, carrying the options…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-fecfa289b08b</guid>
      <pubDate>Sun, 26 Jul 2026 17:33:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/chat-tab-strip-fixed.png" data-full="https://catnipgames.net/blog/images/chat-tab-strip-fixed.png" alt="Chat window tab row with five tabs, Main, Combat, Universe, TESTER ! and TESTER 2, each name inside its own tab with a clear gap, and the options arrow on the selected Universe tab"></div>The chat tab row with the fix in. Universe is the selected tab, carrying the options arrow, and every name sits inside its own tab.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bb86563e48bf</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:49 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/taming-handlers-hud-mockup.png" alt="Mockup of the proposed handler HUD from the taming improvement plan: pet health and bond meters, a Guard, Frenzy, Harry stance row, a pet ability bar with Maul, Rending Roar, send and guard commands, and a stable swap footer"><img src="https://catnipgames.net/blog/images/taming-proposal-hero.jpg" alt="Title card of the taming deep dive: an oil painting of a beast tamer commanding a great bear in a torchlit forest clearing"></div>]]></description>
    </item>
    <item>
      <title>Images · 2026-07-26</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-images-2</guid>
      <pubDate>Sun, 26 Jul 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/roadmap-refresh-2026-07-26.png" alt="The refreshed Done now tab on the public roadmap page"></div>]]></description>
    </item>
    <item>
      <title>Gameplay: A player spotted that the three weapon-enchant glyphs carry three different square…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-e381bda21c54</guid>
      <pubDate>Sun, 26 Jul 2026 15:09:42 -0500</pubDate>
      <description><![CDATA[A player spotted that the three weapon-enchant glyphs carry three different square colors. The square tells you the skill category, and blue means a short-term self buff, so all three should have matched. Frost Weapon and Shock Weapon had shipped with the red square used for attacks. Both are blue now, with the school color still on the circle inside.]]></description>
    </item>
    <item>
      <title>Gameplay: Wrote down the glyph color convention, which had never been recorded anywhere: the outer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-a92cdb7eb2d9</guid>
      <pubDate>Sun, 26 Jul 2026 15:09:51 -0500</pubDate>
      <description><![CDATA[Wrote down the glyph color convention, which had never been recorded anywhere: the outer square is the skill category and the inner circle is the school. Nothing at runtime sets the color, it lives only in the texture, which is how the two new icons drifted without a build or a test noticing.]]></description>
    </item>
    <item>
      <title>Alchemy: Published an alchemy and consumables improvement plan: twenty-eight proposals covering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-4ba35a67786f</guid>
      <pubDate>Sun, 26 Jul 2026 16:12:20 -0500</pubDate>
      <description><![CDATA[Published an alchemy and consumables improvement plan: twenty-eight proposals covering potions, food, and brews, measured against Ultima Online, World of Warcraft, Elder Scrolls Online, Final Fantasy XIV, Guild Wars 2, Path of Exile, Albion Online, and RuneScape. Fourteen improve the existing system, fourteen are new consumables specified in full detail, and twenty-one of the twenty-eight are data-only changes.]]></description>
    </item>
    <item>
      <title>Alchemy: Audited the power of all 533 consumables from the shipping game data: chain drinking is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d69cf3fed35c</guid>
      <pubDate>Sun, 26 Jul 2026 16:12:29 -0500</pubDate>
      <description><![CDATA[Audited the power of all 533 consumables from the shipping game data: chain drinking is capped at two and a half potions of value by the sickness system, no consumable grants Chaos Resistance, and one aged whiskey is the only gathering buff in the game.]]></description>
    </item>
    <item>
      <title>Alchemy: Costed every major consumable family at merchant prices: a crafted Recall Scroll costs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-dc35ceb9ae6d</guid>
      <pubDate>Sun, 26 Jul 2026 16:12:37 -0500</pubDate>
      <description><![CDATA[Costed every major consumable family at merchant prices: a crafted Recall Scroll costs 131.6 gold while the vendor sells one for 100, most cooked dishes cost three to fifteen times their own vendor price to make, and three stocked reagents are used by zero recipes.]]></description>
    </item>
    <item>
      <title>Alchemy: The proposed new shelf: exceptional-tier potions that stack and slot like normal ones, a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7fae4eb46c35</guid>
      <pubDate>Sun, 26 Jul 2026 16:12:47 -0500</pubDate>
      <description><![CDATA[The proposed new shelf: exceptional-tier potions that stack and slot like normal ones, a potion-enhancing jewelry enchant, weapon oils, gathering draughts, a once-a-day study tonic, the first pet meal, and a cask that matures into forty health potions on the brewing rail. Every proposal has its own comment thread and vote arrows on the public page.]]></description>
    </item>
    <item>
      <title>Interface: Planned the next stage of the interface rebuild: the combat bar and the combat hand, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d4fe582c6386</guid>
      <pubDate>Sun, 26 Jul 2026 16:25:12 -0500</pubDate>
      <description><![CDATA[Planned the next stage of the interface rebuild: the combat bar and the combat hand, the two pieces you look at during every fight. They share one prefab and point at each other, so they were always going to move together.]]></description>
    </item>
    <item>
      <title>Interface: Most of that work turned out to already be done. The slot drawing that replaces 29,698…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-b79f0c4fabc3</guid>
      <pubDate>Sun, 26 Jul 2026 16:25:13 -0500</pubDate>
      <description><![CDATA[Most of that work turned out to already be done. The slot drawing that replaces 29,698 lines of old interface art shipped two batches ago and has been running on the deck builder and the emote bar ever since - icon, both cooldown rings, hotkey caption, reagent and card counts, success chance, mastery badges, tooltip, right-click menu, drag out and drop in. The old bar kept the old drawing only because the switch is per-prefab and nobody had flipped it.]]></description>
    </item>
    <item>
      <title>Interface: Planning caught a live piece of the interface that the previous batch had marked for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7b9077555fb3</guid>
      <pubDate>Sun, 26 Jul 2026 16:25:14 -0500</pubDate>
      <description><![CDATA[Planning caught a live piece of the interface that the previous batch had marked for deletion. The card charge bar was listed as unreferenced and slated to retire; it sits on the main interface prefab and is the only thing that reads the combat hand charge state. It was never deleted, and it converts with this batch instead.]]></description>
    </item>
    <item>
      <title>Interface: Re-read the combat bar plan against the code and found a bug it would have shipped: on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-b586b5bd5304</guid>
      <pubDate>Sun, 26 Jul 2026 16:29:40 -0500</pubDate>
      <description><![CDATA[Re-read the combat bar plan against the code and found a bug it would have shipped: on the new interface, right-clicking a card in the combat hand would have opened an empty menu instead of discarding the card. The shared slot code sends right-click straight to the context menu and never reaches the discard handler; the emote bar and deck builder never showed it because neither does anything on right click.]]></description>
    </item>
    <item>
      <title>Interface: Resequenced the work so the risky part lands first and invisibly. The rules for which bar…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-1de6fed9c50b</guid>
      <pubDate>Sun, 26 Jul 2026 16:29:41 -0500</pubDate>
      <description><![CDATA[Resequenced the work so the risky part lands first and invisibly. The rules for which bar is on screen come out as a tested model with the old interface still drawing, which is the cheapest place to catch a mistake, and the arrangement makes the ghost-window bug that hit three earlier windows impossible to write rather than something to remember to avoid.]]></description>
    </item>
    <item>
      <title>Interface: Also found that the combat bar can be checked without a fight - there is an option that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-dc045bffd1f5</guid>
      <pubDate>Sun, 26 Jul 2026 16:29:42 -0500</pubDate>
      <description><![CDATA[Also found that the combat bar can be checked without a fight - there is an option that keeps it on screen out of combat - and that six pieces of translated text on the old bar have to move into code before any of it is taken apart.]]></description>
    </item>
    <item>
      <title>Interface: Pulled the rules for which combat bar is on screen out into their own tested piece of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0987deef8f39</guid>
      <pubDate>Sun, 26 Jul 2026 16:40:23 -0500</pubDate>
      <description><![CDATA[Pulled the rules for which combat bar is on screen out into their own tested piece of code. They had shipped for years with no test, so the eighteen cases are the first written statement of what the bar actually does, and three of them pin behaviour that reads like a bug and is not - most notably that decorating with an item that could also go on the bar keeps the deco panel up, until you drag the item over the bar, at which point the game correctly decides you are trying to slot it.]]></description>
    </item>
    <item>
      <title>Interface: Rewired the combat bar so the decision about what is on screen and the drawing of it are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d1fc1f1d9fe9</guid>
      <pubDate>Sun, 26 Jul 2026 16:51:47 -0500</pubDate>
      <description><![CDATA[Rewired the combat bar so the decision about what is on screen and the drawing of it are separate things. Nothing looks different yet - it is all still the old interface - but the new one now has a single place to plug into, and the arrangement makes a bug that has bitten three windows in this rebuild impossible to write rather than something to remember to avoid.]]></description>
    </item>
    <item>
      <title>Interface: Two smaller things fell out of it. The bar had two background loops polling on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-6ec3897ea715</guid>
      <pubDate>Sun, 26 Jul 2026 16:51:48 -0500</pubDate>
      <description><![CDATA[Two smaller things fell out of it. The bar had two background loops polling on independent schedules, so it could apply a layout using conditions read a moment after the state that asked for them; there is one loop now. And the auto-hide timer asks the bar itself whether the mouse is over it, instead of asking the old interface - which would have answered no forever once the bar moved, and faded it out from under the cursor.]]></description>
    </item>
    <item>
      <title>Interface: Fixed a bug in the combat hand that would have shipped with the conversion…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-46958853abda</guid>
      <pubDate>Sun, 26 Jul 2026 17:09:57 -0500</pubDate>
      <description><![CDATA[Fixed a bug in the combat hand that would have shipped with the conversion: right-clicking a card would have opened an empty menu instead of discarding it. The shared slot code sent right-click straight to the context menu without ever reaching the handler that does the discarding, and the menu it opened only has anything in it for a locked slot.]]></description>
    </item>
    <item>
      <title>Interface: Taught a hand slot to answer four questions about the mouse for both interfaces at once…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-408f0d15b9b5</guid>
      <pubDate>Sun, 26 Jul 2026 17:09:58 -0500</pubDate>
      <description><![CDATA[Taught a hand slot to answer four questions about the mouse for both interfaces at once. The awkward one is press-and-hold, because charging a glyph reads the button state fresh every frame rather than reacting to an event - so a press that ends without a release, by the pointer sliding off the slot or the element going away, has to clear itself or the glyph would charge on its own.]]></description>
    </item>
    <item>
      <title>Interface: The glyph charge bar is on the new interface. While converting it, the dividing marks…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-6dea4d4c9c1a</guid>
      <pubDate>Sun, 26 Jul 2026 17:09:59 -0500</pubDate>
      <description><![CDATA[The glyph charge bar is on the new interface. While converting it, the dividing marks along the charge track turned out to have been stacking on top of each other at one end for years: the code that spaced them divided two whole numbers, so every mark but one landed at position zero. They now spread across the track the way they were meant to.]]></description>
    </item>
    <item>
      <title>Interface: Built the pieces the combat bar needs on the new interface, none of them switched on yet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-69c88a08a834</guid>
      <pubDate>Sun, 26 Jul 2026 17:22:24 -0500</pubDate>
      <description><![CDATA[Built the pieces the combat bar needs on the new interface, none of them switched on yet: the combat hand slot with its locked-card frame and the slide-and-fade cards do as they are drawn and discarded, the bar itself with its two rows and the help text, and the decoration strip that shares the same frame.]]></description>
    </item>
    <item>
      <title>Interface: The bar keeps track of whether the mouse is over it now, because the old interface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-857fc62468b2</guid>
      <pubDate>Sun, 26 Jul 2026 17:22:25 -0500</pubDate>
      <description><![CDATA[The bar keeps track of whether the mouse is over it now, because the old interface answered that question by walking through objects it can see and the new one is invisible to that walk. Without it the bar would have quietly faded out from under the cursor while you were using it.]]></description>
    </item>
    <item>
      <title>Interface: Carried eight pieces of translated text off the old bar into code with their identifiers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-0b8e5a205825</guid>
      <pubDate>Sun, 26 Jul 2026 17:22:26 -0500</pubDate>
      <description><![CDATA[Carried eight pieces of translated text off the old bar into code with their identifiers intact before any of it gets taken apart, so no translation is lost. The plan had counted six; the decoration checkbox turned out to have both a label and its own hover text.]]></description>
    </item>
    <item>
      <title>Interface: The combat bar is on the new interface. That is three things sharing one frame: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-9768af9c9f87</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:52 -0500</pubDate>
      <description><![CDATA[The combat bar is on the new interface. That is three things sharing one frame: the utility bar you park items and glyphs on, the combat row that holds your hand during a fight, and the decoration strip that borrows the same space while you are placing deco on a lot. They always had to move together.]]></description>
    </item>
    <item>
      <title>Interface: The combat hand was rated as one of the five hardest things left, on the strength of a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-6af1f5ea6b95</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:53 -0500</pubDate>
      <description><![CDATA[The combat hand was rated as one of the five hardest things left, on the strength of a 1,585-line state machine. The state machine never had to convert. It has four references to anything visual and touched the old interface in two places, so what it needed was for the mouse to be reported from somewhere else and four visual writes mirrored across.]]></description>
    </item>
    <item>
      <title>Interface: Setting one flag on the old bar through the editor rewrote 1,493 lines of it and quietly…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d37a616dd56e</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:54 -0500</pubDate>
      <description><![CDATA[Setting one flag on the old bar through the editor rewrote 1,493 lines of it and quietly shifted six colours off pure white, which is what happens when an editor from 2018 saves a file in a newer one. Put the flag in by hand instead: eleven lines, no colour drift.]]></description>
    </item>
    <item>
      <title>Interface: Two tests written two batches ago went red on purpose today. Both existed to assert the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ba27dd043a49</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:55 -0500</pubDate>
      <description><![CDATA[Two tests written two batches ago went red on purpose today. Both existed to assert the combat bar had NOT moved while the pieces it would need were built next to it. They did their job for two batches and now record that the bar has moved.]]></description>
    </item>
    <item>
      <title>Interface: A tester reported the combat bar and utility bar coming up wrong on the new interface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-871d12b63df7</guid>
      <pubDate>Sun, 26 Jul 2026 21:32:36 -0500</pubDate>
      <description><![CDATA[A tester reported the combat bar and utility bar coming up wrong on the new interface: both rows jammed against the left edge of the screen, the combat slots showing as empty boxes, and a second copy of the glyphs stuck lower down under a permanent red cooldown wash. Three separate faults, all from the same day the bar was switched over.]]></description>
    </item>
    <item>
      <title>Interface: The bar was never centred. Its default position asked the layout to work the horizontal…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-d5dd2e016fd9</guid>
      <pubDate>Sun, 26 Jul 2026 21:32:36 -0500</pubDate>
      <description><![CDATA[The bar was never centred. Its default position asked the layout to work the horizontal placement out on its own, which for a free-floating element means the left edge rather than the middle. Placement now happens once the bar knows how wide it is, and again whenever the screen or the bar changes size.]]></description>
    </item>
    <item>
      <title>Interface: The empty slots were an element nobody wrote to. The piece that draws a combat slot on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ec6e339e0b7c</guid>
      <pubDate>Sun, 26 Jul 2026 21:32:37 -0500</pubDate>
      <description><![CDATA[The empty slots were an element nobody wrote to. The piece that draws a combat slot on the new interface was built a few steps earlier and covered with tests, then switched on without ever being handed the card art, the fades, the slide, the border or the combine flash. Every one of those writes now goes to both halves while the old one is still there to compare against.]]></description>
    </item>
    <item>
      <title>Interface: The stuck second copy was the old combat hand still drawing. The cleanup that retires the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-72fd1ed584c5</guid>
      <pubDate>Sun, 26 Jul 2026 21:32:37 -0500</pubDate>
      <description><![CDATA[The stuck second copy was the old combat hand still drawing. The cleanup that retires the old interface runs once at startup, but the hand deals fresh slots every time you change decks, and each one arrives carrying its own drawing layer. Those are now retired as the hand is dealt.]]></description>
    </item>
    <item>
      <title>Interface: Three smaller faults in the same code blocked any way out of the first one: the saved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-36f2aa18a89f</guid>
      <pubDate>Sun, 26 Jul 2026 21:32:38 -0500</pubDate>
      <description><![CDATA[Three smaller faults in the same code blocked any way out of the first one: the saved position was read from the wrong place, so a click that did not move the bar filed it into the corner; a position saved on a bigger display was never pulled back on screen; and the only draggable part of the bar was completely covered by its own slots. The bar has a grab border now, and everyone starts centred once.]]></description>
    </item>
    <item>
      <title>GM Tools: New setwinddirectionoverride console command and a wind-heading row in the GM event panel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-7f7c02b175f0</guid>
      <pubDate>Sun, 26 Jul 2026 16:34:30 -0500</pubDate>
      <description><![CDATA[New setwinddirectionoverride console command and a wind-heading row in the GM event panel force the scene's wind heading for everyone in the room; the wind slews over so flags swing rather than snap. Late joiners now pick up weather and wind overrides set before they arrived.]]></description>
    </item>
    <item>
      <title>Inventory: Planned the inventory automation epic. Containers can be tagged with the categories they…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-daaf6b392685</guid>
      <pubDate>Sun, 26 Jul 2026 17:02:19 -0500</pubDate>
      <description><![CDATA[Planned the inventory automation epic. Containers can be tagged with the categories they collect, a Sort to Bags button files your pack into them in one click with an undo, Quick Deposit pushes stacks into a chest that already holds them, and the lock flag becomes a visible column every bulk action has to respect. Thirteen phases, three of which ship on their own.]]></description>
    </item>
    <item>
      <title>Inventory: Ran that plan through an adversarial design pass before writing any code: three…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-ac7f56a990d6</guid>
      <pubDate>Sun, 26 Jul 2026 17:02:26 -0500</pubDate>
      <description><![CDATA[Ran that plan through an adversarial design pass before writing any code: three independent designs, three reviews and two hazard registers. It found four ways the obvious implementation would have destroyed player property, including one where undoing a deposit would have consumed unclaimed rewards. All four are handled in the plan.]]></description>
    </item>
    <item>
      <title>Inventory: Worked out how each of the four defects in the inventory automation plan gets fixed, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-15ffb2d42e5f</guid>
      <pubDate>Sun, 26 Jul 2026 17:38:30 -0500</pubDate>
      <description><![CDATA[Worked out how each of the four defects in the inventory automation plan gets fixed, and built the verification plan behind them: eight layers, from a planner property test up to a whole-database duplicate audit run before and after. Debug builds will also count every touched container before and after a batch and complain if the totals do not match.]]></description>
    </item>
    <item>
      <title>Inventory: Reading that code a second time corrected the plan twice. Crowns of the Obsidian are not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-cc37dd63a3f1</guid>
      <pubDate>Sun, 26 Jul 2026 17:38:42 -0500</pubDate>
      <description><![CDATA[Reading that code a second time corrected the plan twice. Crowns of the Obsidian are not among the item types a bulk move can consume, and the consuming itself is intended looting behaviour. The same code does hold three older defects around redeeming an item, and those get fixed first, on their own, ahead of any of the new work.]]></description>
    </item>
    <item>
      <title>Armor: Published an armor improvement plan: twenty proposals covering the worn suit and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-57d504a0fc25</guid>
      <pubDate>Sun, 26 Jul 2026 17:18:20 -0500</pubDate>
      <description><![CDATA[Published an armor improvement plan: twenty proposals covering the worn suit and the masterwork and enchantment bench, measured against Ultima Online, World of Warcraft, Elder Scrolls Online, Final Fantasy XIV, Guild Wars 2, Albion Online, New World, Black Desert, and Path of Exile. Ten are client-only displays of numbers the game already computes, and three reconnect armor math that is designed but sitting inactive in the game data.]]></description>
    </item>
    <item>
      <title>Armor: The crafting side answers the community's top request: a full odds ladder and the bonus…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-bece08f20f0f</guid>
      <pubDate>Sun, 26 Jul 2026 17:18:28 -0500</pubDate>
      <description><![CDATA[The crafting side answers the community's top request: a full odds ladder and the bonus pool shown before materials are spent, a practice bonus that banks failed attempts toward the next try, a guaranteed lane at a steep material price, and catalysts that steer the roll into the bonus family you choose. The illustrated version is public at <a href="https://catnipgames.net/blog/proposals/armor/">catnipgames.net/blog/proposals/armor</a> with a comment box and vote arrows on every proposal.]]></description>
    </item>
    <item>
      <title>Taming: Published a taming and pet combat improvement plan: twenty-eight proposals measured…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-5c3034f7fb55</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:21 -0500</pubDate>
      <description><![CDATA[Published a taming and pet combat improvement plan: twenty-eight proposals measured against Ultima Online, World of Warcraft, EverQuest, Final Fantasy XI, Guild Wars 2, City of Heroes, ARK, and the modern UO free shards. The plan pairs an open rebalance of passive pet power with new active play: a pet ability bar on the handler's hotbar, stances with real tradeoffs, send and guard commands, a revived Veterinarian skill, sidegrade pet gear, rare tames, and a Bond system that pays the most to the tamer who actually handles the beast. Open for comment and voting at <a href="https://catnipgames.net/blog/proposals/taming/">Taming Deep Dive</a>.]]></description>
    </item>
    <item>
      <title>Taming: The rebalance math is printed on the page rather than hidden in patch notes, starting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-1555b666903f</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:29 -0500</pubDate>
      <description><![CDATA[The rebalance math is printed on the page rather than hidden in patch notes, starting with a bug fix: the pet level cap is applied before its bonuses instead of after them, so a grandmaster's cap of 89 currently produces level 114 pets. The page shows the before and after tables for the cap, the mastery curve, and the Frenzy uptime change, and every number ships through the combat balance program's test-shard changesets and measurement windows.]]></description>
    </item>
    <item>
      <title>Taming: One of the twenty-eight cards puts Episode 2's unmet pack animal stretch goal to a public…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-2f667d2f606c</guid>
      <pubDate>Sun, 26 Jul 2026 17:36:41 -0500</pubDate>
      <description><![CDATA[One of the twenty-eight cards puts Episode 2's unmet pack animal stretch goal to a public vote. The roadmap says that promise gets honored or formally retired, and the vote count will be the evidence the decision cites.]]></description>
    </item>
    <item>
      <title>Taming: Fixed taming collars that turned permanently No Trade. When a pet died and its resurrect…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-52c8d45551d0</guid>
      <pubDate>Sun, 26 Jul 2026 19:03:24 -0500</pubDate>
      <description><![CDATA[Fixed taming collars that turned permanently No Trade. When a pet died and its resurrect timer ran out, the collar showed as empty but could no longer be traded, handed back to the tamer, sold, or put in a storage container, and there was no way in the game to reset it. Collars trade again once the pet is past saving, including the ones players already have stuck in their banks.]]></description>
    </item>
    <item>
      <title>Taming: Travelling to another scene with a dead pet used to reach the same dead end, and so did…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-93760a9fdcc9</guid>
      <pubDate>Sun, 26 Jul 2026 19:03:34 -0500</pubDate>
      <description><![CDATA[Travelling to another scene with a dead pet used to reach the same dead end, and so did losing a queued collar update during the loading screen. Both now clear themselves the next time the collar is worn.]]></description>
    </item>
    <item>
      <title>Taming: Store and quest whistles keep their creature, so they drop only the death state once the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-41306e422727</guid>
      <pubDate>Sun, 26 Jul 2026 19:03:34 -0500</pubDate>
      <description><![CDATA[Store and quest whistles keep their creature, so they drop only the death state once the resurrect timer lapses and can be summoned and traded again without waiting on a Tame Resurrect cast. The five minute window after a pet dies is unchanged, and the collar stays No Trade for it.]]></description>
    </item>
    <item>
      <title>Taming: Added 14 editor tests over the resurrect-window timing, the trade rule, and the exact…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-895a106a8cf2</guid>
      <pubDate>Sun, 26 Jul 2026 19:03:34 -0500</pubDate>
      <description><![CDATA[Added 14 editor tests over the resurrect-window timing, the trade rule, and the exact data a collar writes when it clears itself.]]></description>
    </item>
    <item>
      <title>Web: Put a disclaimer at the top of the proposals index : these pages are the start of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-26-8e08591e398e</guid>
      <pubDate>Sun, 26 Jul 2026 18:02:47 -0500</pubDate>
      <description><![CDATA[Put a disclaimer at the top of <a href="https://catnipgames.net/blog/proposals/">the proposals index</a>: these pages are the start of the conversation and not the actual plan, nothing on them is decided or scheduled, and other ideas are welcome including ones we did not think of. Some of the proposals are deliberately ambitious and the point is to hear where they went too far and where they did not go far enough. Reworded the paragraph underneath it to match.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-25</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-headlines</guid>
      <pubDate>Sat, 25 Jul 2026 21:55:47 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Two new weapon enchants: <b>Frost Weapon</b> slows what you hit, <b>Shock Weapon</b> can stun it. Fire is no longer the only school that can light up a blade.</li>
        <li>Inventory window round two, from a tester's full pass: double-click works again, the list is a sortable table with weight, durability and value, Your Gold is back, and bags show how full they are.</li>
        <li>Bulk item moves no longer leave your whole inventory unusable until you relog. One rejected item used to flag the entire batch, and the flag could not be cleared without logging out.</li>
        <li>Tracked down a client crash from three tester reports: NPC voice audio was being freed while it was still starting to play. Fixed, along with two other ways the same thing could happen.</li>
        <li>Quest hand-ins to NPCs work again: the converted <b>Give Items</b> window was letting the retired window behind it swallow every drop.</li>
        <li>Combat pets now follow their owner's <b>Open PvP</b> flag. An unflagged player's auto-attack and area skills no longer sweep up a flagged player's pet, and placed decoration creatures and town NPCs stay non-attackable on PvP lots.</li>
        <li>A lot permission handed out by a guild officer no longer outlives the officer. Kick, leave or demote them and the access they gave goes with them, while anything the lot owner granted stays put.</li>
        <li>The <b>combat deck window</b> was rebuilt after player feedback the same day it shipped: one window instead of two, one line per deck, and the equip controls back to the two the old window had.</li>
        <li><b>Japanese is translated</b>: all 66,792 lines of NPC dialogue, plus items, quests, skills and the interface. Native review is the next step.</li>
        <li>Three separate reports of <b>black ground outdoors</b> turned out to be one bug: the terrain shader was losing its deferred lighting variants when scenes were packed, so ground near the camera rendered unlit while everything else looked fine.</li>
        <li>Placed <b>Conversationalists</b> stay put: a Stay-here NPC holds its exact spot for every player, and a patrolling one is leashed to 10m of where you placed it instead of drifting 38m off the lot.</li>
        <li>Summoned <b>earth and ice elementals</b> now land the attacks they start. They had been swinging from 5 metres while their damage only reached 4, so roughly a metre of every approach produced an animation, an earthquake, and no damage at all.</li>
        <li><strong>Animal Charm</strong> now lasts as long as its icon says. At grandmaster skill the charm had been ending at about half the displayed time, and the skill description called it a mesmerize.</li>
        <li>Zombie children stopped sounding like an old man. Solace Bridge rolls four zombie bodies off one spawn point and gave all of them the same voice; each body now has its own.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Filed 11 items from the nightly forum sweep: 8 wishlist suggestions (Twitch Drops, guild…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d6875747f3e0</guid>
      <pubDate>Sat, 25 Jul 2026 03:22:58 -0500</pubDate>
      <description><![CDATA[Filed 11 items from the nightly forum sweep: 8 wishlist suggestions (Twitch Drops, guild war opt-in PvP + victory plaques, multi-blazon guild support, expanded guild titles/permissions, drag-to-backpack search results, a vacate-plot basement/dungeon warning, POT terrain flattening, Companion App features) and 3 bug reports (a stalled earth-summon range bug, a drifting Conversationalist NPC, and a Lua sound-channel indexing mismatch).]]></description>
    </item>
    <item>
      <title>UI: The backpack got its category filter back. A Show dropdown above the search box narrows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-56565171df78</guid>
      <pubDate>Sat, 25 Jul 2026 04:56:55 -0500</pubDate>
      <description><![CDATA[The backpack got its category filter back. A Show dropdown above the search box narrows the item list to Equipment, Material, Tool, Recipe and the rest of the 19 categories the old window offered, and it combines with the search box. The list also respects the inventory options again, so hidden locked and quest items stay hidden unless you pick those categories.]]></description>
    </item>
    <item>
      <title>UI: Loot bags, chests and every other container window moved onto the new UI. Each one shows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2b8eff5b1b24</guid>
      <pubDate>Sat, 25 Jul 2026 05:19:42 -0500</pubDate>
      <description><![CDATA[Loot bags, chests and every other container window moved onto the new UI. Each one shows the container name in its title (a corpse shows what you killed), an item count against the container capacity, and a Take All button on containers that are not your own bags.]]></description>
    </item>
    <item>
      <title>UI: Container windows now remember their own size and position instead of sharing one saved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a9262122c6fe</guid>
      <pubDate>Sat, 25 Jul 2026 05:19:43 -0500</pubDate>
      <description><![CDATA[Container windows now remember their own size and position instead of sharing one saved spot with the backpack, and a container you open while your bag is up appears beside it rather than on top of it.]]></description>
    </item>
    <item>
      <title>UI: The small quick-loot window keeps its small shape on the new UI. It carries the container…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6a7ed1420fa8</guid>
      <pubDate>Sat, 25 Jul 2026 05:37:10 -0500</pubDate>
      <description><![CDATA[The small quick-loot window keeps its small shape on the new UI. It carries the container name, the item list and Take All, without the category dropdown, search box and item count that belong to the full container window, and it remembers its own size separately from the backpack.]]></description>
    </item>
    <item>
      <title>UI: Containers whose contents belong to someone else now name the owner above the item list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ec145183c1ee</guid>
      <pubDate>Sat, 25 Jul 2026 05:37:11 -0500</pubDate>
      <description><![CDATA[Containers whose contents belong to someone else now name the owner above the item list, on both the small and full container windows, so it is clear before you take anything that doing so is stealing.]]></description>
    </item>
    <item>
      <title>UI: Lot storage moved to the new UI. The lot name sits in the title bar with its type and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9376833f7f8e</guid>
      <pubDate>Sat, 25 Jul 2026 05:55:39 -0500</pubDate>
      <description><![CDATA[Lot storage moved to the new UI. The lot name sits in the title bar with its type and basement lines readable underneath, rather than all four lines crammed into the title. It keeps its Refresh button and the wait between refreshes, and now says when it is fetching instead of showing an empty list.]]></description>
    </item>
    <item>
      <title>UI: Two follow settings joined the Multiplayer options tab: whether other players may follow…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5d5ad506d4de</guid>
      <pubDate>Sat, 25 Jul 2026 06:08:08 -0500</pubDate>
      <description><![CDATA[Two follow settings joined the Multiplayer options tab: whether other players may follow you, and whether you get a chat notice when someone starts. Follow also picked up a key binding, Follow Target on Keypad 7, and Tab completes a player name after you type <b>/follow</b>.]]></description>
    </item>
    <item>
      <title>UI: The bank moved to the new UI. It opens beside the backpack with its own remembered size…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1665cc7e9d7a</guid>
      <pubDate>Sat, 25 Jul 2026 06:16:36 -0500</pubDate>
      <description><![CDATA[The bank moved to the new UI. It opens beside the backpack with its own remembered size, and carries the category dropdown, search box, the item count against your bank capacity, Refresh, and Buy More Space. Buying space still asks you to confirm the gold price and the number of slots first.]]></description>
    </item>
    <item>
      <title>UI: Items can be dropped into the inventory window again. The drop target sat on the item…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-dbfcd7f5e0c0</guid>
      <pubDate>Sat, 25 Jul 2026 07:33:29 -0500</pubDate>
      <description><![CDATA[Items can be dropped into the inventory window again. The drop target sat on the item list's inner content box, which is only as tall as the rows it holds and sits inside the scroll area rather than around it, so anything released outside a row found nothing to drop onto and bounced back. The whole window now accepts a drop, and dropping one item onto a matching one still combines the stacks.]]></description>
    </item>
    <item>
      <title>UI: Inventory windows now sit front to back. Every window used to sit at the same depth, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b064855b7f00</guid>
      <pubDate>Sat, 25 Jul 2026 07:33:29 -0500</pubDate>
      <description><![CDATA[Inventory windows now sit front to back. Every window used to sit at the same depth, so whichever one opened last covered the others for good and clicks never reached the window underneath. Opening a window or clicking it brings it to the front.]]></description>
    </item>
    <item>
      <title>UI: The backpack has its category tabs back, one button per category rather than the dropdown…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-dce4e1756b05</guid>
      <pubDate>Sat, 25 Jul 2026 07:33:30 -0500</pubDate>
      <description><![CDATA[The backpack has its category tabs back, one button per category rather than the dropdown the rebuilt window shipped with: 19 for your own backpack, 17 for other containers. They work alongside the Search box and drive the same filtering the old window used.]]></description>
    </item>
    <item>
      <title>UI: Inventory items are colour-coded again. Quest items, locked items, equipped crafting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b83738901bc3</guid>
      <pubDate>Sat, 25 Jul 2026 07:33:38 -0500</pubDate>
      <description><![CDATA[Inventory items are colour-coded again. Quest items, locked items, equipped crafting tools, artifacts, unlearned recipes and items tied up in a pending trade each read at a glance, from the same source the old window used so the two cannot drift apart.]]></description>
    </item>
    <item>
      <title>UI: Inventory rows show each item's weight, and the quantity moved into its own column so a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-98b1edfcf708</guid>
      <pubDate>Sat, 25 Jul 2026 07:33:39 -0500</pubDate>
      <description><![CDATA[Inventory rows show each item's weight, and the quantity moved into its own column so a long item name can no longer push the count out of view.]]></description>
    </item>
    <item>
      <title>UI: Splitting a stack works in the newer inventory windows again. Holding Shift while you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d73db63227a7</guid>
      <pubDate>Sat, 25 Jul 2026 07:38:44 -0500</pubDate>
      <description><![CDATA[Splitting a stack works in the newer inventory windows again. Holding Shift while you drag a stack out of a bag, bank or container opens the quantity prompt, and holding Ctrl takes a single item. In those windows both keys did nothing before, so a drag always took the whole stack and there was no way to take part of one.]]></description>
    </item>
    <item>
      <title>UI: The quantity prompt opens at the cursor and in front of the window it came from. It had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ceb992be0ac4</guid>
      <pubDate>Sat, 25 Jul 2026 07:38:44 -0500</pubDate>
      <description><![CDATA[The quantity prompt opens at the cursor and in front of the window it came from. It had been putting itself in the top left corner of the screen because it measured its own size before it had one, and at its old depth the container window it was raised from could cover it.]]></description>
    </item>
    <item>
      <title>UI: Items dropped into a container window land in the container you are looking at. One…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-64085bc04c22</guid>
      <pubDate>Sat, 25 Jul 2026 07:38:44 -0500</pubDate>
      <description><![CDATA[Items dropped into a container window land in the container you are looking at. One window is reused for loot bags, chests and crates, and it kept pointing at the first container it had shown, so a drop could go into a chest opened earlier instead of the bag under the cursor.]]></description>
    </item>
    <item>
      <title>UI: Double-clicking an item in the inventory window works again. Nothing happened before: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a159431e5de5</guid>
      <pubDate>Sat, 25 Jul 2026 08:03:02 -0500</pubDate>
      <description><![CDATA[Double-clicking an item in the inventory window works again. Nothing happened before: the window decided what counted as a double-click by asking the interface layer for a click count that it never actually filled in, so equipping, using or opening anything by double-click was dead. The window now tracks the two clicks itself.]]></description>
    </item>
    <item>
      <title>UI: The inventory list is a sortable table again. Rows show name, quantity, weight…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ff37ceeb17b9</guid>
      <pubDate>Sat, 25 Jul 2026 08:03:03 -0500</pubDate>
      <description><![CDATA[The inventory list is a sortable table again. Rows show name, quantity, weight, durability and value under a header bar; clicking a heading sorts by it and clicking again reverses, and the window remembers the choice. Sorting uses the same ordering the old window used.]]></description>
    </item>
    <item>
      <title>UI: The inventory window shows Your Gold again, on the player's own backpack only.</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-557b884e8c2b</guid>
      <pubDate>Sat, 25 Jul 2026 08:03:03 -0500</pubDate>
      <description><![CDATA[The inventory window shows Your Gold again, on the player's own backpack only.]]></description>
    </item>
    <item>
      <title>UI: A container sitting in your backpack now shows how full it is next to its name, as 3 /…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9ea2cc04c506</guid>
      <pubDate>Sat, 25 Jul 2026 08:03:04 -0500</pubDate>
      <description><![CDATA[A container sitting in your backpack now shows how full it is next to its name, as 3 / 10, so you no longer have to open a bag to find out. A renamed container also shows both names in its title, such as Raw Material (Small Bag), so several renamed bags can be told apart.]]></description>
    </item>
    <item>
      <title>UI: Fixed the backpack window drawing its own controls on top of each other. The category…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-91c650b60d7c</guid>
      <pubDate>Sat, 25 Jul 2026 10:38:15 -0500</pubDate>
      <description><![CDATA[Fixed the backpack window drawing its own controls on top of each other. The category tabs wrap onto several rows, and those rows were being squashed into a thin band that painted over the Search box and the column heading row, so all three were unreadable. Measured at the smallest window size: the tab strip was given 23 pixels for the 148 it needed, and the wrapped rows spilled 125 pixels past it. Every fixed row now keeps its own height and the item list takes what is left and scrolls.]]></description>
    </item>
    <item>
      <title>UI: Lined the backpack column headings up with their columns. The heading row sits outside…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1b12a5c825a5</guid>
      <pubDate>Sat, 25 Jul 2026 10:38:23 -0500</pubDate>
      <description><![CDATA[Lined the backpack column headings up with their columns. The heading row sits outside the scrolling list so it stays put, which also meant it did not lose width to the scrollbar the way the rows did, and Quantity, Weight, Durability and Value ended up as much as 23 pixels left of their own headings once the list was long enough to scroll.]]></description>
    </item>
    <item>
      <title>UI: Carried the same layout fix into the container, corpse, bank, lot storage, rewards and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8acbef8aab9d</guid>
      <pubDate>Sat, 25 Jul 2026 10:38:24 -0500</pubDate>
      <description><![CDATA[Carried the same layout fix into the container, corpse, bank, lot storage, rewards and jukebox windows, which are all built from the backpack window and shared the bug.]]></description>
    </item>
    <item>
      <title>UI: Restored multi-select in the bank, backpack and container windows. Ctrl and click toggles…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8c1d57d7b338</guid>
      <pubDate>Sat, 25 Jul 2026 12:45:21 -0500</pubDate>
      <description><![CDATA[Restored multi-select in the bank, backpack and container windows. Ctrl and click toggles a row, shift and click selects a range, Ctrl+A takes the lot, and dragging any selected row moves the whole selection. These windows lost it when they moved to UI Toolkit, so testing bank capacity meant dragging one item at a time.]]></description>
    </item>
    <item>
      <title>UI: Shift while dragging still splits a stack and Ctrl while dragging still takes one, so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-74d3e14e6c3c</guid>
      <pubDate>Sat, 25 Jul 2026 12:45:22 -0500</pubDate>
      <description><![CDATA[Shift while dragging still splits a stack and Ctrl while dragging still takes one, so the new selection does not steal those. Selection survives the bank refreshing itself and the search box filtering, and drops only rows that are no longer shown.]]></description>
    </item>
    <item>
      <title>UI: Retired seven dead NGUI fragments left behind by earlier UI conversions: the journal…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-84d0f51c40d8</guid>
      <pubDate>Sat, 25 Jul 2026 13:37:18 -0500</pubDate>
      <description><![CDATA[Retired seven dead NGUI fragments left behind by earlier UI conversions: the journal entry rows, the task info row, the large message box, a list toggle, a skill school tab, a ransom item icon, and their scripts. Each had no remaining user in code, prefabs, or scenes.]]></description>
    </item>
    <item>
      <title>UI: Restored the Journal task Report a Problem action as a button in the Tasks tab. It had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-cce5f968a790</guid>
      <pubDate>Sat, 25 Jul 2026 13:37:19 -0500</pubDate>
      <description><![CDATA[Restored the Journal task <b>Report a Problem</b> action as a button in the Tasks tab. It had lived only on a right-click menu that was lost when the quest tracker and journal were rebuilt, so task bug reporting had no entry point in game.]]></description>
    </item>
    <item>
      <title>UI: Removed the in-world discovery icon path from location trigger boxes. The icon slot was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-149f7cf79ca0</guid>
      <pubDate>Sat, 25 Jul 2026 13:37:20 -0500</pubDate>
      <description><![CDATA[Removed the in-world discovery icon path from location trigger boxes. The icon slot was left empty on 3841 of 3844 placements, so it drew nothing; compass and map markers come from a separate field and are unchanged.]]></description>
    </item>
    <item>
      <title>UI: Emote names in the Emotes window are no longer drawn in grey when the emote cannot be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-01892aa6151b</guid>
      <pubDate>Sat, 25 Jul 2026 14:16:54 -0500</pubDate>
      <description><![CDATA[Emote names in the Emotes window are no longer drawn in grey when the emote cannot be taught to another player. Grey is what the UI uses for things you cannot use, and every emote in that list is one your character already knows, so the colour was saying the wrong thing. The green and grey now stay in the Teachability column where they mean something.]]></description>
    </item>
    <item>
      <title>UI: Equipment slot highlighting works again on the character sheet. Picking up an equippable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-71f2ad4e92ee</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:26 -0500</pubDate>
      <description><![CDATA[Equipment slot highlighting works again on the character sheet. Picking up an equippable item only ever highlighted the first slot, so most items showed nothing. The mannequin, fishtank and doll cabinet windows had the same problem.]]></description>
    </item>
    <item>
      <title>UI: Hovering a skill with no school no longer writes an error to the log on every frame. One…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5e29eab54b2c</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:26 -0500</pubDate>
      <description><![CDATA[Hovering a skill with no school no longer writes an error to the log on every frame. One player session recorded 3,185 of them.]]></description>
    </item>
    <item>
      <title>UI: Item lists now answer for their own right-click menus on the UI Toolkit side. The old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-afa197974af5</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:51 -0500</pubDate>
      <description><![CDATA[Item lists now answer for their own right-click menus on the UI Toolkit side. The old rows each carried their own context-menu implementation, so a converted window lost the menu; the list itself now supplies it, which means every list in the family keeps its menu when its window is rebuilt.]]></description>
    </item>
    <item>
      <title>UI: A row with no actions returns nothing rather than an empty menu, and the action list is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-bc4258239a36</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:52 -0500</pubDate>
      <description><![CDATA[A row with no actions returns nothing rather than an empty menu, and the action list is read once instead of every time the menu measures itself.]]></description>
    </item>
    <item>
      <title>UI: The shop window framework learned tabs that show two lists side by side and hide the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f27556f55547</guid>
      <pubDate>Sat, 25 Jul 2026 15:43:00 -0500</pubDate>
      <description><![CDATA[The shop window framework learned tabs that show two lists side by side and hide the shopping cart while they do. The vendor windows need both: managing your own listings is not an exchange, and the running total on screen there invites the wrong click.]]></description>
    </item>
    <item>
      <title>UI: Window width is now worked out from what each tab actually shows instead of being stored…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c211ce1a8ae1</guid>
      <pubDate>Sat, 25 Jul 2026 15:43:01 -0500</pubDate>
      <description><![CDATA[Window width is now worked out from what each tab actually shows instead of being stored, so a tab that hides the cart is not charged 306 pixels for it, and switching tabs rebuilds one list instead of six.]]></description>
    </item>
    <item>
      <title>UI: Fixed the shopkeeper signature. The window was rebuilt a while back and the signature…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-315ea120e425</guid>
      <pubDate>Sat, 25 Jul 2026 15:43:02 -0500</pubDate>
      <description><![CDATA[Fixed the shopkeeper signature. The window was rebuilt a while back and the signature kept being written to the old hidden label, so accepting an exchange finished with nothing visible. Your name writes itself across the line again.]]></description>
    </item>
    <item>
      <title>UI: Both vendor windows are on the new interface. They turned out to be one window rather…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5c37abb8c930</guid>
      <pubDate>Sat, 25 Jul 2026 16:15:14 -0500</pubDate>
      <description><![CDATA[Both vendor windows are on the new interface. They turned out to be one window rather than two: the shared base holds all of the display and the player-vendor and public-vendor classes hold only the rules, so neither of those needed a line changed.]]></description>
    </item>
    <item>
      <title>UI: The two management tabs now show your own goods beside your listings on one screen, with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-51009c8374e7</guid>
      <pubDate>Sat, 25 Jul 2026 16:15:15 -0500</pubDate>
      <description><![CDATA[The two management tabs now show your own goods beside your listings on one screen, with the exchange panel hidden there. The four tabs come from one rule instead of four handlers that each showed and hid seven separate panels.]]></description>
    </item>
    <item>
      <title>UI: Deleted an 18-branch category filter in favour of the shared list every other window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-7f483b52e2a5</guid>
      <pubDate>Sat, 25 Jul 2026 16:15:16 -0500</pubDate>
      <description><![CDATA[Deleted an 18-branch category filter in favour of the shared list every other window uses. One branch in it could never run: it checked for Blueprint before Dungeon, and the single dropdown entry reads Blueprint and Dungeon.]]></description>
    </item>
    <item>
      <title>UI: Testing the rebuilt window offline found three real bugs, two older than this work. Table…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f6a8440cc4e8</guid>
      <pubDate>Sat, 25 Jul 2026 16:15:17 -0500</pubDate>
      <description><![CDATA[Testing the rebuilt window offline found three real bugs, two older than this work. Table rows were filled one column short, so the widest column drew nothing and everything after it shifted a slot left: on your own goods that put weights under Durability and values under Weight with the item name missing entirely.]]></description>
    </item>
    <item>
      <title>UI: The same table was converting item text twice, so any name carrying colour or formatting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c0dc7ba284e1</guid>
      <pubDate>Sat, 25 Jul 2026 16:15:18 -0500</pubDate>
      <description><![CDATA[The same table was converting item text twice, so any name carrying colour or formatting drew the markup as literal text. And an icon column was being asked for text it does not have, which logged an error for every row on every frame.]]></description>
    </item>
    <item>
      <title>UI: Names drawn in the world could render as a sliver a few pixels tall, or disappear into…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e446dc4fb432</guid>
      <pubDate>Sat, 25 Jul 2026 17:10:00 -0500</pubDate>
      <description><![CDATA[Names drawn in the world could render as a sliver a few pixels tall, or disappear into the status bar under them. Two causes. The three nameplate font files lost a face measurement during the engine upgrade and shipped with zero, which made every line height derived from them infinite; each is back to its own fonts real value, 1000 for two of them and 2048 for the runic face. Separately the name panel sizes itself to the text inside it, so a line measured before its font finished loading came out at roughly no height and took the whole panel down with it. Every line now reserves its own height. This covered player and creature names as well as location, village, vendor, register and pet labels.]]></description>
    </item>
    <item>
      <title>UI: The Tester Tools and Tester Verification windows could open too short and squash their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1084101663a5</guid>
      <pubDate>Sat, 25 Jul 2026 17:10:09 -0500</pubDate>
      <description><![CDATA[The Tester Tools and Tester Verification windows could open too short and squash their own contents. Text boxes shrank to about three pixels tall, too small to click into, while the fixed-height buttons kept their size and drew outside the window frame. Both windows now declare a minimum size, their contents scroll when the window is smaller than everything inside it, and rows holding a text box no longer shrink. Closing a window also used to save whatever height it happened to have at that moment, so a later build that added a section reopened at the old height and crushed its own fields with no user action involved. Only a size set by dragging the resize corner is remembered now, and an install already stuck too small repairs itself the first time the window opens.]]></description>
    </item>
    <item>
      <title>UI: The vendor price and order dialogs moved to the new interface. They are child windows of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-47727e869ed2</guid>
      <pubDate>Sat, 25 Jul 2026 17:22:12 -0500</pubDate>
      <description><![CDATA[The vendor price and order dialogs moved to the new interface. They are child windows of the vendor, which had already moved, so they were rendering behind it. A price box that read anything unparseable as a number would have listed an item at the wrong price; it reads as zero now and the minimum price rejects it.]]></description>
    </item>
    <item>
      <title>UI: Player-to-player trade is on the new interface: two symmetric halves, gold and an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ab451e0e431c</guid>
      <pubDate>Sat, 25 Jul 2026 17:22:13 -0500</pubDate>
      <description><![CDATA[Player-to-player trade is on the new interface: two symmetric halves, gold and an agreement lamp on each side, and both names signed across the bottom when it goes through. Any change by either side clears both agreements, which is what stops one player agreeing and the other swapping an item out afterwards.]]></description>
    </item>
    <item>
      <title>UI: The property manager moved over as well, with deeds and stored lots as cards rather than…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-48d7859f13e4</guid>
      <pubDate>Sat, 25 Jul 2026 17:22:14 -0500</pubDate>
      <description><![CDATA[The property manager moved over as well, with deeds and stored lots as cards rather than table rows. The slot components stay behind the cards doing the drag and drop work, so putting storage back on a lot runs exactly the code it always did.]]></description>
    </item>
    <item>
      <title>UI: Testing the property manager offline turned up that activating it drew the entire old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c5194794da81</guid>
      <pubDate>Sat, 25 Jul 2026 17:22:15 -0500</pubDate>
      <description><![CDATA[Testing the property manager offline turned up that activating it drew the entire old window behind the new one. Its controls hang directly off the window rather than under a panel that stays hidden, unlike the other windows converted this week.]]></description>
    </item>
    <item>
      <title>UI: Built the UI Toolkit element the scene maps and the compass both need: a window onto a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-86793be44ae7</guid>
      <pubDate>Sat, 25 Jul 2026 18:00:38 -0500</pubDate>
      <description><![CDATA[Built the UI Toolkit element the scene maps and the compass both need: a window onto a texture that can be panned, zoomed and scrolled. The old UI did this by moving a sub-rectangle over the art, and the new one has no direct equivalent, so the replacement generates its own geometry and draws the strip as two pieces when it wraps past the seam instead of stretching one side.]]></description>
    </item>
    <item>
      <title>UI: The rectangle maths behind it is covered by 15 tests rather than checked by eye. Both of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3250a6c059fb</guid>
      <pubDate>Sat, 25 Jul 2026 18:00:39 -0500</pubDate>
      <description><![CDATA[The rectangle maths behind it is covered by 15 tests rather than checked by eye. Both of the conversions involved, the vertical flip and the corner pairing, render a believable-looking map when they are wrong, which is exactly the kind of mistake that survives a glance.]]></description>
    </item>
    <item>
      <title>UI: The map you carry as an item and the town spawn selection window both moved to the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9e9902068ba3</guid>
      <pubDate>Sat, 25 Jul 2026 18:12:46 -0500</pubDate>
      <description><![CDATA[The map you carry as an item and the town spawn selection window both moved to the new UI. Each now has the movable, resizable frame the other rebuilt windows use and remembers its own size and position, you drag the map itself to pan and roll the wheel over it to zoom, and opening several maps at once offsets them instead of stacking them in one spot.]]></description>
    </item>
    <item>
      <title>UI: These two could not be done separately: the spawn window is built on the map window, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3716357431e7</guid>
      <pubDate>Sat, 25 Jul 2026 18:12:47 -0500</pubDate>
      <description><![CDATA[These two could not be done separately: the spawn window is built on the map window, so converting the base converted both in one go. The same thing happened with the two character sheets earlier in the rebuild.]]></description>
    </item>
    <item>
      <title>UI: Two of the input conversions flip sign rather than carry across, because the old UI…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8d7d18e8a949</guid>
      <pubDate>Sat, 25 Jul 2026 18:12:48 -0500</pubDate>
      <description><![CDATA[Two of the input conversions flip sign rather than carry across, because the old UI measured mouse movement and scroll with up being positive and the new one has down being positive. A map that pans or zooms backwards compiles perfectly well, so both directions are covered by tests instead of a look.]]></description>
    </item>
    <item>
      <title>UI: The map you open with M moved to the new UI, keeping its resizable pinnable frame, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-562f225cbe43</guid>
      <pubDate>Sat, 25 Jul 2026 18:23:20 -0500</pubDate>
      <description><![CDATA[The map you open with M moved to the new UI, keeping its resizable pinnable frame, the Follow checkbox, the auto-fade option, the zoom controls, points of interest with their hover names, and the blacked-out unexplored ground in dungeons that hide their map until you walk it.]]></description>
    </item>
    <item>
      <title>UI: The inventory had this one down as having no controller at all. It has 737 lines of one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-35a8ccffbf87</guid>
      <pubDate>Sat, 25 Jul 2026 18:23:21 -0500</pubDate>
      <description><![CDATA[The inventory had this one down as having no controller at all. It has 737 lines of one, sitting on a child object under a namespace the original scan did not look through, which is also why there was no class to convert until a window class was written for the job.]]></description>
    </item>
    <item>
      <title>UI: The fog overlay in unexplored dungeons used to get its alignment for free by being…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2c1dd1e35414</guid>
      <pubDate>Sat, 25 Jul 2026 18:23:22 -0500</pubDate>
      <description><![CDATA[The fog overlay in unexplored dungeons used to get its alignment for free by being parented under the map image in the old UI, inheriting the rotation, flip and zoom without asking. That relationship is the only structural thing the fog drawing depends on, so the rebuilt map nests it the same way.]]></description>
    </item>
    <item>
      <title>UI: A quest marker no longer carries its sparkle effect. It keeps its own colour and still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9d500be4e68a</guid>
      <pubDate>Sat, 25 Jul 2026 18:23:23 -0500</pubDate>
      <description><![CDATA[A quest marker no longer carries its sparkle effect. It keeps its own colour and still draws on top of every other marker.]]></description>
    </item>
    <item>
      <title>UI: Pulled the page-breaking rules for books and signs out into a testable model. The old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9221ca623b15</guid>
      <pubDate>Sat, 25 Jul 2026 18:27:31 -0500</pubDate>
      <description><![CDATA[Pulled the page-breaking rules for books and signs out into a testable model. The old code paginated by handing the text to the old UI and asking where it ran out of room, which meant the rules could not be checked without a font, a label and a running game. The measurement is now supplied by the caller, so word breaks, page breaks, chapter headings, image pages and the page cap are all covered by tests.]]></description>
    </item>
    <item>
      <title>UI: Formatting that crosses a page break moved with it. A colour or a bold run that starts on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b85faeee30d5</guid>
      <pubDate>Sat, 25 Jul 2026 18:27:32 -0500</pubDate>
      <description><![CDATA[Formatting that crosses a page break moved with it. A colour or a bold run that starts on one page is reopened at the top of the next, including the cases player-written books are full of: nested colours, stray closing tags, and brackets that never close.]]></description>
    </item>
    <item>
      <title>UI: The custom sign editor moved to the new UI, with a movable resizable frame that remembers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-974c9ca049c9</guid>
      <pubDate>Sat, 25 Jul 2026 18:32:50 -0500</pubDate>
      <description><![CDATA[The custom sign editor moved to the new UI, with a movable resizable frame that remembers where you left it, the same two fonts, and a character counter that turns red at the limit so a greyed-out Save button has a visible reason.]]></description>
    </item>
    <item>
      <title>UI: It also tells you while you type when the text has grown too long to fit on the sign…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ba4bf0aee268</guid>
      <pubDate>Sat, 25 Jul 2026 18:32:51 -0500</pubDate>
      <description><![CDATA[It also tells you while you type when the text has grown too long to fit on the sign face, instead of letting you save it and finding out later that the last line is missing.]]></description>
    </item>
    <item>
      <title>UI: The town and location labels on the overworld map finished moving off the old UI. They…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-872de830b6cb</guid>
      <pubDate>Sat, 25 Jul 2026 18:38:40 -0500</pubDate>
      <description><![CDATA[The town and location labels on the overworld map finished moving off the old UI. They already drew through the newer text system, but every one of them was still keeping a hidden second copy of its name in the old one, and the banner behind the runic name was being sized by that hidden copy. The banner is now sized from the visible text.]]></description>
    </item>
    <item>
      <title>UI: All 191 of them converted without editing the prefab, because the banner is rebuilt at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f6cded0ffeac</guid>
      <pubDate>Sat, 25 Jul 2026 18:38:41 -0500</pubDate>
      <description><![CDATA[All 191 of them converted without editing the prefab, because the banner is rebuilt at load from the widget that was already there and takes its margins from the anchors that were already authored.]]></description>
    </item>
    <item>
      <title>UI: The sweep removes every old widget on the nameplate rather than the two the script knew…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-cbfd54f6cefd</guid>
      <pubDate>Sat, 25 Jul 2026 18:38:42 -0500</pubDate>
      <description><![CDATA[The sweep removes every old widget on the nameplate rather than the two the script knew about by name. Any one left behind builds itself a new panel when it wakes up, which would have put the old UI straight back.]]></description>
    </item>
    <item>
      <title>UI: Retired a dead playable-piano prefab that the migration list had scheduled as a window to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-68ee64347f0c</guid>
      <pubDate>Sat, 25 Jul 2026 18:40:54 -0500</pubDate>
      <description><![CDATA[Retired a dead playable-piano prefab that the migration list had scheduled as a window to convert. Its controller was 56 lines with all but one inside a block comment, referring to a type that does not exist, and the prefab had no instances in any scene and contained one backdrop and three unwired buttons rather than a keyboard.]]></description>
    </item>
    <item>
      <title>UI: The pianos players actually sit at are unaffected: those are animations on their own…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-4a5fc7c9021d</guid>
      <pubDate>Sat, 25 Jul 2026 18:40:55 -0500</pubDate>
      <description><![CDATA[The pianos players actually sit at are unaffected: those are animations on their own prefabs, and the instrument system that plays the notes was never on the old UI.]]></description>
    </item>
    <item>
      <title>UI: The harvesting swing meter moved to the new UI. The ring, the green target zone, the gold…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-bd046f5604f3</guid>
      <pubDate>Sat, 25 Jul 2026 18:52:49 -0500</pubDate>
      <description><![CDATA[The harvesting swing meter moved to the new UI. The ring, the green target zone, the gold perfect centre and the sweeping red marker are drawn as real curves now instead of rotated sprites, and the mini-game itself plays exactly as before.]]></description>
    </item>
    <item>
      <title>UI: The risky part was never the drawing. While the ring is up the game suppresses jumping…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f11cb8b6faea</guid>
      <pubDate>Sat, 25 Jul 2026 18:52:50 -0500</pubDate>
      <description><![CDATA[The risky part was never the drawing. While the ring is up the game suppresses jumping, attacking and interrupts so the stop key cannot cancel the gather it is meant to resolve, and a flag left set would leave you unable to jump or attack with nothing on screen explaining why. Every way the meter can end now has a test on it.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Vendor Listings in Zone window coming up empty in every town. It drew its table…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-bf284c8c995c</guid>
      <pubDate>Sat, 25 Jul 2026 19:07:10 -0500</pubDate>
      <description><![CDATA[Fixed the <b>Vendor Listings in Zone</b> window coming up empty in every town. It drew its table before the listings had finished loading and never redrew, so the list stayed blank once the loading notice cleared. It now fills in when the listings land, and keeps up when you change category, sort by a column, or search.]]></description>
    </item>
    <item>
      <title>UI: Get Directions in the vendor listings window was reading the selected row from the wrong…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-0595cca3ad79</guid>
      <pubDate>Sat, 25 Jul 2026 19:07:16 -0500</pubDate>
      <description><![CDATA[Get Directions in the vendor listings window was reading the selected row from the wrong place and failed on every click. It now uses the row you selected, and sets a destination to that vendor.]]></description>
    </item>
    <item>
      <title>UI: The compass strip moved to the new UI: the scrolling ribbon, the markers that slide along…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-015a41dcbf7e</guid>
      <pubDate>Sat, 25 Jul 2026 19:07:23 -0500</pubDate>
      <description><![CDATA[The compass strip moved to the new UI: the scrolling ribbon, the markers that slide along it and shrink with distance, the zone name, the scene summary and the game time and date. Destination and quest markers still pin to the end of the strip instead of vanishing when you turn away, and ankhs still show while you are dead.]]></description>
    </item>
    <item>
      <title>UI: This was the one screen that actually needed the wrapping texture window built earlier in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ffb1a04f0f75</guid>
      <pubDate>Sat, 25 Jul 2026 19:07:24 -0500</pubDate>
      <description><![CDATA[This was the one screen that actually needed the wrapping texture window built earlier in the batch. The compass offset climbs forever as you turn and relies on the ribbon repeating past its own seam, which the new UI cannot express by clipping alone, so the strip is drawn as two pieces across the wrap.]]></description>
    </item>
    <item>
      <title>UI: The compass letters are painted into the artwork rather than drawn as text, so they are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3da9126985f2</guid>
      <pubDate>Sat, 25 Jul 2026 19:07:25 -0500</pubDate>
      <description><![CDATA[The compass letters are painted into the artwork rather than drawn as text, so they are different art per language. Keeping that working meant teaching the localized-texture component to hand out what it loaded instead of only pushing it into an old-UI widget.]]></description>
    </item>
    <item>
      <title>UI: Three old files retired with it: the shared location-icon base, the icon component and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1a0bcb0abdcc</guid>
      <pubDate>Sat, 25 Jul 2026 19:07:26 -0500</pubDate>
      <description><![CDATA[Three old files retired with it: the shared location-icon base, the icon component and its prefab. Both things that used them are converted now, so they went together rather than sitting around as the kind of quiet leftover that turns out to be hiding a bug.]]></description>
    </item>
    <item>
      <title>UI: Three more entries on the migration list turned out not to be windows at all. The sheet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5b12c453d823</guid>
      <pubDate>Sat, 25 Jul 2026 19:09:45 -0500</pubDate>
      <description><![CDATA[Three more entries on the migration list turned out not to be windows at all. The sheet music editor is the same script and prefab family as the books it shares a page layout with, the colour picker has exactly one host and lives inside that scene rather than as a prefab, and the recipe info row is a column of the crafting station. All three now point at the parent that will close them instead of sitting there looking unported.]]></description>
    </item>
    <item>
      <title>UI: That closes the medium tier. With no small or medium entries left, the remaining 21 are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c9c6f39f3bf2</guid>
      <pubDate>Sat, 25 Jul 2026 19:09:46 -0500</pubDate>
      <description><![CDATA[That closes the medium tier. With no small or medium entries left, the remaining 21 are all windows or subsystems, which makes the list a set of projects rather than a backlog with a long tail.]]></description>
    </item>
    <item>
      <title>UI: The bottom-right corner of the rebuilt windows now carries a real resize grip: three…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-719c6186be86</guid>
      <pubDate>Sat, 25 Jul 2026 19:31:23 -0500</pubDate>
      <description><![CDATA[The bottom-right corner of the rebuilt windows now carries a real resize grip: three diagonal lines on a small chip that brightens under the cursor, and the mouse pointer switches to the diagonal stretch arrow the old windows used. It had been a faint tinted square that disappeared entirely behind the corner flourish on the Obsidian, Fire, Air and Arcane themes, so nothing told you the window could be dragged bigger.]]></description>
    </item>
    <item>
      <title>UI: The gear button in the Options footer was drawing an empty box on every theme, Classic…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-63d315ee8265</guid>
      <pubDate>Sat, 25 Jul 2026 19:31:24 -0500</pubDate>
      <description><![CDATA[The gear button in the Options footer was drawing an empty box on every theme, Classic included. It asked the font for a gear character that none of the five bundled UI faces actually contains. It uses the gear art from the HUD atlas now. A test bans decorative glyphs in window chrome so the next one gets caught before a player sees it.]]></description>
    </item>
    <item>
      <title>UI: The lot sign is on the new UI. Interacting with a housing sign now opens one window you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a61a839c895c</guid>
      <pubDate>Sat, 25 Jul 2026 20:38:22 -0500</pubDate>
      <description><![CDATA[The lot sign is on the new UI. Interacting with a housing sign now opens one window you can drag by its title bar, with the lot size in the title and the claim, access and house sections stacked in the body instead of three panels sharing one frame. Changing your house and changing a lot reservation take over the window while you are doing them, with Cancel and Accept.]]></description>
    </item>
    <item>
      <title>UI: Every window the sign opens - the deed list, lot permissions, decoration settings, town…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-134479a810df</guid>
      <pubDate>Sat, 25 Jul 2026 20:38:23 -0500</pubDate>
      <description><![CDATA[Every window the sign opens - the deed list, lot permissions, decoration settings, town management and the property manager - was already on the new UI, so this one closed housing out entirely without stubbing anything.]]></description>
    </item>
    <item>
      <title>UI: Pulling the house picker apart turned up a crash that predates the conversion: on a lot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-77b75319bae0</guid>
      <pubDate>Sat, 25 Jul 2026 20:38:24 -0500</pubDate>
      <description><![CDATA[Pulling the house picker apart turned up a crash that predates the conversion: on a lot whose default house is missing from the catalog, the picker threw partway through building itself and left half a list on screen. The lookup now happens before any of the window exists, so a bad default logs and shows the deeds you hold instead.]]></description>
    </item>
    <item>
      <title>UI: The claim, reservation and access rules and the house-catalog rules came out as two…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-615c082ef0c4</guid>
      <pubDate>Sat, 25 Jul 2026 20:38:25 -0500</pubDate>
      <description><![CDATA[The claim, reservation and access rules and the house-catalog rules came out as two models with 47 tests behind them, covering which sizes each lot shape accepts, the case where a house stays listed because it is already built on the lot, and the reservation that names one player beating the town-wide one.]]></description>
    </item>
    <item>
      <title>UI: Old prefab: 11,389 lines. New one: 48.</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-da63dd782b01</guid>
      <pubDate>Sat, 25 Jul 2026 20:38:26 -0500</pubDate>
      <description><![CDATA[Old prefab: 11,389 lines. New one: 48.]]></description>
    </item>
    <item>
      <title>UI: The chat tab options popup is on the new UI. Renaming a tab, setting its font size…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-45993d72481b</guid>
      <pubDate>Sat, 25 Jul 2026 21:05:44 -0500</pubDate>
      <description><![CDATA[The chat tab options popup is on the new UI. Renaming a tab, setting its font size, ticking which channels it carries and deleting it all work the same way; the eighteen channel boxes keep the same three columns in the same order.]]></description>
    </item>
    <item>
      <title>UI: A third of that dialog was dead. The Discord panel behind it had been compiled out of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-232994733bc2</guid>
      <pubDate>Sat, 25 Jul 2026 21:05:45 -0500</pubDate>
      <description><![CDATA[A third of that dialog was dead. The Discord panel behind it had been compiled out of every build for years, so the button did nothing and the line beside it always read the same string no matter what. It is gone, along with the three scripts and the 38 hidden objects that made it up.]]></description>
    </item>
    <item>
      <title>UI: This is the first piece of the chat area to move while the chat window itself is still on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d8a05fa58f15</guid>
      <pubDate>Sat, 25 Jul 2026 21:05:46 -0500</pubDate>
      <description><![CDATA[This is the first piece of the chat area to move while the chat window itself is still on the old UI. It could go early because the dialog never reaches into the chat window: everything it does is a write to the tab.]]></description>
    </item>
    <item>
      <title>UI: The channel boxes came out as a table with tests behind it, which pinned a rule that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5e96eb1f70ec</guid>
      <pubDate>Sat, 25 Jul 2026 21:05:47 -0500</pubDate>
      <description><![CDATA[The channel boxes came out as a table with tests behind it, which pinned a rule that reads like a bug and is not one. A box covering more than one kind of message ticks when the tab carries any of them and turns on all of them, so a tab holding part of a group widens to the whole group the next time you touch it. That is what the old grid did, and changing it would quietly rewrite every saved tab.]]></description>
    </item>
    <item>
      <title>UI: New shared piece: the anchored popup, a panel that opens where you clicked and closes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2e8f3adcc15d</guid>
      <pubDate>Sat, 25 Jul 2026 21:05:48 -0500</pubDate>
      <description><![CDATA[New shared piece: the anchored popup, a panel that opens where you clicked and closes when you click away. The right-click menus now use the same one instead of their own copy. The old popup base also learned not to treat a click inside a new-UI panel as a click outside itself, which had been closing the options popup the instant you touched it.]]></description>
    </item>
    <item>
      <title>UI: Planned the next batch of window conversions, and the plan corrected the note the last…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-7e677dbe4fe6</guid>
      <pubDate>Sat, 25 Jul 2026 21:24:03 -0500</pubDate>
      <description><![CDATA[Planned the next batch of window conversions, and the plan corrected the note the last batch left behind. Nineteen windows are still on the old UI, and the standing conclusion was that none of them could be taken on its own any more, so the next batch would have to open one of the five big composite screens (the heads-up display, chat, the combat hand, the Crown Store, the front end). That is true of three of them, and wrong about eleven: the groundwork those eleven were waiting on has all shipped over the last two weeks. The batch takes ten, including the crafting station and the recipe book, the skill tree, the deck builder and card browser, mail, and the writable book family. The emote bar moved out of the blocked column on a closer read: it shares its slot code with the hotbar, but not its prefab, so it can convert while the hotbar waits for the combat hand.]]></description>
    </item>
    <item>
      <title>UI: Closed the last gap in the shared table that converted windows render their lists…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6a2cfb35d950</guid>
      <pubDate>Sat, 25 Jul 2026 21:37:57 -0500</pubDate>
      <description><![CDATA[Closed the last gap in the shared table that converted windows render their lists through. It could describe a column of text and nothing else, so a column holding a widget drew an empty gap where the widget should be. The crafting station is the first window that needs one, because its recipe list puts a whole recipe card in a column. The card itself is ported now too, ahead of the window: recipe name, icon, chance of success, required skill, and the ingredient rack, with the rules behind it under test. An ingredient reads green when you are carrying enough, teal when the count is only reached by counting your lot storage, and red when you are short either way, and the icon only dims when it is out of reach entirely.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c886bb1940a4</guid>
      <pubDate>Sat, 25 Jul 2026 04:57:00 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/backpack-category-filter.png" alt="The backpack window filtered to the Equipment category"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-7bd832ca4998</guid>
      <pubDate>Sat, 25 Jul 2026 05:19:50 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/container-window-uitk.png" alt="A container window open beside the backpack, each with its own title and readout"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ac5df0158a97</guid>
      <pubDate>Sat, 25 Jul 2026 05:37:10 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/compact-loot-window-uitk.png" alt="The small quick-loot window beside the full backpack window"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-82a5df5560bd</guid>
      <pubDate>Sat, 25 Jul 2026 05:55:39 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/plot-storage-uitk.png" alt="The lot storage window with its lot detail lines and Refresh button"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6135edc0cdf0</guid>
      <pubDate>Sat, 25 Jul 2026 06:16:36 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/bank-window-uitk.png" alt="The bank window open beside the backpack, with Buy More Space and Refresh"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-456d206d8a1b</guid>
      <pubDate>Sat, 25 Jul 2026 06:50:09 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/cooked-food-icons.png" alt="A grid of cooked dish icons: plated fish, pie slices, stews in bowls and sandwiches"></div>]]></description>
    </item>
    <item>
      <title>Images: The weapon enchant line, left to right: the existing Ignite Weapon , then the two new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6b7875d92d4f</guid>
      <pubDate>Sat, 25 Jul 2026 07:23:03 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/weapon-enchant-icons-frost-shock.png" data-full="https://catnipgames.net/blog/images/weapon-enchant-icons-frost-shock.png" alt="Three weapon enchant skill icons side by side: Ignite Weapon, Frost Weapon and Shock Weapon"></div>The weapon enchant line, left to right: the existing <b>Ignite Weapon</b>, then the two new icons for <b>Frost Weapon</b> and <b>Shock Weapon</b>. Each keeps the school colour on the inner disc.]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b7c02ce7efc6</guid>
      <pubDate>Sat, 25 Jul 2026 08:16:18 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/dungeon-builder-wall-snap-web.png" alt="A cobweb seated flush against a curved sewer tunnel wall beside a lit torch, with a crate resting on the floor"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-fe902da813c5</guid>
      <pubDate>Sat, 25 Jul 2026 08:35:22 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/cistern-of-atos-cistern.png" alt="Looking down a stone sewer tunnel into a candlelit flooded cistern chamber with glowing moss on the walls"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1d07917acb7b</guid>
      <pubDate>Sat, 25 Jul 2026 09:02:24 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/emotes-uitk-window.png" alt="The emotes window on the new UI framework, with sortable columns and a search box">]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6354e091b991</guid>
      <pubDate>Sat, 25 Jul 2026 09:42:30 -0500</pubDate>
      <description><![CDATA[<img src="https://catnipgames.net/blog/images/mannequin-uitk-slots.png" alt="The mannequin window on the new UI framework, its empty equipment slots labelled">]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-81e5c72e6881</guid>
      <pubDate>Sat, 25 Jul 2026 10:33:06 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/cistern-of-atos-enclosed.png" alt="The great cistern of the generated dungeon, now a fully walled and vaulted room with standing water and an arched doorway"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-88c35f95db21</guid>
      <pubDate>Sat, 25 Jul 2026 11:16:37 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/character-sheet-uitk.png" alt="The character sheet on the new UI framework: name, live 3D character, equipment slots down both sides, and the stats panel"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-980802b2d030</guid>
      <pubDate>Sat, 25 Jul 2026 13:51:51 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/vendor-nameplate-textmeshpro.png" alt="A stone cash register counter with a vendor name label floating above it, white text with a black outline"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e359ac7df1dd</guid>
      <pubDate>Sat, 25 Jul 2026 15:13:48 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/drowned-vaults-plan.png" alt="Top-down plan of the Drowned Vaults: an entrance ring at the bottom, three hub rooms each wrapped by a gallery loop, and the vault wing at top right"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-80d1b1eca390</guid>
      <pubDate>Sat, 25 Jul 2026 16:15:20 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/vendor-window-uitoolkit-my-listings.png" alt="The rebuilt vendor window on its My Listings tab, showing your own goods beside your listings"></div>]]></description>
    </item>
    <item>
      <title>Images: </title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-03f2734300c5</guid>
      <pubDate>Sat, 25 Jul 2026 19:31:30 -0500</pubDate>
      <description><![CDATA[<div class=\ gallery\><button class=\thumb\ data-full=\/blog/images/uitk-resize-grip-gear-arcane.png\><img src=\/blog/images/uitk-resize-grip-gear-arcane.png\ alt=\The Options window on the Arcane theme, showing the gear icon in the footer and the diagonal resize grip in the bottom-right corner\></div>]]></description>
    </item>
    <item>
      <title>Images · 2026-07-25</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-images</guid>
      <pubDate>Sat, 25 Jul 2026 00:03:02 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/backpack-category-filter.png" alt="The backpack window filtered to the Equipment category"></div>]]></description>
    </item>
    <item>
      <title>Tooling: Cross-checked the decoration catalog against the shipped sewer levels: a new mining pass…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9511ec6f7d3e</guid>
      <pubDate>Sat, 25 Jul 2026 04:38:19 -0500</pubDate>
      <description><![CDATA[Cross-checked the decoration catalog against the shipped sewer levels: a new mining pass measures how high above the floor every prop actually sits in the existing dungeons, which independently confirmed the classification (floor props at ground level, tabletop items just above, wall pieces around 1.5m, ceiling pieces near 3.6m). It also caught seven props the visual pass had misread - the modular steam pipe runs and a chain anchor mount look like floor pieces in isolation, but every instance in the shipped levels is mounted overhead, so those now tell the builder to place them at height instead of dropping them on the ground.]]></description>
    </item>
    <item>
      <title>Tooling: Proved the dungeon builder's new placement guards on a test dungeon. Wall and ceiling…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3b8e5b8a8fe8</guid>
      <pubDate>Sat, 25 Jul 2026 08:16:18 -0500</pubDate>
      <description><![CDATA[Proved the dungeon builder's new placement guards on a test dungeon. Wall and ceiling decorations now seat by the face that touches the surface rather than their pivot point, which fixes props sinking into stone or burying themselves above the ceiling; cobwebs now sit within a centimetre of the ceiling and a deep moss patch rests flush against the wall. Also confirmed the pathfinding guard works in the failing direction: walling off a corridor makes the build stop and name the room that got cut off. Added a check for decorations clipping into each other, which no surface snap can catch.]]></description>
    </item>
    <item>
      <title>Tooling: The blog publisher stopped verifying its own deploy once the site passed 126 images. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6d75937cb2fd</guid>
      <pubDate>Sat, 25 Jul 2026 15:18:13 -0500</pubDate>
      <description><![CDATA[The blog publisher stopped verifying its own deploy once the site passed 126 images. It checked every file in a single command, and the list finally outgrew the maximum command length, so the last path was cut in half and the check failed on a filename that did not exist. It now streams the list instead of pasting it into the command, which has no such ceiling.]]></description>
    </item>
    <item>
      <title>Rendering: Benchmarked Pixel Art mode across two scenes and found the pixel grid needs to be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f9dff8105571</guid>
      <pubDate>Sat, 25 Jul 2026 04:43:23 -0500</pubDate>
      <description><![CDATA[Benchmarked <b>Pixel Art mode</b> across two scenes and found the pixel grid needs to be anchored at the distance the scenery actually sits, not at the player. On a Soltown street the grid snap only removed about a quarter of the camera-caused pixel churn; anchoring it at 12 meters instead of the 3.65-meter camera distance removed effectively all of it. On an open island shoreline both settings were already clean. The mode is unchanged for now while we settle which anchoring rule to ship.]]></description>
    </item>
    <item>
      <title>Rendering: Checked the ocean shoreline against the pixel grid for the first time: the waterline…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8c62b9041dcf</guid>
      <pubDate>Sat, 25 Jul 2026 04:43:23 -0500</pubDate>
      <description><![CDATA[Checked the ocean shoreline against the pixel grid for the first time: the waterline holds as a clean edge with no tearing or crawl, so the camera snap and the water system do not fight. The 32-color palette does flatten the teal water to grey, which joins the color-tuning list. Also corrected an earlier measurement: the first "no camera flicker at all" reading came from a test spot where scene animation already churned half the screen, leaving no room to measure the camera at all.]]></description>
    </item>
    <item>
      <title>Rendering: Fixed outdoor ground rendering almost black close to the camera while grass, trees and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a9f52efa8abc</guid>
      <pubDate>Sat, 25 Jul 2026 20:57:27 -0500</pubDate>
      <description><![CDATA[Fixed outdoor ground rendering almost black close to the camera while grass, trees and distant terrain looked normal. Three reports over two weeks (Solace Bridge Outskirts, Sequanna Colossus, Mistrendur) turned out to be one cause: the terrain shader lost its deferred lighting variants when scenes were packed, and deferred is the path the game actually draws with.]]></description>
    </item>
    <item>
      <title>Rendering: The per-scene terrain shaders come in pairs, one for ground near you and one for ground…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-18c44cccf9ac</guid>
      <pubDate>Sat, 25 Jul 2026 20:57:27 -0500</pubDate>
      <description><![CDATA[The per-scene terrain shaders come in pairs, one for ground near you and one for ground in the distance, and only the first was covered by the variant protection. Both halves are protected now, with four new automated checks so a future edit that drops the deferred variants fails the test run instead of shipping.]]></description>
    </item>
    <item>
      <title>Terrain: Re-saved the terrain data for Ardoris, Necropolis Barrens, Central Brittany, Jaanaford…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-17b34ac03297</guid>
      <pubDate>Sat, 25 Jul 2026 05:04:24 -0500</pubDate>
      <description><![CDATA[Re-saved the terrain data for Ardoris, Necropolis Barrens, Central Brittany, Jaanaford and South Varisalla Foothills into the current engine format. All five were still stored in the 2018 format, which the engine reads more slowly and reports as deprecated on every import.]]></description>
    </item>
    <item>
      <title>Terrain: Confirmed nothing was lost in the conversion by comparing terrain layers, heightmap…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e9d4d89bf8a3</guid>
      <pubDate>Sat, 25 Jul 2026 05:04:25 -0500</pubDate>
      <description><![CDATA[Confirmed nothing was lost in the conversion by comparing terrain layers, heightmap resolution and full-heightmap sum, texture layer counts, grass and tree prototype counts, and tree instance counts before and after. Every value matched, and the stuck-spot fixes those maps had received are intact.]]></description>
    </item>
    <item>
      <title>Build health: These five terrains were not leftovers. A bulk conversion in June had already cleared…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a4f6119ec788</guid>
      <pubDate>Sat, 25 Jul 2026 05:04:31 -0500</pubDate>
      <description><![CDATA[These five terrains were not leftovers. A bulk conversion in June had already cleared every old-format terrain, and four of the five were in it. They came back because level design still works in the older editor, so their map edits get written back in the old format and land on top of the conversion. Expect this until the version move is finished.]]></description>
    </item>
    <item>
      <title>Build health: Added a check that reads the format stamp from the first twelve bytes of each terrain…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ad19637dd31b</guid>
      <pubDate>Sat, 25 Jul 2026 05:04:32 -0500</pubDate>
      <description><![CDATA[Added a check that reads the format stamp from the first twelve bytes of each terrain file. It covers all 44,247 asset files in a few seconds and, unlike the build log, does not depend on which files the editor happened to reload that session.]]></description>
    </item>
    <item>
      <title>Build health: Two leftover files from third-party sample content turned out to be unreadable rather…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e4298f1857db</guid>
      <pubDate>Sat, 25 Jul 2026 05:04:33 -0500</pubDate>
      <description><![CDATA[Two leftover files from third-party sample content turned out to be unreadable rather than merely out of date, so they could not be converted. One had 69 bytes stripped out of it when it was first added to version control seven days ago, a repeat of a problem fixed back in June for the files that existed at the time. Both are sample content that never ships, and both are now tracked.]]></description>
    </item>
    <item>
      <title>Build health: Deleted the two unreadable sample-content files rather than trying to convert them…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b7ce1a95284e</guid>
      <pubDate>Sat, 25 Jul 2026 05:26:25 -0500</pubDate>
      <description><![CDATA[Deleted the two unreadable sample-content files rather than trying to convert them. Neither could be opened by the engine at all, and one had been damaged when it was first added to version control. Both came from third-party sample content that never ships, and the only thing referencing either was that package's own demo scene. Every asset file in the project now uses the current format.]]></description>
    </item>
    <item>
      <title>Build health: Wrote up two Unity test-runner traps that cost time this morning: a leftover pending-run…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ee19f825ee99</guid>
      <pubDate>Sat, 25 Jul 2026 06:07:44 -0500</pubDate>
      <description><![CDATA[Wrote up two Unity test-runner traps that cost time this morning: a leftover pending-run marker that jams every later test run with a stale request id and never times out, and a manager singleton whose setup code throws the moment editor-side test code touches it. Both now have the exact fix in the test-runner notes.]]></description>
    </item>
    <item>
      <title>Images: The same shoreline with Pixel Art mode on and off, at a pinned camera and frozen midday…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2db23a02553e</guid>
      <pubDate>Sat, 25 Jul 2026 04:43:32 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/pixelart-island-shoreline-on.png" data-full="https://catnipgames.net/blog/images/pixelart-island-shoreline-on.png" alt="Island shoreline rendered through Pixel Art mode"><img src="https://catnipgames.net/blog/images/pixelart-island-shoreline-off.png" data-full="https://catnipgames.net/blog/images/pixelart-island-shoreline-off.png" alt="The same island shoreline rendered normally"></div>The same shoreline with <b>Pixel Art mode</b> on and off, at a pinned camera and frozen midday. The interface stays full resolution over the pixelated world; the waterline holds its shape against the pixel grid.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-25</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-images-2</guid>
      <pubDate>Sat, 25 Jul 2026 00:02:46 -0500</pubDate>
      <description><![CDATA[<div class="gallery"><img src="https://catnipgames.net/blog/images/pixelart-island-shoreline-on.png" data-full="https://catnipgames.net/blog/images/pixelart-island-shoreline-on.png" alt="Island shoreline rendered through Pixel Art mode"><img src="https://catnipgames.net/blog/images/pixelart-island-shoreline-off.png" data-full="https://catnipgames.net/blog/images/pixelart-island-shoreline-off.png" alt="The same island shoreline rendered normally"></div>]]></description>
    </item>
    <item>
      <title>Audio: Background music now fades on every change instead of only the first one in a quiet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3a11959ac146</guid>
      <pubDate>Sat, 25 Jul 2026 05:17:06 -0500</pubDate>
      <description><![CDATA[Background music now fades on every change instead of only the first one in a quiet stretch. Ordinary track changes, walking between music areas, jukeboxes, and dying and resurrecting all ramp over two seconds; most of those used to swap over instantly, and crossing the edge of a music area twice in quick succession could leave two tracks playing at once or produce a one-frame jump to full volume. Reported against the atrium and tunnel boundary in Crypt of the Avatar.]]></description>
    </item>
    <item>
      <title>Audio: Music areas nest properly now: walking out of a large area while still standing inside a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f33ff93cb47a</guid>
      <pubDate>Sat, 25 Jul 2026 05:17:13 -0500</pubDate>
      <description><![CDATA[Music areas nest properly now: walking out of a large area while still standing inside a smaller one keeps the smaller area playing rather than dropping back to the scene default. Fade length moved out of the code into a tweak value so audio can retune it without a build, and a track whose file fails to load is skipped instead of stalling the playlist until the next scene change.]]></description>
    </item>
    <item>
      <title>Audio: Fixed the Rend swing sound starting during the wind-up. The sound comes from the skill's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-eceb0a36e226</guid>
      <pubDate>Sat, 25 Jul 2026 06:06:29 -0500</pubDate>
      <description><![CDATA[Fixed the <b>Rend</b> swing sound starting during the wind-up. The sound comes from the skill's start effect, which had no delay set, so it began the moment the skill activated: its loudest point landed at 0.48s, while the blade does not visibly sweep until 0.66s. Delaying the start effect by 0.18s puts the two together. That start effect carries no particles or lights, so nothing visual moved.]]></description>
    </item>
    <item>
      <title>Audio: Traced the Double Slash report of no sound on the second hit. The skill applies two hits…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-201662c74622</guid>
      <pubDate>Sat, 25 Jul 2026 06:06:40 -0500</pubDate>
      <description><![CDATA[Traced the <b>Double Slash</b> report of no sound on the second hit. The skill applies two hits, at 0.667s and 0.95s, and stages two slash particles to match, but its start effect fires a single swing sound. The earlier theory that a repeat-sound window swallowed the second one does not hold: that suppression is switched off on this effect, and the two hits are 0.283s apart against a 0.2s window. Left open pending a listen on whether the shipped 1.04s clip already covers both swings.]]></description>
    </item>
    <item>
      <title>Audio: Settled how animation event times are stored in an imported model's meta file: the value…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-effcd0ca3ddd</guid>
      <pubDate>Sat, 25 Jul 2026 06:06:42 -0500</pubDate>
      <description><![CDATA[Settled how animation event times are stored in an imported model's meta file: the value is a 0 to 1 fraction of the clip rather than a time in seconds. Across 1,828 avatar model files no event time exceeds 1.0, and a 2.13s walk cycle places its four footsteps at 0.25, 0.50, 0.75 and 1.00. Reading them as seconds would have put the Rend sound fix roughly 0.3s off, so the runtime clip was probed to confirm the converted values.]]></description>
    </item>
    <item>
      <title>Audio: Fixed torch crates in dungeons and sewers that kept crackling after the torch was taken…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6f6de7889bdc</guid>
      <pubDate>Sat, 25 Jul 2026 05:57:46 -0500</pubDate>
      <description><![CDATA[Fixed torch crates in dungeons and sewers that kept crackling after the torch was taken out of them. Hiding a picked-up item faded its mesh and turned its light off but left the looping sound playing for the 60 to 180 seconds until it respawned, so an empty crate still sounded like something was burning. The sound now stops with the flame and comes back when the item does, and the same applies to any pickup carrying a looping sound.]]></description>
    </item>
    <item>
      <title>Audio: Zombie voices now follow the body that spawned. Solace Bridge spawns its zombies from a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-20c72af7efa0</guid>
      <pubDate>Sat, 25 Jul 2026 21:54:46 -0500</pubDate>
      <description><![CDATA[Zombie voices now follow the body that spawned. Solace Bridge spawns its zombies from a pool of four models, an adult woman, an adult man, a girl and a boy, and all four shared one set of dialogue, so all four groaned in the same old man's voice. The children now have children's voices and the adults have their own rasping undead ones.]]></description>
    </item>
    <item>
      <title>Audio: The voice a character speaks in can now be pinned to the creature model it spawned as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6f94b0e19e1b</guid>
      <pubDate>Sat, 25 Jul 2026 21:54:47 -0500</pubDate>
      <description><![CDATA[The voice a character speaks in can now be pinned to the creature model it spawned as, not just to its dialogue file and gender. That was the only thing that could tell the four zombie bodies apart, since a spawn point rolls the model at random and hands every one of them the same dialogue. 64 new clips generated and published.]]></description>
    </item>
    <item>
      <title>Tools: Publishing this work log took five and a half minutes; it now takes eight seconds. Almost…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2da104729b81</guid>
      <pubDate>Sat, 25 Jul 2026 05:01:06 -0500</pubDate>
      <description><![CDATA[Publishing this work log took five and a half minutes; it now takes eight seconds. Almost all of that time was spent uploading 2,389 small bookkeeping files that the site never actually serves, one at a time. The deploy now sends only what the site needs, and only the parts that changed since last time.]]></description>
    </item>
    <item>
      <title>Tools: The work log was showing 20 bullets twice, some of them under a repeated section heading…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-44c79630754c</guid>
      <pubDate>Sat, 25 Jul 2026 06:57:41 -0500</pubDate>
      <description><![CDATA[The work log was showing 20 bullets twice, some of them under a repeated section heading. Most of the duplicates came from a recovery pass that re-added entries which had only looked missing, because they were written on another machine that had not pushed yet.]]></description>
    </item>
    <item>
      <title>Tools: The work log now drops a bullet whose text it has already used when it builds the pages…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-634a33271b48</guid>
      <pubDate>Sat, 25 Jul 2026 06:57:42 -0500</pubDate>
      <description><![CDATA[The work log now drops a bullet whose text it has already used when it builds the pages, and the tool that adds bullets skips one that already exists for that day. Publishing reports any duplicate files left in the store. Bullet count across all pages went from 2,411 to 2,391, and the 18 duplicate files were deleted.]]></description>
    </item>
    <item>
      <title>Tools: Work-log publishing is now pinned to a single machine. Every workspace still adds its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6102e811c07d</guid>
      <pubDate>Sat, 25 Jul 2026 07:31:05 -0500</pubDate>
      <description><![CDATA[Work-log publishing is now pinned to a single machine. Every workspace still adds its bullets to the shared entry store and commits them; one designated machine renders and deploys, so the live page no longer loses bullets a checkout has not pulled yet.]]></description>
    </item>
    <item>
      <title>Tools: The publish step warns when the shared branch has work-log entries that are not in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-786cf9fed138</guid>
      <pubDate>Sat, 25 Jul 2026 07:31:06 -0500</pubDate>
      <description><![CDATA[The publish step warns when the shared branch has work-log entries that are not in the local checkout, so a deploy does not go out mid-sync.]]></description>
    </item>
    <item>
      <title>Tools: Raised the daily Headlines box cap from 7 to 12 stars.</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ee9f7950d67a</guid>
      <pubDate>Sat, 25 Jul 2026 07:31:07 -0500</pubDate>
      <description><![CDATA[Raised the daily Headlines box cap from 7 to 12 stars.]]></description>
    </item>
    <item>
      <title>Tools: The instancing audit had been filtering on our own shader name prefix, so every tree and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-295608145b3d</guid>
      <pubDate>Sat, 25 Jul 2026 12:52:46 -0500</pubDate>
      <description><![CDATA[The instancing audit had been filtering on our own shader name prefix, so every tree and plant in the game was silently missing from its coverage numbers. Widened it, and added tests that fail if a crop ever gets its cross-fade back.]]></description>
    </item>
    <item>
      <title>Tools: The after-deploy task sweep now decides what is testable from the build itself. It reads…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6a99864c73c6</guid>
      <pubDate>Sat, 25 Jul 2026 17:06:50 -0500</pubDate>
      <description><![CDATA[The after-deploy task sweep now decides what is testable from the build itself. It reads which build is live, walks that build history, and only marks a task ready when every commit behind it is actually in that build, then writes the build number, the comment and the status in one go. A half-finished feature keeps waiting instead of going out to testers early.]]></description>
    </item>
    <item>
      <title>Tools: In-game bug reports now record the graphics API and shadow distance alongside the GPU…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-0bc50bac409d</guid>
      <pubDate>Sat, 25 Jul 2026 20:57:28 -0500</pubDate>
      <description><![CDATA[In-game bug reports now record the graphics API and shadow distance alongside the GPU name. All three black-ground reports arrived without them, which left a driver cause and a content cause impossible to tell apart from the report alone.]]></description>
    </item>
    <item>
      <title>NPCs: Started on Generative NPCs . An NPC can now be given a written personality, covering who…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-043122f4e56f</guid>
      <pubDate>Sat, 25 Jul 2026 05:23:07 -0500</pubDate>
      <description><![CDATA[Started on <b>Generative NPCs</b>. An NPC can now be given a written personality, covering who they are, what they know, how they speak and what they will not discuss, and hold a conversation from it instead of every line being authored by hand in advance. This first pass covers developer-placed NPCs and typed text only.]]></description>
    </item>
    <item>
      <title>NPCs: The conversation never goes straight from the game to an outside service. The game server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-25452e19f28d</guid>
      <pubDate>Sat, 25 Jul 2026 05:23:08 -0500</pubDate>
      <description><![CDATA[The conversation never goes straight from the game to an outside service. The game server sits in the middle, decides which personality an NPC is allowed to use, and checks every generated line before it can be shown. If any part of that is unavailable the NPC says a short fixed line rather than stalling mid-sentence.]]></description>
    </item>
    <item>
      <title>NPCs: Repeated openers are reused rather than regenerated, and there are per-NPC and per-day…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-88fb748a7b76</guid>
      <pubDate>Sat, 25 Jul 2026 05:23:09 -0500</pubDate>
      <description><![CDATA[Repeated openers are reused rather than regenerated, and there are per-NPC and per-day limits, so a crowd all greeting the same NPC at once does not turn into runaway cost. The whole feature is switched off by default and is not running on any server yet.]]></description>
    </item>
    <item>
      <title>NPCs: Creatures that roam the world map, and a small set of interactive props, were meant to be…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-635a10b21568</guid>
      <pubDate>Sat, 25 Jul 2026 19:35:56 -0500</pubDate>
      <description><![CDATA[Creatures that roam the world map, and a small set of interactive props, were meant to be untouchable for their whole life. They were flagged that way at spawn, but the AI pass that runs twice a second overwrote the flag, so they spent almost all of their time on screen as ordinary damageable creatures. Both places now read the same rule.]]></description>
    </item>
    <item>
      <title>Housing: Unclaiming a lot now warns you first if that lot has a basement or a dungeon, and says…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-be9b0d53b11b</guid>
      <pubDate>Sat, 25 Jul 2026 06:01:22 -0500</pubDate>
      <description><![CDATA[Unclaiming a lot now warns you first if that lot has a basement or a dungeon, and says how many items are in each. When either level holds anything, the confirmation makes you type <strong>Unclaim Lot</strong> before the button turns on, the same gate character deletion uses. A lot with neither level keeps the dialog it always had.]]></description>
    </item>
    <item>
      <title>Housing: The reason the warning matters: releasing a lot yourself is the one path that does not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-7a18d5ad30be</guid>
      <pubDate>Sat, 25 Jul 2026 06:01:22 -0500</pubDate>
      <description><![CDATA[The reason the warning matters: releasing a lot yourself is the one path that does not keep your layout. It empties the lot, the basement and the dungeon into the local bank as loose items, while getting evicted or lapsing on taxes parks all three in Property Manager storage still arranged. The new message says so and points at the Property Manager.]]></description>
    </item>
    <item>
      <title>Housing: The item counts come from the server on the deed record, so the warning works from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e7425258aaf2</guid>
      <pubDate>Sat, 25 Jul 2026 06:01:22 -0500</pubDate>
      <description><![CDATA[The item counts come from the server on the deed record, so the warning works from the Lot Deeds window in any scene, not just while standing on the lot. It re-reads the counts right before the dialog opens, so a basement you decorated this session reports what is actually in it.]]></description>
    </item>
    <item>
      <title>Housing: Lot markers in player-owned towns now level the ground under themselves instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-897d05188a6f</guid>
      <pubDate>Sat, 25 Jul 2026 06:31:08 -0500</pubDate>
      <description><![CDATA[Lot markers in player-owned towns now level the ground under themselves instead of refusing to place on a slope. The old check gave up once the ground varied by about 0.2m across the whole footprint, which made the larger lot sizes very hard to site; the limit is now 1.5m, and past that the placement is refused with a message saying how much slope it found. Houses on a lot level their own footprint the same way. Water lots are unchanged.]]></description>
    </item>
    <item>
      <title>Housing: The levelling is worked out on each client from lot positions the server already stores…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-347b5dcf160a</guid>
      <pubDate>Sat, 25 Jul 2026 06:31:08 -0500</pubDate>
      <description><![CDATA[The levelling is worked out on each client from lot positions the server already stores, so nothing new is saved and no database change was needed. Each levelled area is rebuilt from a pristine copy of the terrain and replayed in a fixed order, which is what makes picking a lot back up restore the ground exactly and keeps two players standing in the same town seeing the same result. Covered by 16 tests, including one that checks three overlapping lots produce identical ground under all six arrival orders.]]></description>
    </item>
    <item>
      <title>Housing: Placed decoration creatures, home automatons and town service NPCs no longer take on a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-45b76a7ee1be</guid>
      <pubDate>Sat, 25 Jul 2026 19:19:36 -0500</pubDate>
      <description><![CDATA[Placed decoration creatures, home automatons and town service NPCs no longer take on a lot owner's PvP state. They carry the same internal pet marker as a real combat pet, so on a PvP-enabled lot they were still reading as attackable through a second path that ran ahead of the faction table. The earlier fix closed one path; this closes the other.]]></description>
    </item>
    <item>
      <title>Housing: Lot permissions given out by a guild officer now end when that officer stops being an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2c6a2d81438d</guid>
      <pubDate>Sat, 25 Jul 2026 19:31:20 -0500</pubDate>
      <description><![CDATA[Lot permissions given out by a guild officer now end when that officer stops being an officer of the lot owner's guild. Being kicked, leaving, or being demoted all revoke the grants they handed out, as does the owner leaving the guild or turning the guild lot setting off. Permissions the owner set themselves are untouched and stay until the owner changes them.]]></description>
    </item>
    <item>
      <title>World: Fixed the large fountain in the Brittany Alleys town square, which had no interaction at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-73982ee50fcb</guid>
      <pubDate>Sat, 25 Jul 2026 05:59:03 -0500</pubDate>
      <description><![CDATA[Fixed the large fountain in the Brittany Alleys town square, which had no interaction at all: players could not draw water there and had to walk to another Brittany scene to fill a bucket. The fountain had been unpacked from its prefab and lost the components that made it usable, so it was rebuilt to match the working fountains in Brittany, Brittany Estates, and Brittany Wharfs. It now shows a Take Water prompt and hands over a bucket of water.]]></description>
    </item>
    <item>
      <title>World: Two players can dance together now. /partner asks someone to dance, they get an accept or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-4e0069041c83</guid>
      <pubDate>Sat, 25 Jul 2026 06:49:09 -0500</pubDate>
      <description><![CDATA[Two players can dance together now. <b>/partner</b> asks someone to dance, they get an accept or decline prompt, and on accept both characters turn to face each other and start the dance on the same beat. The game already had matching lead and follow halves of the Waltz, but pairing them meant standing close, lining yourselves up by eye, and trying to type /dance at the same moment.]]></description>
    </item>
    <item>
      <title>World: Only the player who accepts a dance is moved, onto a spot in front of the person who…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c7c1452ad1c6</guid>
      <pubDate>Sat, 25 Jul 2026 06:49:17 -0500</pubDate>
      <description><![CDATA[Only the player who accepts a dance is moved, onto a spot in front of the person who asked, and the step is refused if that spot is blocked or is a real drop. The one who asked never moves. Dance invites also respect the block list, expire after 30 seconds, rate-limit repeat asks, and can be turned off entirely with a new Auto-Decline Dance Invites option.]]></description>
    </item>
    <item>
      <title>World: Added /mimic , which copies whatever emote another player performs and keeps copying as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-00104f8b084a</guid>
      <pubDate>Sat, 25 Jul 2026 06:49:17 -0500</pubDate>
      <description><![CDATA[Added <b>/mimic</b>, which copies whatever emote another player performs and keeps copying as they change it. It never drags you along behind them, which is what separates it from /follow, and it only performs emotes you already own.]]></description>
    </item>
    <item>
      <title>World: Vendor, cash register and pet name labels in the world now render with TextMeshPro…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a8d175e2937e</guid>
      <pubDate>Sat, 25 Jul 2026 13:51:59 -0500</pubDate>
      <description><![CDATA[Vendor, cash register and pet name labels in the world now render with TextMeshPro instead of the old UI system. The text is built at load from the label already on each object, so all 39 of those objects were converted without editing any of them, and any new one picks it up for free.]]></description>
    </item>
    <item>
      <title>World: Player-typed vendor names can no longer contain formatting markup on a world label…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-46c9be936638</guid>
      <pubDate>Sat, 25 Jul 2026 13:52:00 -0500</pubDate>
      <description><![CDATA[Player-typed vendor names can no longer contain formatting markup on a world label. Colour is applied to the label itself now, which also fixed the stray bracket codes that would have shown up around a coloured name.]]></description>
    </item>
    <item>
      <title>World: In Spindelskog, one shadow bear spawn spot sat about 11 meters from the Ancient Platform…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-65c5c273be39</guid>
      <pubDate>Sat, 25 Jul 2026 21:29:17 -0500</pubDate>
      <description><![CDATA[In Spindelskog, one shadow bear spawn spot sat about 11 meters from the Ancient Platform, the raised platform whose discs move you between the Hard and Extreme versions of the scene, so a bear was on top of you the moment you arrived. That spawn spot moved deeper into the northeast pocket, about 39 meters out, which matches the 37 meter or wider gap every other entrance in the scene already had. Bear numbers in the area are unchanged, and the new spot was picked off the scene navigation data so a large creature stands on it cleanly.]]></description>
    </item>
    <item>
      <title>Housing: Decorations that behave like NPCs, such as house automatons and other placed deco NPCs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1052570fb60a</guid>
      <pubDate>Sat, 25 Jul 2026 06:31:24 -0500</pubDate>
      <description><![CDATA[Decorations that behave like NPCs, such as house automatons and other placed deco NPCs, could be attacked and killed by other players inside a basement switched to Open PvP. They now keep the non-combatant standing they were built with, so a visitor can no longer destroy the decorations on someone else&#39;s lot. Player Owned Town NPCs like bankers and merchants were affected the same way and are covered too.]]></description>
    </item>
    <item>
      <title>Housing: Combat pets and summons are deliberately unchanged and remain attackable in an Open PvP…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1cb203ce8e66</guid>
      <pubDate>Sat, 25 Jul 2026 06:31:30 -0500</pubDate>
      <description><![CDATA[Combat pets and summons are deliberately unchanged and remain attackable in an Open PvP basement, since opting a lot into PvP is the whole point of the switch.]]></description>
    </item>
    <item>
      <title>Gameplay: Rebuilt the /follow command. It now takes a player name, stops with /unfollow or /follow…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-82316fad6a86</guid>
      <pubDate>Sat, 25 Jul 2026 06:08:00 -0500</pubDate>
      <description><![CDATA[Rebuilt the <b>/follow</b> command. It now takes a player name, stops with <b>/unfollow</b> or <b>/follow stop</b>, and has close, near and far distance settings that use the same distances as pet follow. Every form of the command prints a result; before this it printed nothing whether it worked or failed.]]></description>
    </item>
    <item>
      <title>Gameplay: Fixed following another player dropping you to a crawl once you closed to about four…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b44e7414feb0</guid>
      <pubDate>Sat, 25 Jul 2026 06:08:00 -0500</pubDate>
      <description><![CDATA[Fixed following another player dropping you to a crawl once you closed to about four meters, which left you falling behind and then sprinting to catch up on a loop. Other players also saw a follower slide along in an idle pose instead of running.]]></description>
    </item>
    <item>
      <title>Gameplay: Casting a spell no longer cancels your follow. Follow still ends on death, mounting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-935a0cd0d8b6</guid>
      <pubDate>Sat, 25 Jul 2026 06:08:08 -0500</pubDate>
      <description><![CDATA[Casting a spell no longer cancels your follow. Follow still ends on death, mounting, changing scene, your own movement keys, and when the person you are following gets far enough away, which now says so instead of just stopping.]]></description>
    </item>
    <item>
      <title>Gameplay: Added two new weapon enchants: Frost Weapon in the Water tree and Shock Weapon in the Air…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9b101224e6ad</guid>
      <pubDate>Sat, 25 Jul 2026 07:22:55 -0500</pubDate>
      <description><![CDATA[Added two new weapon enchants: <b>Frost Weapon</b> in the Water tree and <b>Shock Weapon</b> in the Air tree. Each is learned after its school's first attack spell and wraps the equipped weapon in its element for the duration.]]></description>
    </item>
    <item>
      <title>Gameplay: Frost Weapon adds water damage and slows what you hit by 15% for a few seconds. Shock…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-089c7e422f3e</guid>
      <pubDate>Sat, 25 Jul 2026 07:22:56 -0500</pubDate>
      <description><![CDATA[Frost Weapon adds water damage and slows what you hit by 15% for a few seconds. Shock Weapon adds air damage and rolls a small chance to stun. Both add less raw damage per hit than Ignite Weapon and trade it for the extra effect.]]></description>
    </item>
    <item>
      <title>Gameplay: The ice and lightning weapon effects were already built and sitting in the game. Nothing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2be2bbf40e8d</guid>
      <pubDate>Sat, 25 Jul 2026 07:22:57 -0500</pubDate>
      <description><![CDATA[The ice and lightning weapon effects were already built and sitting in the game. Nothing had ever pointed at the lightning one, and the ice one was only reachable from a dragon bite, so both were finished art no player could see.]]></description>
    </item>
    <item>
      <title>Docs: Wrote up how to time a skill sound against its animation in the FX audio doc: which field…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-7df3ee069a1d</guid>
      <pubDate>Sat, 25 Jul 2026 06:11:45 -0500</pubDate>
      <description><![CDATA[Wrote up how to time a skill sound against its animation in the FX audio doc: which field is the only per-skill timing knob, why a weapon sound is never an animation keyframe, the normalized event-time conversion, and the two caveats on adding a delay (one timing slot against four animation variants, and an interrupt still letting the sound through).]]></description>
    </item>
    <item>
      <title>Docs: Recounted the interface migration inventory after this batch: 129 of 181 elements are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2936f9553663</guid>
      <pubDate>Sat, 25 Jul 2026 14:23:06 -0500</pubDate>
      <description><![CDATA[Recounted the interface migration inventory after this batch: 129 of 181 elements are done, 14 fold into a larger screen, and 38 remain. Every remaining one is at least a full window of work.]]></description>
    </item>
    <item>
      <title>Guilds: Planned the expanded guild rank system players asked for on the forums: more tiers than…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f4ba45414169</guid>
      <pubDate>Sat, 25 Jul 2026 06:25:07 -0500</pubDate>
      <description><![CDATA[Planned the expanded guild rank system players asked for on the forums: more tiers than Leader/Officer/Member, guild-chosen titles for each, and per-tier control over guild property. Ranks will be a new setting rather than an extension of the existing three roles, and existing guilds keep their current behaviour until a guild master edits their ranks for the first time.]]></description>
    </item>
    <item>
      <title>Guilds: The property half rides machinery that already exists: a guild lot can map each rank onto…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-faea5eb90bb3</guid>
      <pubDate>Sat, 25 Jul 2026 06:25:08 -0500</pubDate>
      <description><![CDATA[The property half rides machinery that already exists: a guild lot can map each rank onto the same access ladder lots already use for individual players, so containers, vendors, decoration rights and the crafting supply chests all follow the rank without new rules. Rooms and wings are a different matter and stay out of scope; the practical substitute is the basement.]]></description>
    </item>
    <item>
      <title>Guilds: Planning turned up four problems in the current guild and lot permission code, filed as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d3b987a06df3</guid>
      <pubDate>Sat, 25 Jul 2026 06:25:08 -0500</pubDate>
      <description><![CDATA[Planning turned up four problems in the current guild and lot permission code, filed as their own bugs. Two are live today: a lot permission granted through guild standing outlives being kicked from the guild, and vendor access lingers for a few minutes after a demotion. The other two would have been triggered by adding ranks.]]></description>
    </item>
    <item>
      <title>Guilds: Guild rank changes now check the rank of the person making them: nobody can hand out a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a10818304934</guid>
      <pubDate>Sat, 25 Jul 2026 21:00:01 -0500</pubDate>
      <description><![CDATA[Guild rank changes now check the rank of the person making them: nobody can hand out a rank above their own, or change the rank of a member who outranks them. The same rule already applied to lot and town permissions. Nothing changes for guilds today, since only the guild leader can set ranks at all.]]></description>
    </item>
    <item>
      <title>Crafting: Failed crafts no longer claim "All fuels were consumed" when the recipe uses no fuel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-4eaac47bd401</guid>
      <pubDate>Sat, 25 Jul 2026 06:25:39 -0500</pubDate>
      <description><![CDATA[Failed crafts no longer claim "All fuels were consumed" when the recipe uses no fuel. Butchering was the clearest case, with no fuel ingredient in any of its 338 recipes; 1,388 of the game's 3,283 recipes were showing the false line. Recipes that do burn fuel still say so.]]></description>
    </item>
    <item>
      <title>Crown Shop: Buying several copies of a Crown Shop item no longer means clicking Purchase once per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-bab5108173a4</guid>
      <pubDate>Sat, 25 Jul 2026 07:20:52 -0500</pubDate>
      <description><![CDATA[Buying several copies of a Crown Shop item no longer means clicking Purchase once per copy. Purchase now opens a quantity prompt, and the confirmation dialog shows the total crown cost for the whole order. A run is capped at 20 copies, and emote bundles still buy a single copy.]]></description>
    </item>
    <item>
      <title>Items: Cooked food had almost no art of its own. 71 dishes, including garlic chicken, every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5b6194401f2b</guid>
      <pubDate>Sat, 25 Jul 2026 06:50:03 -0500</pubDate>
      <description><![CDATA[Cooked food had almost no art of its own. 71 dishes, including garlic chicken, every cooked fish and all the meat pies, drew the same empty wooden plate in the recipe book, the crafting list and the item tooltip, and four more groups shared one icon each. 107 dishes now have their own icon.]]></description>
    </item>
    <item>
      <title>Items: Built the icons from art the game already ships rather than waiting on new art. A script…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-30b7b85bae9e</guid>
      <pubDate>Sat, 25 Jul 2026 06:50:04 -0500</pubDate>
      <description><![CDATA[Built the icons from art the game already ships rather than waiting on new art. A script reads each recipe, takes the main ingredient out of it, and plates it: cooked fish use the per-species fish art instead of the generic fillet, pies come out as a slice coloured to the filling, stews sit in a bowl, sandwiches on a loaf. Meat is graded per animal because the shipped meat icons are one shared slab.]]></description>
    </item>
    <item>
      <title>Content: Built the first dungeon made end to end by the new builder: The Cistern of Atos, a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-75d9b5bbcc8b</guid>
      <pubDate>Sat, 25 Jul 2026 08:35:22 -0500</pubDate>
      <description><![CDATA[Built the first dungeon made end to end by the new builder: The Cistern of Atos, a tier-five flooded drainage run beneath Castle Atos. Nine build passes produced 78 objects with no errors - tunnels and junctions, a chest alcove, the great cistern and a boss cistern, water, torchlight, ambient drips, ten creature spawn points, and a baked navigation mesh - plus ten sealed stubs reserved for later expansion. The dressing was chosen from the prop catalog by story: silt and standing water near the entrance, spreading cobwebs, then bones and glowing moss as the tunnels reach the flooded chambers.]]></description>
    </item>
    <item>
      <title>Interface: The Rewards window now opens on the new UI framework. It remembers its own position and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a694eb70ca22</guid>
      <pubDate>Sat, 25 Jul 2026 08:01:55 -0500</pubDate>
      <description><![CDATA[The Rewards window now opens on the new UI framework. It remembers its own position and size separately from the backpack, so opening both no longer stacks them on top of each other.]]></description>
    </item>
    <item>
      <title>Interface: A rewards fetch now reports how many items it has loaded while it runs, instead of a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-94ec9fbda3fc</guid>
      <pubDate>Sat, 25 Jul 2026 08:01:56 -0500</pubDate>
      <description><![CDATA[A rewards fetch now reports how many items it has loaded while it runs, instead of a fixed Loading label that could not be told apart from a stuck window.]]></description>
    </item>
    <item>
      <title>Interface: With nothing waiting to claim, the Rewards window shows the no-rewards message and its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8fb9b1c99c83</guid>
      <pubDate>Sat, 25 Jul 2026 08:01:57 -0500</pubDate>
      <description><![CDATA[With nothing waiting to claim, the Rewards window shows the no-rewards message and its link in place of an empty list.]]></description>
    </item>
    <item>
      <title>Interface: The jukebox and phonograph window now renders on the new UI framework, with its song…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-475fc9b0588e</guid>
      <pubDate>Sat, 25 Jul 2026 08:23:44 -0500</pubDate>
      <description><![CDATA[The jukebox and phonograph window now renders on the new UI framework, with its song, composer and album columns, the now-playing readout and the Play and Stop controls.]]></description>
    </item>
    <item>
      <title>Interface: Jukebox rows show the song name again rather than repeating the item name. The new list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-fdb1b05eb5af</guid>
      <pubDate>Sat, 25 Jul 2026 08:23:45 -0500</pubDate>
      <description><![CDATA[Jukebox rows show the song name again rather than repeating the item name. The new list view could only read generic item columns, so it now asks each list for its own.]]></description>
    </item>
    <item>
      <title>Interface: The emotes window now renders on the new UI framework, with sortable Emote Name and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d68cb4c9615e</guid>
      <pubDate>Sat, 25 Jul 2026 09:02:33 -0500</pubDate>
      <description><![CDATA[The emotes window now renders on the new UI framework, with sortable Emote Name and Teachability columns and a search box the old window did not have.]]></description>
    </item>
    <item>
      <title>Interface: Emotes still drag onto hotbar slots, and double-clicking one still plays it, keeping the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e81cd9358a04</guid>
      <pubDate>Sat, 25 Jul 2026 09:02:34 -0500</pubDate>
      <description><![CDATA[Emotes still drag onto hotbar slots, and double-clicking one still plays it, keeping the two second spam limit and the rule that you have to be on the ground.]]></description>
    </item>
    <item>
      <title>Interface: The add-on manager now renders on the new UI framework. Each add-on row keeps its icon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ef60347ce507</guid>
      <pubDate>Sat, 25 Jul 2026 09:14:49 -0500</pubDate>
      <description><![CDATA[The add-on manager now renders on the new UI framework. Each add-on row keeps its icon, name, creator, version and description, and gains a button whose label says what it will do rather than a pair of overlapping on and off buttons.]]></description>
    </item>
    <item>
      <title>Interface: Retired the add-on row prefab and its two scripts along with it, carrying over the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-cbae5fd3b356</guid>
      <pubDate>Sat, 25 Jul 2026 09:14:50 -0500</pubDate>
      <description><![CDATA[Retired the add-on row prefab and its two scripts along with it, carrying over the per-row folder button so nothing was lost.]]></description>
    </item>
    <item>
      <title>Interface: The deck window now renders on the new UI framework. Each deck is a card with its number…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-016f91491b7d</guid>
      <pubDate>Sat, 25 Jul 2026 09:30:53 -0500</pubDate>
      <description><![CDATA[The deck window now renders on the new UI framework. Each deck is a card with its number, name, glyph count and equip controls, and the window can be moved and resized, which it could not before.]]></description>
    </item>
    <item>
      <title>Interface: Pulled the deck ordering rules out of the deck window into tested code: the saved order…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8ca62928f53b</guid>
      <pubDate>Sat, 25 Jul 2026 09:30:54 -0500</pubDate>
      <description><![CDATA[Pulled the deck ordering rules out of the deck window into tested code: the saved order, moving a deck, and the renumbering after a delete. That last one had no tests and is the part that quietly leaves decks under the wrong numbers.]]></description>
    </item>
    <item>
      <title>Interface: Fixed a leak in the deck window. Closing it added a listener instead of removing one, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a388ab7e3b4f</guid>
      <pubDate>Sat, 25 Jul 2026 09:30:55 -0500</pubDate>
      <description><![CDATA[Fixed a leak in the deck window. Closing it added a listener instead of removing one, so opening and closing it repeatedly left stale work running.]]></description>
    </item>
    <item>
      <title>Interface: Built the UI Toolkit equipment slot, and put the mannequin, fish tank and doll cabinet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ee55879f88db</guid>
      <pubDate>Sat, 25 Jul 2026 09:42:30 -0500</pubDate>
      <description><![CDATA[Built the UI Toolkit equipment slot, and put the mannequin, fish tank and doll cabinet windows on it. An empty slot now shows the name of what goes in it, which the old version left blank.]]></description>
    </item>
    <item>
      <title>Interface: The new slot adds no rules of its own. Every equip check, transfer path and item menu…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2eb42d758cd0</guid>
      <pubDate>Sat, 25 Jul 2026 09:42:31 -0500</pubDate>
      <description><![CDATA[The new slot adds no rules of its own. Every equip check, transfer path and item menu comes from the existing slot code, so the character sheets can reuse it later without the two versions drifting apart.]]></description>
    </item>
    <item>
      <title>Interface: The decoration list now renders on the new UI framework, with a search box for heavily…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-49edfcd35f42</guid>
      <pubDate>Sat, 25 Jul 2026 10:03:51 -0500</pubDate>
      <description><![CDATA[The decoration list now renders on the new UI framework, with a search box for heavily decorated lots and a proper explanation when you are not standing on a lot you can decorate.]]></description>
    </item>
    <item>
      <title>Interface: The decoration list no longer re-reads the whole lot every frame while it is open. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-383802377d33</guid>
      <pubDate>Sat, 25 Jul 2026 10:03:52 -0500</pubDate>
      <description><![CDATA[The decoration list no longer re-reads the whole lot every frame while it is open. It checks a few times a second instead, which should help on lots with hundreds of decorations.]]></description>
    </item>
    <item>
      <title>Interface: The window for handing items to an NPC now renders on the new UI framework. It is the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-599d4e839ca2</guid>
      <pubDate>Sat, 25 Jul 2026 10:03:53 -0500</pubDate>
      <description><![CDATA[The window for handing items to an NPC now renders on the new UI framework. It is the first window with two item panes side by side, which is the shape the merchant and trade windows will use.]]></description>
    </item>
    <item>
      <title>Interface: The live 3D character render now works in the new UI framework. Four windows show one of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-0ed1ccea7971</guid>
      <pubDate>Sat, 25 Jul 2026 10:45:45 -0500</pubDate>
      <description><![CDATA[The live 3D character render now works in the new UI framework. Four windows show one of these: the character sheet, the pet sheet, the inspect sheet and item preview. The cameras and models stay exactly where they are; the new element shows what they already render and passes drags and wheel turns straight through. The two direction conventions differ between the old and new frameworks, so both are pinned by tests and a drag cannot end up backwards.]]></description>
    </item>
    <item>
      <title>Interface: Stat tooltips on the character and pet sheets now work in the new UI framework. Both…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e850ffe6edc9</guid>
      <pubDate>Sat, 25 Jul 2026 10:50:49 -0500</pubDate>
      <description><![CDATA[Stat tooltips on the character and pet sheets now work in the new UI framework. Both sheets build their whole stats panel as one block of text with about twenty hover spots in it, and the old framework found the one under your mouse by asking the text block. The new one cannot do that, so the panel is cut into rows and each stat becomes its own hover target. The explanations themselves did not move.]]></description>
    </item>
    <item>
      <title>Interface: The character sheet and the inspect sheet are on the new UI framework. Your name, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-dd7238c65fd3</guid>
      <pubDate>Sat, 25 Jul 2026 11:16:29 -0500</pubDate>
      <description><![CDATA[The character sheet and the inspect sheet are on the new UI framework. Your name, the character turning under the mouse, the equipment slots around it, the stats panel and Show More all work as before, and dragging gear onto a slot or straight onto the character still equips it. The stats themselves did not move: the same numbers, the same explanations on hover. Both windows are now resizable and remember their own size and position, so your sheet and someone else you are inspecting can sit side by side.]]></description>
    </item>
    <item>
      <title>Interface: Which equipment slot sits on which side of the character is read back from how each sheet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d6fe76a806bc</guid>
      <pubDate>Sat, 25 Jul 2026 11:16:29 -0500</pubDate>
      <description><![CDATA[Which equipment slot sits on which side of the character is read back from how each sheet was laid out rather than listed in code, so all three sheets keep the arrangement they were built with and a slot added later lands where it was put.]]></description>
    </item>
    <item>
      <title>Interface: The pet sheet is on the new UI framework too, which closes out the character sheets. Same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ee9838ec3a06</guid>
      <pubDate>Sat, 25 Jul 2026 11:25:56 -0500</pubDate>
      <description><![CDATA[The pet sheet is on the new UI framework too, which closes out the character sheets. Same shape as the other two: your pet, its three equipment slots, and its stats. It keeps its own size and position, so it can sit next to your own sheet.]]></description>
    </item>
    <item>
      <title>Interface: Windows that open taller than the screen now shrink to fit on the first open. The window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9fe613aeab1a</guid>
      <pubDate>Sat, 25 Jul 2026 11:25:56 -0500</pubDate>
      <description><![CDATA[Windows that open taller than the screen now shrink to fit on the first open. The window frame was keeping a window above its minimum size but not inside the screen, so on a short display the bottom of a tall window hung off the edge with its controls out of reach.]]></description>
    </item>
    <item>
      <title>Interface: The item preview window is on the new UI framework. The item still turns under the mouse…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-65f770c67633</guid>
      <pubDate>Sat, 25 Jul 2026 11:33:30 -0500</pubDate>
      <description><![CDATA[The item preview window is on the new UI framework. The item still turns under the mouse and zooms with the wheel, wax cylinders still play a sample, and previewing a dye still shows the colour before you commit. The window is resizable now and remembers where you put it.]]></description>
    </item>
    <item>
      <title>Interface: The dye preview existed twice, once on the character sheet and once on the item preview…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-11cfdec5ab50</guid>
      <pubDate>Sat, 25 Jul 2026 11:33:30 -0500</pubDate>
      <description><![CDATA[The dye preview existed twice, once on the character sheet and once on the item preview window, as the same hundred and twenty lines. They now share one, and the only real difference between them turned out to be where the result gets shown.]]></description>
    </item>
    <item>
      <title>Interface: Groundwork for shops and trading: the shared item list behind the backpack, bank, loot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a0bfa444405d</guid>
      <pubDate>Sat, 25 Jul 2026 11:41:52 -0500</pubDate>
      <description><![CDATA[Groundwork for shops and trading: the shared item list behind the backpack, bank, loot containers and lot storage now handles the kinds of listings a shop or a trade shows, not just the contents of a bag. Those four windows were re-checked after the change and draw exactly as before, down to the item name colours and the stacking drops.]]></description>
    </item>
    <item>
      <title>Interface: The offline save-game dialog is on the new UI framework. Your saves are listed with the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b0e0ffdb3cdf</guid>
      <pubDate>Sat, 25 Jul 2026 11:53:25 -0500</pubDate>
      <description><![CDATA[The offline save-game dialog is on the new UI framework. Your saves are listed with the date each was written, the columns sort, and double-clicking a save fills its name in. The Save button could previously get stuck disabled after a failed save; it now follows whether a save is actually running.]]></description>
    </item>
    <item>
      <title>Interface: The vendor listings window is on the new UI framework. Searching by name, across all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9aeb52aefeef</guid>
      <pubDate>Sat, 25 Jul 2026 12:14:35 -0500</pubDate>
      <description><![CDATA[The vendor listings window is on the new UI framework. Searching by name, across all zones, by buy orders, by category and by stat all work as before, as does being pointed at a vendor on your compass. Two things are better: the window can no longer be made narrower than its own columns, which is what used to leave rows drawn over the scrollbar, and widening it now gives the extra room to the item name.]]></description>
    </item>
    <item>
      <title>Interface: The merchant window is on the new UI framework, which finishes the batch of ten. Buying…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c7e9167921dd</guid>
      <pubDate>Sat, 25 Jul 2026 12:25:49 -0500</pubDate>
      <description><![CDATA[The merchant window is on the new UI framework, which finishes the batch of ten. Buying and selling work as before, including the quantity prompt and dragging. The exchange now sits beside the buy and sell tabs rather than behind one, so you can see what you are buying and what you are selling at the same time.]]></description>
    </item>
    <item>
      <title>Interface: Any list in the game can now be drawn as a table in the new framework without the view…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8f1f74c7380f</guid>
      <pubDate>Sat, 25 Jul 2026 12:25:49 -0500</pubDate>
      <description><![CDATA[Any list in the game can now be drawn as a table in the new framework without the view needing to know what it holds. The merchant needed it, because its three panes hold three different kinds of thing, and the vendor, trade and mail windows will each need it next.]]></description>
    </item>
    <item>
      <title>Interface: Buff and debuff icons are back on party member and companion bars. They had been showing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-fb2f1e41a0ef</guid>
      <pubDate>Sat, 25 Jul 2026 14:18:45 -0500</pubDate>
      <description><![CDATA[Buff and debuff icons are back on party member and companion bars. They had been showing nothing since those bars were rebuilt, so there was no way to see who was buffed or slowed without clicking them. Icons, the countdown shading, hover text and right-click dismiss all work again.]]></description>
    </item>
    <item>
      <title>Interface: The countdown shading on an effect icon is drawn directly now rather than with a filled…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ffc4ebf536bd</guid>
      <pubDate>Sat, 25 Jul 2026 14:18:46 -0500</pubDate>
      <description><![CDATA[The countdown shading on an effect icon is drawn directly now rather than with a filled sprite. Calibrated against the original: a quarter elapsed darkens the top-right quarter of the icon, and a fully elapsed effect covers it.]]></description>
    </item>
    <item>
      <title>Interface: Fixed the merchant window, which could not be opened at all: talking to a shopkeeper…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-38f4b0f43754</guid>
      <pubDate>Sat, 25 Jul 2026 14:28:51 -0500</pubDate>
      <description><![CDATA[Fixed the merchant window, which could not be opened at all: talking to a shopkeeper ended the session. Three further problems in the same window went with it. Item values and quantities were drawn under the wrong headings with the last column left blank and the item name missing, coloured item names could show their formatting codes as plain text, and double-clicking a row to add it to the exchange did nothing, so nothing could be bought or sold. The window also comes forward when clicked now instead of sitting behind the backpack.]]></description>
    </item>
    <item>
      <title>Interface: Double-clicking rows in the shared list windows works again, and so do the character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d8f0820a1b7c</guid>
      <pubDate>Sat, 25 Jul 2026 14:28:58 -0500</pubDate>
      <description><![CDATA[Double-clicking rows in the shared list windows works again, and so do the character sheet equipment slots. Both were reading a click count that the interface does not report reliably, so the second click was being missed.]]></description>
    </item>
    <item>
      <title>Combat: Skills that strike once and leave a bleed behind were firing the attacker's weapon on-hit…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-118eb994ec5e</guid>
      <pubDate>Sat, 25 Jul 2026 09:10:01 -0500</pubDate>
      <description><![CDATA[Skills that strike once and leave a bleed behind were firing the attacker's weapon on-hit effect twice per cast, so a poisoned weapon applied its poison two times from a single <b>Rend</b>. The same double application hit <b>Puncture</b>, <b>Sawblade Sweep</b> and <b>Spinning Attack</b>. A bleed starting up is not a weapon impact, so only the opening strike procs the weapon now. Multi-hit skills like <b>Quad Slash</b> and <b>Double Thrust</b> are unchanged and still proc on each of their hits. A sweep of all 205 skill definitions confirmed those four were the only ones affected.]]></description>
    </item>
    <item>
      <title>Combat: Combat pets now answer the Open PvP checks as their owner does. A flagged player's pet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-812534b0ecd5</guid>
      <pubDate>Sat, 25 Jul 2026 19:19:35 -0500</pubDate>
      <description><![CDATA[Combat pets now answer the Open PvP checks as their owner does. A flagged player's pet used to be picked up by the auto-attack and area targeting of an unflagged player who could not touch the owner, because the targeting code gave up whenever the target had no player attached. Clicking the pet to select it still works, so the deliberate case is unchanged.]]></description>
    </item>
    <item>
      <title>Combat: The disposition code resolved a pet to its owner for the party check and then read the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1a5e9abccec1</guid>
      <pubDate>Sat, 25 Jul 2026 19:19:35 -0500</pubDate>
      <description><![CDATA[The disposition code resolved a pet to its owner for the party check and then read the pet's own empty player slot for the Open PvP check on the next lines. Both checks now run off one resolution, so they cannot disagree.]]></description>
    </item>
    <item>
      <title>Combat: Fixed a crash in friendly-arc targeting: a support skill aimed near someone's pet while…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e2d7a5e2e659</guid>
      <pubDate>Sat, 25 Jul 2026 19:19:37 -0500</pubDate>
      <description><![CDATA[Fixed a crash in friendly-arc targeting: a support skill aimed near someone's pet while unflagged for PvP hit an empty player slot. Added editor tests for the pet targeting matrix and the decoration flag sets.]]></description>
    </item>
    <item>
      <title>Combat: Summoned earth and ice elementals were swinging at targets they could not actually hit…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-0466c6ebc3d5</guid>
      <pubDate>Sat, 25 Jul 2026 21:11:58 -0500</pubDate>
      <description><![CDATA[Summoned earth and ice elementals were swinging at targets they could not actually hit. The pet decided an attack was in range from its weapon range of 5 metres, but the ground effect that carries the damage only reaches about 4, so any swing started in that gap played the animation and the earthquake and dealt nothing, with no combat log line. Both sides now read the same reach number, and the elemental walks the last metre before it swings.]]></description>
    </item>
    <item>
      <title>Combat: The behaviour tree already had a check that aborts an attack whose target has moved out…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-599a6e180dcb</guid>
      <pubDate>Sat, 25 Jul 2026 21:12:05 -0500</pubDate>
      <description><![CDATA[The behaviour tree already had a check that aborts an attack whose target has moved out of range before the animation starts, but nothing ever switched it on. It is on now for creature attacks, so a target that steps away mid wind-up no longer gets a phantom effect played at it.]]></description>
    </item>
    <item>
      <title>Combat: Animal Charm now holds an animal for as long as the timer on its charm icon shows. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-96e9c2125708</guid>
      <pubDate>Sat, 25 Jul 2026 21:35:59 -0500</pubDate>
      <description><![CDATA[Animal Charm now holds an animal for as long as the timer on its charm icon shows. The duration was being recalculated without the casters skill level, so at grandmaster the animal broke free at roughly half the displayed time.]]></description>
    </item>
    <item>
      <title>Combat: Rewrote the Animal Charm skill description. It said the skill mesmerizes the target…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-534be916ba16</guid>
      <pubDate>Sat, 25 Jul 2026 21:36:05 -0500</pubDate>
      <description><![CDATA[Rewrote the Animal Charm skill description. It said the skill mesmerizes the target, which is a different effect, and it never mentioned that Lunar Specialization extends the duration.]]></description>
    </item>
    <item>
      <title>Dev Tools: Rebuilt the two chambers in the generated dungeon so they are actually rooms. They had no…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9c389e65dd20</guid>
      <pubDate>Sat, 25 Jul 2026 10:32:38 -0500</pubDate>
      <description><![CDATA[Rebuilt the two chambers in the generated dungeon so they are actually rooms. They had no walls: you could see straight out of them. The piece being used as a room turned out to be an interior floor tile whose four sides are open by design, so one on its own is not a room at all, and the engine was sealing those 8 by 10 metre sides with a 5.6 metre tunnel plug. Mining 85,918 observed piece pairings out of the five shipped sewers showed how the kit really builds a chamber: a block of floor tiles with a wall or corner piece laid over each perimeter tile, and a tunnel entering through a punched wall that spans the whole face. Both chambers are now 3 by 3 blocks, walled and vaulted, with the cistern and the boss room joined by a short tunnel.]]></description>
    </item>
    <item>
      <title>Dev Tools: Taught the dungeon builder to work out where a boundary piece actually faces instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-997e41509e1d</guid>
      <pubDate>Sat, 25 Jul 2026 10:32:53 -0500</pubDate>
      <description><![CDATA[Taught the dungeon builder to work out where a boundary piece actually faces instead of assuming. Every wall, cap and arch carries its stonework on one side, and which side differs by family: tunnel end caps face one way, chamber walls face another. The engine assumed one convention for all of them, which is how a chamber wall ended up as a 10 metre slab through the middle of a room. It now reads each piece's own measured bounds. Two new build gates come with it: a seal that cannot cover the hole it closes fails the build, and so does a join where a narrow mouth meets a wide face without a piece spanning the difference. Run against the old dungeon they flag exactly the six real gaps and nothing else.]]></description>
    </item>
    <item>
      <title>Dev Tools: Three older bugs surfaced while proving the chamber fix. Surface snapping, which seats…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-1ca3670a32cc</guid>
      <pubDate>Sat, 25 Jul 2026 10:32:54 -0500</pubDate>
      <description><![CDATA[Three older bugs surfaced while proving the chamber fix. Surface snapping, which seats props on real floors and walls, was casting rays against a physics world that had not caught up with the geometry built moments earlier, so it silently failed on anything freshly built and only worked when the shell already existed from a previous run. Serialized values meant to survive a rebuild were written back as text into a field expecting a number, so anything preserved errored the pass. And the navmesh node count and its reachability check both ran after the graph had been unloaded, which is how a 130 byte empty navmesh passed as baked and gated; the pilot now bakes 3,951 walkable nodes in a single connected region from entrance to boss room.]]></description>
    </item>
    <item>
      <title>Dev Tools: Fixed torches and moss hanging in mid-air in the rebuilt dungeon chambers. The props are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-df74dd83dc3a</guid>
      <pubDate>Sat, 25 Jul 2026 12:17:21 -0500</pubDate>
      <description><![CDATA[Fixed torches and moss hanging in mid-air in the rebuilt dungeon chambers. The props are meant to be snapped to a real wall by the builder, which measures and refuses if there is nothing to mount on; I had swapped that for an offset worked out on paper, and the paper was wrong. The chamber wall stone actually stands about 3 metres further out than assumed, so the rooms are roughly 22 metres across rather than 16, and every prop placed by hand sat out in open space. Snapping is back on all sixteen wall-mounted props across both test dungeons, and it earned its keep straight away by rejecting a torch aimed at the middle of a four-way crossing, which is open on both axes and has no wall to hold it.]]></description>
    </item>
    <item>
      <title>Dev Tools: Added the check that would have caught the floating props on its own. The decoration…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9396c5417249</guid>
      <pubDate>Sat, 25 Jul 2026 12:17:23 -0500</pubDate>
      <description><![CDATA[Added the check that would have caught the floating props on its own. The decoration catalog already records which surface each prop belongs on, so a prop the catalog calls a wall piece must declare that it snaps to a wall; nothing else needs to be inspected, and it runs without opening a scene. On its first run it found nine more torches across the two test dungeons that had never declared it, including some that predate this week.]]></description>
    </item>
    <item>
      <title>Lua addon API: Added ShroudPlaySoundChannel , which plays a loaded clip and returns the channel number…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-709a9c1783f8</guid>
      <pubDate>Sat, 25 Jul 2026 10:43:59 -0500</pubDate>
      <description><![CDATA[Added <b>ShroudPlaySoundChannel</b>, which plays a loaded clip and returns the channel number that the stop and query calls actually take. The older ShroudPlaySound returned a number one lower than those calls expected, so addons had to add 1 to it before passing it back.]]></description>
    </item>
    <item>
      <title>Lua addon API: Left ShroudPlaySound's return value alone so addons already doing the +1 keep working…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ac0605736bc1</guid>
      <pubDate>Sat, 25 Jul 2026 10:43:59 -0500</pubDate>
      <description><![CDATA[Left ShroudPlaySound's return value alone so addons already doing the +1 keep working, and bumped the reported API version to 4 so addons can check for the new call. Passing channel 0 now prints a one-time note in the Lua console pointing at the fix.]]></description>
    </item>
    <item>
      <title>Lua addon API: Negative sound ids and channel numbers used to raise a Lua error out of the three sound…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e08433601416</guid>
      <pubDate>Sat, 25 Jul 2026 10:43:59 -0500</pubDate>
      <description><![CDATA[Negative sound ids and channel numbers used to raise a Lua error out of the three sound functions. They now return the documented failure value instead.]]></description>
    </item>
    <item>
      <title>Tester Tools: Added a Gold section to the tester panel and the browser companion: type an amount, press…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-7ba199ce6b25</guid>
      <pubDate>Sat, 25 Jul 2026 12:45:20 -0500</pubDate>
      <description><![CDATA[Added a Gold section to the tester panel and the browser companion: type an amount, press Set Gold, and your purse changes to that value. Testers had no way to lower their gold, so "try to buy something you cannot afford" was untestable. Gold is account-scoped, and every change is recorded.]]></description>
    </item>
    <item>
      <title>Inventory: Fixed bulk moves reddening the whole inventory. Take All from a full container, or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-486efca6dbd8</guid>
      <pubDate>Sat, 25 Jul 2026 12:45:20 -0500</pubDate>
      <description><![CDATA[Fixed bulk moves reddening the whole inventory. Take All from a full container, or dropping a loaded container into the bank, marked every item in the batch as broken, which blocked picking them up, equipping them and crafting with them until relog. One rejected item was enough to flag all of them.]]></description>
    </item>
    <item>
      <title>Inventory: A failed move now only flags the items the server actually refused, and the client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-0e79417d0e1f</guid>
      <pubDate>Sat, 25 Jul 2026 12:45:21 -0500</pubDate>
      <description><![CDATA[A failed move now only flags the items the server actually refused, and the client re-reads the affected containers so the state clears on its own instead of waiting for a relog. Large moves into the bank are also split into smaller requests, so the size limit behind most of these failures is not reached.]]></description>
    </item>
    <item>
      <title>Inventory: Added a watchdog for transfers the server never answers. A dropped response used to leave…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c441b7265a39</guid>
      <pubDate>Sat, 25 Jul 2026 12:45:21 -0500</pubDate>
      <description><![CDATA[Added a watchdog for transfers the server never answers. A dropped response used to leave every item in the batch flagged as in-flight forever, which looks identical to the broken case. Transfers that fail to send now report the failure instead of parking a callback that never fires.]]></description>
    </item>
    <item>
      <title>Inventory: Items no longer stay red after a move to or from the bank. The bank and backpack windows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3f9e084cda2e</guid>
      <pubDate>Sat, 25 Jul 2026 15:08:30 -0500</pubDate>
      <description><![CDATA[Items no longer stay red after a move to or from the bank. The bank and backpack windows only repainted when the set of items changed, so when a move finished the row kept the colour it had while the move was in flight. A single item dropped into the bank stayed red until the window was reopened, and a red item cannot be picked up, equipped, crafted with or moved again.]]></description>
    </item>
    <item>
      <title>Inventory: An item in the middle of a move now shows in cyan. Red is kept for an item the server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-827c20f9c7ef</guid>
      <pubDate>Sat, 25 Jul 2026 15:08:40 -0500</pubDate>
      <description><![CDATA[An item in the middle of a move now shows in cyan. Red is kept for an item the server actually refused, so an ordinary transfer no longer looks like breakage.]]></description>
    </item>
    <item>
      <title>Inventory: A move the server never answers no longer marks the items as broken. The timeout added…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-579a51d17bca</guid>
      <pubDate>Sat, 25 Jul 2026 15:08:41 -0500</pubDate>
      <description><![CDATA[A move the server never answers no longer marks the items as broken. The timeout added yesterday released the items but marked every one of them in the process, which cannot be undone. It now re-reads the affected containers instead, and it can no longer be suppressed forever by a transfer that wedges the storage layer.]]></description>
    </item>
    <item>
      <title>Inventory: One failed transfer no longer takes out the unrelated ones queued in the same frame, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9da268b1827e</guid>
      <pubDate>Sat, 25 Jul 2026 15:08:49 -0500</pubDate>
      <description><![CDATA[One failed transfer no longer takes out the unrelated ones queued in the same frame, and one stuck transfer no longer disables recovery for the rest of the session. Both left items pinned as part of a transaction that would never resolve.]]></description>
    </item>
    <item>
      <title>Inventory: Transfers now split into requests before an item pushes them over the server limit rather…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6d1af2b634ad</guid>
      <pubDate>Sat, 25 Jul 2026 15:08:49 -0500</pubDate>
      <description><![CDATA[Transfers now split into requests before an item pushes them over the server limit rather than after, so a request no longer goes out carrying one item too many. A container holding more bags than a single request allows is refused with a message explaining why, and taking more than 16 containers out of the bank at once works again.]]></description>
    </item>
    <item>
      <title>Performance: Farm crops can now be drawn in batches. The plant materials already had GPU instancing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-06803ad089cb</guid>
      <pubDate>Sat, 25 Jul 2026 12:52:45 -0500</pubDate>
      <description><![CDATA[Farm crops can now be drawn in batches. The plant materials already had GPU instancing switched on, but the SpeedTree shader refuses to batch anything whose detail levels are cross-fading, and the importer had been stamping that fade onto every crop. Cleared it on 161 detail groups across 108 crop prefabs and the 39 matching importers.]]></description>
    </item>
    <item>
      <title>Performance: Measured on a test field of 1,600 potato plants: draw calls that could not be batched…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-76a89e001214</guid>
      <pubDate>Sat, 25 Jul 2026 12:52:45 -0500</pubDate>
      <description><![CDATA[Measured on a test field of 1,600 potato plants: draw calls that could not be batched fell from 2,510 to 150, and the batches that remain each carry more of the field. Crops now pop between detail levels instead of dissolving, which is the trade for the framerate.]]></description>
    </item>
    <item>
      <title>Performance: Added a Frame Rate Limit setting to the Video options tab, with presets from 30 up to 240…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-34c874b4e65f</guid>
      <pubDate>Sat, 25 Jul 2026 13:07:37 -0500</pubDate>
      <description><![CDATA[Added a <strong>Frame Rate Limit</strong> setting to the Video options tab, with presets from 30 up to 240 FPS and No Limit as the default. The client had no frame cap of its own in release builds, so holding the frame rate down previously meant reaching for a graphics driver setting.]]></description>
    </item>
    <item>
      <title>Performance: Fixed a frame rate bug that had been sitting harmless until now: the scene loading path…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-09d9e05dea28</guid>
      <pubDate>Sat, 25 Jul 2026 13:07:45 -0500</pubDate>
      <description><![CDATA[Fixed a frame rate bug that had been sitting harmless until now: the scene loading path restored the vertical sync setting and then re-applied the quality level, which wrote its own value straight back over the restore. Harmless while every quality level agreed on the value, but it would have stopped a frame rate cap working after the first zone change. One component now owns both frame rate controls and reconciles them each frame.]]></description>
    </item>
    <item>
      <title>Dungeon tools: Rebuilt the big test dungeon so it actually branches. The first version passed every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-485b4e9ee93c</guid>
      <pubDate>Sat, 25 Jul 2026 15:13:10 -0500</pubDate>
      <description><![CDATA[Rebuilt the big test dungeon so it actually branches. The first version passed every check and was still a straight line: 39 places, 38 connections, zero loops, and a 31-step path from the door to the boss with no way back except the way you came. Nothing in the builder caused that, so we added a measurement instead. The second version has 27 loops, an entrance ring that forks three ways and rejoins, three hub rooms whose side galleries come back to the main corridor, two ramps at every level change so the descent is a loop, and a vault you can reach two different ways.]]></description>
    </item>
    <item>
      <title>Dungeon tools: The builder now measures the SHAPE of a layout, not just whether it is valid. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-d62dfdc21c6b</guid>
      <pubDate>Sat, 25 Jul 2026 15:13:24 -0500</pubDate>
      <description><![CDATA[The builder now measures the SHAPE of a layout, not just whether it is valid. It collapses every loop to a single point first, so a nine-tile room counts as one place and only its doorways matter, then warns when most of the dungeon sits on one critical path. Rooms threaded on a line is a legitimate design, but now it is a choice rather than an accident.]]></description>
    </item>
    <item>
      <title>Dungeon tools: Found a bug that had been quietly producing broken monster pathing. The navmesh is baked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-8918a3f4c115</guid>
      <pubDate>Sat, 25 Jul 2026 15:13:33 -0500</pubDate>
      <description><![CDATA[Found a bug that had been quietly producing broken monster pathing. The navmesh is baked inside a box sized from the level geometry, but the physics engine only refreshes an object collision box when asked, and nobody was asking - so all 165 pieces still reported the position they had at the moment they were created. The box collapsed to the size of one corridor segment at the origin. For a dungeon 312 metres long the bake covered the entrance and nothing else: 80 walkable spots. One line to sync first, and the same scene bakes 3,613, in a single connected area from the entrance down four levels to the vault.]]></description>
    </item>
    <item>
      <title>Dungeon tools: The check that was supposed to catch that had gone green over it. It confirmed every room…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-008998c49c49</guid>
      <pubDate>Sat, 25 Jul 2026 15:13:40 -0500</pubDate>
      <description><![CDATA[The check that was supposed to catch that had gone green over it. It confirmed every room reached the nearest walkable spot and that they all connected - but never checked the nearest spot was anywhere near the room, so a hundred rooms all matched the same handful of entrance tiles and passed. It now requires the walkable spot to be inside the room it is testing.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Fixed a crash that closed the game when an NPC started speaking a voice line it had not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e2e0c1eb2be5</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:24 -0500</pubDate>
      <description><![CDATA[Fixed a crash that closed the game when an NPC started speaking a voice line it had not played before that session. A tester hit it three times in eight minutes in Castle Atos. The audio was being released before its decode had finished, so it could be freed while playback was starting.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Two more ways NPC voice audio could be freed while it was still playing are fixed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9a6a8b8ba7f6</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:25 -0500</pubDate>
      <description><![CDATA[Two more ways NPC voice audio could be freed while it was still playing are fixed: clearing the voice cache from the Audio options mid-sentence, and discarding old lines once a session had heard a lot of them.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Interrupting an NPC while its line was still downloading used to stop that one line from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f29ed4081e2d</guid>
      <pubDate>Sat, 25 Jul 2026 15:32:25 -0500</pubDate>
      <description><![CDATA[Interrupting an NPC while its line was still downloading used to stop that one line from ever playing again for the rest of the session. It now cleans up properly.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Choosing Compass from the window selector menu now turns the compass ribbon off and back…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e45f2a1f304c</guid>
      <pubDate>Sat, 25 Jul 2026 18:42:26 -0500</pubDate>
      <description><![CDATA[Choosing <b>Compass</b> from the window selector menu now turns the compass ribbon off and back on. It previously did nothing: the compass is on by default and is the one window in that list with no close button and no key bound to it, so the menu row was asking an already-open window to open. Every other row still opens or raises its window rather than closing it.]]></description>
    </item>
    <item>
      <title>Bug Fixes: The compass no longer overrides the mouse mode you picked in Options. It had been pushing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-44eafa220923</guid>
      <pubDate>Sat, 25 Jul 2026 18:42:26 -0500</pubDate>
      <description><![CDATA[The compass no longer overrides the mouse mode you picked in Options. It had been pushing a cursor mode onto a save-and-restore stack every time a scene loaded, with nothing to take it back off. The timers window does the same thing and is filed for its own fix.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Fixed a way any window could become permanently unopenable for a session. Show and hide…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9a237533ac77</guid>
      <pubDate>Sat, 25 Jul 2026 18:42:27 -0500</pubDate>
      <description><![CDATA[Fixed a way any window could become permanently unopenable for a session. Show and hide both skip out while a previous sequence is still in flight, and the sequence tracker kept reporting one as running after the engine had dropped it, which happens when the object is switched off part way through. Both paths now detect the stale state and start over.]]></description>
    </item>
    <item>
      <title>Bug Fixes: The combat deck window opens as one window again. Since its rebuild it had been opening a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-b6f8a58aaca7</guid>
      <pubDate>Sat, 25 Jul 2026 19:35:01 -0500</pubDate>
      <description><![CDATA[The combat deck window opens as one window again. Since its rebuild it had been opening a second, empty old-style frame behind it, because the new window was left as a child of the old one instead of replacing it. Two players reported it within hours.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Each deck in that window is one line now: position, name, glyph count, and its controls…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a13235c4bf1f</guid>
      <pubDate>Sat, 25 Jul 2026 19:35:10 -0500</pubDate>
      <description><![CDATA[Each deck in that window is one line now: position, name, glyph count, and its controls. The rebuild had given every deck a three-line block with seven buttons wrapped across it, four of them equip buttons with three always greyed out, and everything centred. About fourteen decks fit at the default size against six before.]]></description>
    </item>
    <item>
      <title>Bug Fixes: The deck controls read as they used to: one Equip button that turns green and says…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-0c707e91c06f</guid>
      <pubDate>Sat, 25 Jul 2026 19:35:11 -0500</pubDate>
      <description><![CDATA[The deck controls read as they used to: one Equip button that turns green and says Equipped when that deck is on, one Alt button that turns green when it is your alternate, and Modify, Copy and Delete behind a small menu that right-clicking the row also opens. Selecting a deck highlights it again, and reordering one near the bottom of a long list no longer throws you back to the top.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Every label in the deck window is translatable again. The rebuild had left the buttons…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-588c870285d3</guid>
      <pubDate>Sat, 25 Jul 2026 19:35:19 -0500</pubDate>
      <description><![CDATA[Every label in the deck window is translatable again. The rebuild had left the buttons, the title and the footer as English text that would have shipped untranslated to all seven languages. The title also reads Combat Decks again, matching its name in the window list.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Two more things that window had lost: it can be pinned again, and it comes to the front…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e58d4032b327</guid>
      <pubDate>Sat, 25 Jul 2026 19:35:20 -0500</pubDate>
      <description><![CDATA[Two more things that window had lost: it can be pinned again, and it comes to the front over the backpack and the vendor windows. Closing it also stopped leaving a hidden copy of itself behind each time.]]></description>
    </item>
    <item>
      <title>Localization: Added Japanese as a selectable language. It shows as 日本語 in the launcher and in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-edc069b050ba</guid>
      <pubDate>Sat, 25 Jul 2026 15:50:40 -0500</pubDate>
      <description><![CDATA[Added Japanese as a selectable language. It shows as <b>日本語</b> in the launcher and in the Options language list, and a client running on a Japanese operating system with no saved preference now starts in Japanese on its own. The translations are not written yet, so text still reads English for the moment.]]></description>
    </item>
    <item>
      <title>Localization: Shipped the Japanese font. Two traps cost a detour: the upstream release of Noto Sans JP…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-5dd6076c7ebe</guid>
      <pubDate>Sat, 25 Jul 2026 15:50:50 -0500</pubDate>
      <description><![CDATA[Shipped the Japanese font. Two traps cost a detour: the upstream release of Noto Sans JP uses an outline format our text renderer could not rasterise, and the font defaults to its Thin weight, which is unreadable at interface sizes. The version we ship is a normal-weight build in the format that works, with the licence text alongside it.]]></description>
    </item>
    <item>
      <title>Localization: Fixed two Simplified Chinese problems found while wiring Japanese. The translation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3d6632b576b0</guid>
      <pubDate>Sat, 25 Jul 2026 15:50:51 -0500</pubDate>
      <description><![CDATA[Fixed two Simplified Chinese problems found while wiring Japanese. The translation quality checker had no rules for Chinese, so its check for English text left in a translation never ran at all. Its length check also assumed European text, and flagged 4 of 4 sampled real Chinese interface strings as suspicious because Chinese says the same thing in about a third of the characters.]]></description>
    </item>
    <item>
      <title>Localization: Chinese text has been drawing about twice too light since the font was added. The font…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2d1e10e22f65</guid>
      <pubDate>Sat, 25 Jul 2026 16:36:54 -0500</pubDate>
      <description><![CDATA[Chinese text has been drawing about twice too light since the font was added. The font file was a variable one whose default setting is its thinnest weight, and the engine has no way to ask for a different one, so every Chinese character in the game was hairline thin. Measured at 324 ink pixels per character against 659 for the correct weight. Now shipping the normal weight, and the file is 6.8 MB smaller.]]></description>
    </item>
    <item>
      <title>Localization: Built the Japanese terminology base: 3,591 conversation keyword terms and 2,710…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-df51b10776ab</guid>
      <pubDate>Sat, 25 Jul 2026 16:36:54 -0500</pubDate>
      <description><![CDATA[Built the Japanese terminology base: 3,591 conversation keyword terms and 2,710 character, place and item names, so the same proper noun reads the same way in a name plate and in the dialogue that mentions it. Every language before this one inherited a human-translated base to mine for that; Japanese had nothing, so the tooling now authors one instead.]]></description>
    </item>
    <item>
      <title>Localization: Ran a blind head-to-head to pick the model for the Japanese translation pass: 500…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-28423ebdad53</guid>
      <pubDate>Sat, 25 Jul 2026 16:41:10 -0500</pubDate>
      <description><![CDATA[Ran a blind head-to-head to pick the model for the Japanese translation pass: 500 records, two systems, a reviewer who was not told which was which, and the two candidates swapped left-to-right on half the records so position could not skew it. One won 59.7% to 33.5%, and its biggest lead was in politeness level, which is the part of Japanese that reads as broken when it is wrong.]]></description>
    </item>
    <item>
      <title>Localization: The reviewer also caught a mistake in our own Japanese style rules. A quest objective or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-205707b03804</guid>
      <pubDate>Sat, 25 Jul 2026 16:41:10 -0500</pubDate>
      <description><![CDATA[The reviewer also caught a mistake in our own Japanese style rules. A quest objective or a journal entry the player wrote is not someone speaking, so the polite verb forms we had specified everywhere made objectives read like an order being given. Rewrote the rules to use plain forms for anything the player reads about themselves, and re-exported all 3,791 batches so every one carries the correction.]]></description>
    </item>
    <item>
      <title>Localization: Japanese is translated. Every NPC conversation line in the game now has Japanese text…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-06265fa593c6</guid>
      <pubDate>Sat, 25 Jul 2026 20:07:43 -0500</pubDate>
      <description><![CDATA[Japanese is translated. Every NPC conversation line in the game now has Japanese text, along with item names and descriptions, quest entries and objectives, loading tips, skills and the interface. Dialogue came out at 66,792 of 66,792 lines. The only gap left is in-game books, which sit on a separate track for every language.]]></description>
    </item>
    <item>
      <title>Localization: Checked the result rather than assuming it: an automated pass over all 119,431 lines…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-9b4af2f5bf3a</guid>
      <pubDate>Sat, 25 Jul 2026 20:07:46 -0500</pubDate>
      <description><![CDATA[Checked the result rather than assuming it: an automated pass over all 119,431 lines flags 247 of them, and every one is something that should stay as it is, such as the invented words used in spell casting, the Latin carved into certain walls, and internal asset codes. The most recent language we filled before this flagged about seven times as many.]]></description>
    </item>
    <item>
      <title>Localization: Japanese was the first language with no existing human translations to build a glossary…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3880085824ba</guid>
      <pubDate>Sat, 25 Jul 2026 20:07:46 -0500</pubDate>
      <description><![CDATA[Japanese was the first language with no existing human translations to build a glossary from, so the tooling now writes one instead: 3,591 conversation keyword terms and 2,710 names of characters, places and items, settled once up front so the same proper noun reads the same way in a name plate and in the dialogue that mentions it.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: The commit guard that blocks accidental sweeping commits had never actually run on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6ae425370f6d</guid>
      <pubDate>Sat, 25 Jul 2026 16:41:54 -0500</pubDate>
      <description><![CDATA[The commit guard that blocks accidental sweeping commits had never actually run on the Mac checkout. It is a shell script with no file extension, and one line-ending setting meant it arrived in a form the system could not execute, so every commit went in ungated. The rule that already covered a sibling hook now covers all of them.]]></description>
    </item>
    <item>
      <title>Guilds &amp; Towns: Planned a web companion site that would give every guild and every player-owned town its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c58dcfc50aa8</guid>
      <pubDate>Sat, 25 Jul 2026 16:03:21 -0500</pubDate>
      <description><![CDATA[Planned a web companion site that would give every guild and every player-owned town its own portal: a calendar, a message board, wiki-style pages the group can write themselves, a map of the town showing which lots are claimed and who holds them, and listings for lots that are free. Players would sign in with their game account and get exactly the authority the game already gives them, so a guild leader is a leader on the site too, and a town owner can manage their town without logging in.]]></description>
    </item>
    <item>
      <title>Guilds &amp; Towns: The plan is staged so the risky parts come last: read-only guild and town pages first…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-357f58a3f26d</guid>
      <pubDate>Sat, 25 Jul 2026 16:03:30 -0500</pubDate>
      <description><![CDATA[The plan is staged so the risky parts come last: read-only guild and town pages first, then the town map, then the calendar, board and wiki, and only after all of that the ability to change guild ranks or town permissions from the web. Reading the scoping through also settled two things worth knowing up front. The permission rules the write-back needs already exist on the server side, so those changes are a thin layer rather than a new rulebook. And one lookup the town map leans on has no index behind it today, which makes adding that index a prerequisite rather than a later tuning pass.]]></description>
    </item>
    <item>
      <title>Follow and emotes: Turned off the default key for the new Follow Target bind. It shipped on Keypad 7, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-40e2911ae6e4</guid>
      <pubDate>Sat, 25 Jul 2026 16:31:46 -0500</pubDate>
      <description><![CDATA[Turned off the default key for the new <b>Follow Target</b> bind. It shipped on Keypad 7, and pressing it with nothing selected follows whoever the mouse is hovering over, so players ended up trailing each other without knowing why. The action is still there to bind under Options if you want it, and anyone who already had Keypad 7 stored for it gets that one binding cleared with the rest of their keys untouched.]]></description>
    </item>
    <item>
      <title>Follow and emotes: Starting or stopping a follow now shows on screen as well as in the chat log, and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-13a46b10a9c1</guid>
      <pubDate>Sat, 25 Jul 2026 16:31:46 -0500</pubDate>
      <description><![CDATA[Starting or stopping a follow now shows on screen as well as in the chat log, and the start message names the command that ends it. Turning off "allow other players to follow me" is also checked when the follow starts rather than a frame later, so you no longer get a "now following you" notice for an attempt that is about to be refused.]]></description>
    </item>
    <item>
      <title>Follow and emotes: Fixed /mimic running until you found the off command. It was documented to stop when you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-cf8caed30d22</guid>
      <pubDate>Sat, 25 Jul 2026 16:31:46 -0500</pubDate>
      <description><![CDATA[Fixed <b>/mimic</b> running until you found the off command. It was documented to stop when you move and it did not, so a tester spent several minutes copying everything another player did. Copying now ends when you move, when they get more than 15 metres away, when they leave, or on /mimic off.]]></description>
    </item>
    <item>
      <title>Testing: Marked 205 verification tasks as ready to test. The tracker board tells testers which…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f84d24fdfeb3</guid>
      <pubDate>Sat, 25 Jul 2026 17:06:41 -0500</pubDate>
      <description><![CDATA[Marked 205 verification tasks as ready to test. The tracker board tells testers which build carries a fix, and for several builds that step was skipped, so tasks that had been live for days still read <b>Not on chaos yet</b> and stayed hidden behind the in-game board default filter. All 205 whose changes are in the current build now say so and show up in game; the 14 waiting on work that landed after the build was cut were left alone.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: The Server Tools job on the old build farm had been failing since its agent moved to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-efcd7e71953a</guid>
      <pubDate>Sat, 25 Jul 2026 17:39:43 -0500</pubDate>
      <description><![CDATA[The Server Tools job on the old build farm had been failing since its agent moved to different hardware. The replacement machine was missing two compiler support packages, so three of the ten projects in that solution would not build. Added both packages, then re-ran the job and its nightly counterpart; both pass again.]]></description>
    </item>
    <item>
      <title>Client: Opening the Options window could resize the game window by itself, dropping it to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-54522f8c82a1</guid>
      <pubDate>Sat, 25 Jul 2026 17:40:14 -0500</pubDate>
      <description><![CDATA[Opening the Options window could resize the game window by itself, dropping it to the smallest resolution the game offers and saving that size for the next launch. The Video tab now leaves the resolution alone unless you pick one. Found in a crash report where a player spent 66 window resizes dragging it back before the client ran out of video memory and hung.]]></description>
    </item>
    <item>
      <title>Client: Fixed clicks landing above the mouse pointer for Linux players in windowed mode. On a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a904cd8a08cf</guid>
      <pubDate>Sat, 25 Jul 2026 21:34:27 -0500</pubDate>
      <description><![CDATA[Fixed clicks landing above the mouse pointer for Linux players in windowed mode. On a desktop with a task bar, the game asked for a window taller than the usable screen, the desktop shrank and moved it, and the click positions kept pointing at where the window used to be. Clicking the Password field on the login screen activated the Name field instead, and it stayed that way until the window was dragged by hand. The game now asks for a window that fits, and repositions it once at startup if the desktop still adjusts it.]]></description>
    </item>
    <item>
      <title>Crash reporting: Crash reports now attach the minidump Windows keeps when the game itself writes none…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-e73ae0beece1</guid>
      <pubDate>Sat, 25 Jul 2026 17:40:22 -0500</pubDate>
      <description><![CDATA[Crash reports now attach the minidump Windows keeps when the game itself writes none. Sixteen crashes came in today with no dump uploaded and a usable one sitting on each player disk the whole time.]]></description>
    </item>
    <item>
      <title>Social: Fixed /partner : the invitation to dance never reached the player it was aimed at, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-f6d8fcbeb065</guid>
      <pubDate>Sat, 25 Jul 2026 18:43:07 -0500</pubDate>
      <description><![CDATA[Fixed <b>/partner</b>: the invitation to dance never reached the player it was aimed at, so paired dancing did not work on the shard at all. The person who typed the command saw "You ask X to dance" and nothing further happened.]]></description>
    </item>
    <item>
      <title>Social: Partner invites are now checked against the client that actually sent them, so an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-a8da1be4dc6a</guid>
      <pubDate>Sat, 25 Jul 2026 18:43:08 -0500</pubDate>
      <description><![CDATA[Partner invites are now checked against the client that actually sent them, so an invitation cannot be made to look like it came from someone else.]]></description>
    </item>
    <item>
      <title>Social: The player who accepts a dance is moved onto a spot in front of their partner. The camera…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-75ad4cbe6084</guid>
      <pubDate>Sat, 25 Jul 2026 18:43:08 -0500</pubDate>
      <description><![CDATA[The player who accepts a dance is moved onto a spot in front of their partner. The camera now travels with them, and both players get a line in chat when an invitation is accepted.]]></description>
    </item>
    <item>
      <title>User Interface: Handing a quest item to an NPC works again. The window that opens when someone asks you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-ad518653714a</guid>
      <pubDate>Sat, 25 Jul 2026 18:53:58 -0500</pubDate>
      <description><![CDATA[Handing a quest item to an NPC works again. The window that opens when someone asks you for something would take the item off your pack but never let you put it down on the offer side, so the exchange could not be completed. The new window had the old one still sitting invisibly behind it, and the old one was catching every drop.]]></description>
    </item>
    <item>
      <title>User Interface: The same window picked up the rest of its conversion parity: it narrows to the item the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-47a19c636025</guid>
      <pubDate>Sat, 25 Jul 2026 18:54:08 -0500</pubDate>
      <description><![CDATA[The same window picked up the rest of its conversion parity: it narrows to the item the NPC asked for when you are carrying it, double-click takes back something you already offered, right-click opens the item menu, shift and ctrl drag split a stack or take one, a multi-row selection drags in one go, and the Accept Exchange button no longer renders below the window frame.]]></description>
    </item>
    <item>
      <title>User Interface: A UI Toolkit window under the pointer now wins a drop over anything the old UI reports…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-2e239d1f21c1</guid>
      <pubDate>Sat, 25 Jul 2026 18:54:08 -0500</pubDate>
      <description><![CDATA[A UI Toolkit window under the pointer now wins a drop over anything the old UI reports underneath it, which is the general form of the same bug for every window converted so far.]]></description>
    </item>
    <item>
      <title>User Interface: Fixed the skill tracker popups on the right of the screen sitting away from their own…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-c2335282028a</guid>
      <pubDate>Sat, 25 Jul 2026 21:26:40 -0500</pubDate>
      <description><![CDATA[Fixed the skill tracker popups on the right of the screen sitting away from their own close and pin buttons. The icon, skill name, level and progress bar were drawn at a fixed spot while the buttons followed the HUD layout, so the first row sat about 64 pixels too high and every row below it drifted a further 8 pixels out of line. Each popup now reads its position from its own row every frame, at any window size, UI scale or number of tracked skills.]]></description>
    </item>
    <item>
      <title>User Interface: Fixed the Decoration Placement Settings window drawing its lower options outside its own…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3a061abb80ae</guid>
      <pubDate>Sat, 25 Jul 2026 21:44:04 -0500</pubDate>
      <description><![CDATA[Fixed the Decoration Placement Settings window drawing its lower options outside its own frame, on top of the world, once the window was dragged down near its smallest size. The settings column now scrolls when the window is smaller than the list, and every window built on the shared frame clips its contents to the frame so nothing can paint outside it again.]]></description>
    </item>
    <item>
      <title>Housing &amp; Vendors: Access to a player vendor now ends when the permission behind it ends. Being kicked from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-3e4677907f1e</guid>
      <pubDate>Sat, 25 Jul 2026 19:15:10 -0500</pubDate>
      <description><![CDATA[Access to a player vendor now ends when the permission behind it ends. Being kicked from a guild, dropping below officer, leaving the guild, having a lot role lowered, or a lot owner turning off its guild setting each cut off vendor and tip jar access on the next action instead of leaving it working for up to six more minutes.]]></description>
    </item>
    <item>
      <title>Server: Two guild permission checks disagreed with each other. One tested the member role as a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-20e82c5eaa0b</guid>
      <pubDate>Sat, 25 Jul 2026 20:54:28 -0500</pubDate>
      <description><![CDATA[Two guild permission checks disagreed with each other. One tested the member role as a set of bits, the other matched it exactly and quietly granted nothing when it did not recognise a value. With three roles in the game they happened to agree, but a fourth would have handed a member trustee-level rights on a guild lot while giving them no guild permissions at all. Both now check every role explicitly and stop on one they do not know, and the role a member arrives with is screened before it is used.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: Conversationalists and deco pets set to Stay here now hold the exact spot they were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-6c03408487eb</guid>
      <pubDate>Sat, 25 Jul 2026 21:06:50 -0500</pubDate>
      <description><![CDATA[Conversationalists and deco pets set to <b>Stay here</b> now hold the exact spot they were placed on, and every player in the scene sees them in the same place. A placed NPC picked each new destination from wherever it was currently standing, so it drifted: replaying the old picker 5,000 times from a 10m roam radius walks the NPC 38.8m from home. Destinations are now drawn around the placed position instead, so the same 5,000 cycles never pass 10.0m.]]></description>
    </item>
    <item>
      <title>Housing &amp; Decoration: The Stay here and Patrol choice now travels with the decoration instead of being worked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-25-511d082a1855</guid>
      <pubDate>Sat, 25 Jul 2026 21:07:00 -0500</pubDate>
      <description><![CDATA[The <b>Stay here</b> and <b>Patrol</b> choice now travels with the decoration instead of being worked out separately by each player's client, so switching it takes effect for everyone already standing on the lot rather than the next time they load the area. The first Stay click on an NPC nobody had configured before was also being saved under a key the reader never looked for, which is why the setting could appear to do nothing at all.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-24</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-headlines</guid>
      <pubDate>Fri, 24 Jul 2026 16:07:52 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Fixed the avatar <b>hopping and taking fall damage running downhill</b>: footing now sticks to the slope the way it does on the live game.</li>
        <li>New experimental <b>Pixel Art mode</b>: the live 3D world rendered as stable pixel art, with a camera grid snap that took first-test pixel flicker from 1.25% to 0.00%</li>
        <li>Swept a batch of long-standing audio bugs: tree chopping now sounds on every swing, instrument top notes play correctly, crafting-station sounds stop when you leave, and companions bark at the start of a fight instead of every few seconds.</li>
        <li>Pixel Art mode ran live in Soltown with first screenshots up: camera-caused flicker held at zero by the grid snap, scene animation churning 51% of low-res pixels is the next target, and the "broken shadows" scare turned out to be an actual in-game sunset photobombing the measurements</li>
        <li>Closed a Lua addon safety hole: a <strong>disabled addon</strong> could still be run from the <code>/lua</code> command. Disabled addons are now fully inert until enabled.</li>
        <li>Stone Fist stuns in PvP now show the attacker the true result, ending phantom stun icons on the target bar.</li>
        <li>Rebuilt the backpack on the new UI framework: the first inventory window on UI Toolkit, opening in place with items, weight, drag-and-drop, and stacking.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed 6 items to the tracker: 5 player suggestions (guild-invite…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-511c9b185e51</guid>
      <pubDate>Fri, 24 Jul 2026 03:27:39 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed 6 items to the tracker: 5 player suggestions (guild-invite confirmation, Crown Shop purchase quantity, a partner dance emote, exceptional-crafting-chance balance, addon-developer early access) and 1 stalled bug report (Animal Charm tooltip/timer/damage issues).]]></description>
    </item>
    <item>
      <title>Gameplay: Running down hills no longer makes the avatar hop and take fall damage. The ground-stick…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-7957db4f5203</guid>
      <pubDate>Fri, 24 Jul 2026 04:18:13 -0500</pubDate>
      <description><![CDATA[Running down hills no longer makes the avatar hop and take fall damage. The ground-stick that keeps footing on descending slopes had been clamped too tightly since a recent fix, so on any real hill the character floated off the ground each step and took a small fall. It now follows the full slope while moving, and still holds still on a slope when you stop.]]></description>
    </item>
    <item>
      <title>UI: Fixed the deck-name labels floating in the middle of the screen. They now stay attached…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-585484b63dee</guid>
      <pubDate>Fri, 24 Jul 2026 04:18:14 -0500</pubDate>
      <description><![CDATA[Fixed the deck-name labels floating in the middle of the screen. They now stay attached above the swap-deck icon at any window size or UI scale.]]></description>
    </item>
    <item>
      <title>UI: The skill-tracking display is back at the right edge of the screen instead of the center…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-ab106e2da97d</guid>
      <pubDate>Fri, 24 Jul 2026 04:18:14 -0500</pubDate>
      <description><![CDATA[The skill-tracking display is back at the right edge of the screen instead of the center, with its hide button beside it where you can reach it.]]></description>
    </item>
    <item>
      <title>UI: Pet and companion nameplates are readable again. The name text got its dark outline back…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-2581d865403a</guid>
      <pubDate>Fri, 24 Jul 2026 04:18:23 -0500</pubDate>
      <description><![CDATA[Pet and companion nameplates are readable again. The name text got its dark outline back so light pet names stop washing out over bright scenery, and the box around a selected target is now a soft highlight instead of a hard frame.]]></description>
    </item>
    <item>
      <title>UI: Opening a container on a lot or in a player dungeon no longer pops up a stray "unable to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-fe219b7a0403</guid>
      <pubDate>Fri, 24 Jul 2026 04:18:24 -0500</pubDate>
      <description><![CDATA[Opening a container on a lot or in a player dungeon no longer pops up a stray "unable to change permissions" message. The window was quietly sending a permission change on open; it now stays quiet and the controls still work when you use them.]]></description>
    </item>
    <item>
      <title>UI: Connected the item drag-and-drop groundwork: picking up an inventory item now draws it on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-9b01750a4e88</guid>
      <pubDate>Fri, 24 Jul 2026 09:05:33 -0500</pubDate>
      <description><![CDATA[Connected the item drag-and-drop groundwork: picking up an inventory item now draws it on the new UI layer that floats above the converted windows, so it stays visible while you drag. Checked it in-game with a real item on the cursor. No change you can see yet; it takes effect as the inventory and vendor windows move over.]]></description>
    </item>
    <item>
      <title>UI: Started moving the backpack to the new UI framework: a reusable inventory grid that draws…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-85cecb0fb5d3</guid>
      <pubDate>Fri, 24 Jul 2026 09:28:00 -0500</pubDate>
      <description><![CDATA[Started moving the backpack to the new UI framework: a reusable inventory grid that draws your items — icon, name, and count — wired to the existing move and stack rules. Rendered the full backpack in a live test and it matches the current window. Next up: the full window with weight, tabs, and drag-and-drop.]]></description>
    </item>
    <item>
      <title>UI: Built the backpack on the new UI framework: the full window now renders with a draggable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-cb6e41ee399f</guid>
      <pubDate>Fri, 24 Jul 2026 09:38:34 -0500</pubDate>
      <description><![CDATA[Built the backpack on the new UI framework: the full window now renders with a draggable frame, your items with icons, and the live weight readout, all driven by the existing inventory rules. Verified against a real character in a live test. Still to come: making it the default backpack you open.]]></description>
    </item>
    <item>
      <title>UI: Wired stacking into the new backpack: dropping one item onto a matching one combines…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-573d5b157f96</guid>
      <pubDate>Fri, 24 Jul 2026 09:43:52 -0500</pubDate>
      <description><![CDATA[Wired stacking into the new backpack: dropping one item onto a matching one combines them, using the same rules as today. Part of the ongoing backpack rebuild on the new UI framework.]]></description>
    </item>
    <item>
      <title>UI: The backpack now opens on the new UI framework. Your items, icons, quantities, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-4dfb7591ab80</guid>
      <pubDate>Fri, 24 Jul 2026 15:00:41 -0500</pubDate>
      <description><![CDATA[The backpack now opens on the new UI framework. Your items, icons, quantities, and carried weight all show in a rebuilt window you can drag, resize, and reopen without it going blank. Dragging picks an item up onto the cursor, double-clicking uses or equips it, and dropping one item onto a matching one stacks them. Only your own backpack changed this round; the bank and loot windows follow.]]></description>
    </item>
    <item>
      <title>UI: Right-click now works in the new backpack: right-clicking an item opens the same menu as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-353196eefdc0</guid>
      <pubDate>Fri, 24 Jul 2026 15:38:38 -0500</pubDate>
      <description><![CDATA[Right-click now works in the new backpack: right-clicking an item opens the same menu as before (equip, repair, lock, link in chat, and the rest), wired to the existing item actions.]]></description>
    </item>
    <item>
      <title>UI: Added a search box to the new backpack: type part of an item name and the list narrows to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-2ad70b242e15</guid>
      <pubDate>Fri, 24 Jul 2026 15:45:56 -0500</pubDate>
      <description><![CDATA[Added a search box to the new backpack: type part of an item name and the list narrows to matching items.]]></description>
    </item>
    <item>
      <title>UI: The new backpack now updates while open: dragging an item out or using one refreshes the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-27a0509202ce</guid>
      <pubDate>Fri, 24 Jul 2026 15:49:43 -0500</pubDate>
      <description><![CDATA[The new backpack now updates while open: dragging an item out or using one refreshes the list right away instead of waiting for a reopen.]]></description>
    </item>
    <item>
      <title>Quests: Fixed a grammar slip in the "Tell Raymond or Stanley About the Fire" journal entry, where…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-3f7c06a2ad7c</guid>
      <pubDate>Fri, 24 Jul 2026 04:31:32 -0500</pubDate>
      <description><![CDATA[Fixed a grammar slip in the "Tell Raymond or Stanley About the Fire" journal entry, where one sentence had an extra word. The wording is corrected in English and will refresh in the other languages.]]></description>
    </item>
    <item>
      <title>Combat: Six skills (Skewer, Break Armor, Break Weapon, Pull, Splintering Strike, Flaming Bash) no…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-415f4340f0fd</guid>
      <pubDate>Fri, 24 Jul 2026 04:44:12 -0500</pubDate>
      <description><![CDATA[Six skills (Skewer, Break Armor, Break Weapon, Pull, Splintering Strike, Flaming Bash) no longer apply their debuff when the whole swing is dodged. The debuff now waits on the attack landing, the same way the other skills already behave.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the Air magic defensive passive Well Grounded, which was giving only half the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-7b5d9b785324</guid>
      <pubDate>Fri, 24 Jul 2026 07:45:32 -0500</pubDate>
      <description><![CDATA[Fixed the Air magic defensive passive Well Grounded, which was giving only half the protection of its Fire and Water counterparts. It now reduces incoming air and lightning damage at the same rate as Fire Proof and Cold Blooded, reaching about 50% air resistance at skill level 100 instead of 25%.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Shield of Ice so its damage-avoidance protection lasts as long as the spell's other…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-1880b45b2434</guid>
      <pubDate>Fri, 24 Jul 2026 07:59:49 -0500</pubDate>
      <description><![CDATA[Fixed Shield of Ice so its damage-avoidance protection lasts as long as the spell's other effects. It was expiring at half the duration of the fire resistance and critical bonus, so the shield lost its avoidance early.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the Shield Charge effect list, which showed its stun chance twice and never…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-d0831f849fdb</guid>
      <pubDate>Fri, 24 Jul 2026 07:59:50 -0500</pubDate>
      <description><![CDATA[Fixed the Shield Charge effect list, which showed its stun chance twice and never displayed the knockdown chance. The second line now correctly reads as the knockdown. The skill already knocked targets down; it just was not labeled.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the Torpor skill tooltip, which could show a negative cooldown at high skill. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-e20c2aed08de</guid>
      <pubDate>Fri, 24 Jul 2026 08:11:36 -0500</pubDate>
      <description><![CDATA[Fixed the Torpor skill tooltip, which could show a negative cooldown at high skill. The displayed cooldown now clamps at zero, matching the actual timer. The clamp covers every skill.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the summoned Ice Elemental's attack slow, which did nothing for summoners without…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-89aa3204a203</guid>
      <pubDate>Fri, 24 Jul 2026 08:11:36 -0500</pubDate>
      <description><![CDATA[Fixed the summoned Ice Elemental's attack slow, which did nothing for summoners without Water Magic Specialization because it scaled entirely off that skill. It now has a base slow of about 20% for every summoner, still boosted by Water Magic Specialization.]]></description>
    </item>
    <item>
      <title>Combat: Lightning Storm's stun now scales with air stun bonuses like Rapid Discharge, matching…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-7c8ddf9b0c17</guid>
      <pubDate>Fri, 24 Jul 2026 08:11:37 -0500</pubDate>
      <description><![CDATA[Lightning Storm's stun now scales with air stun bonuses like Rapid Discharge, matching how other air spells behave. With no air stun bonuses the duration is unchanged.]]></description>
    </item>
    <item>
      <title>Combat: Lightning Storm's duration now increases with Air Magic Specialization, as its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-794c0b916a99</guid>
      <pubDate>Fri, 24 Jul 2026 08:11:37 -0500</pubDate>
      <description><![CDATA[Lightning Storm's duration now increases with Air Magic Specialization, as its description promises. It previously stayed a flat 10 seconds regardless. Without the specialization it still lasts its base 10 seconds.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Fire Arrow so its burn over time and its two debuffs (reduced fire resistance and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-ff9d1f42b300</guid>
      <pubDate>Fri, 24 Jul 2026 08:26:35 -0500</pubDate>
      <description><![CDATA[Fixed Fire Arrow so its burn over time and its two debuffs (reduced fire resistance and reduced healing) all last the same length. The burn was running slightly longer than the debuffs. This matches how Flame Fist already behaves.]]></description>
    </item>
    <item>
      <title>Combat: Fixed a Stone Fist stun that Knight's Grace could not clear in duels and PvP. The stun…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-db8699d1d5cd</guid>
      <pubDate>Fri, 24 Jul 2026 08:44:48 -0500</pubDate>
      <description><![CDATA[Fixed a Stone Fist stun that Knight's Grace could not clear in duels and PvP. The stun was flagged in a way that made it behave like a non-removable effect; it now clears like every other stun.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Bolster Balance keeping its shield-required resistance bonus after the shield was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-d8efcfc1ea7e</guid>
      <pubDate>Fri, 24 Jul 2026 09:03:02 -0500</pubDate>
      <description><![CDATA[Fixed Bolster Balance keeping its shield-required resistance bonus after the shield was unequipped. The resistance now updates on equipment change and drops when the shield comes off, matching the skill's other bonuses.]]></description>
    </item>
    <item>
      <title>Combat: Fixed sprinting draining Focus while in walk mode. Walk mode caps your speed so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-98106982465d</guid>
      <pubDate>Fri, 24 Jul 2026 09:03:02 -0500</pubDate>
      <description><![CDATA[Fixed sprinting draining Focus while in walk mode. Walk mode caps your speed so the sprint did nothing, but it still burned Focus. Sprint no longer engages while walk mode is on.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the Light spell leaving behind glow visuals that never went away and stacked up…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-db0bb15bb858</guid>
      <pubDate>Fri, 24 Jul 2026 09:17:18 -0500</pubDate>
      <description><![CDATA[Fixed the Light spell leaving behind glow visuals that never went away and stacked up, causing severe frame-rate drops. A repeat cast that does not replace the existing Light no longer spawns an extra glow.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Melody of Mending stacking twice on the same target. It now allows only one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-9e7826c2dcc4</guid>
      <pubDate>Fri, 24 Jul 2026 09:17:19 -0500</pubDate>
      <description><![CDATA[Fixed Melody of Mending stacking twice on the same target. It now allows only one heal-over-time per target at a time, matching the other bard heals.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the over-encumbrance penalty carrying into ghost form after death (seen with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-cc404a3b7cc8</guid>
      <pubDate>Fri, 24 Jul 2026 09:17:19 -0500</pubDate>
      <description><![CDATA[Fixed the over-encumbrance penalty carrying into ghost form after death (seen with Nefario's curse). It now clears on death and reapplies after resurrection only if you are still overweight.]]></description>
    </item>
    <item>
      <title>Combat: Fixed combat rolling being blocked while over your weight limit even at full Focus. Focus…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-b379d5613953</guid>
      <pubDate>Fri, 24 Jul 2026 09:17:19 -0500</pubDate>
      <description><![CDATA[Fixed combat rolling being blocked while over your weight limit even at full Focus. Focus now pays the encumbrance penalty, so the roll works unless you are actually out of Focus.]]></description>
    </item>
    <item>
      <title>Combat: Fixed fall damage breaking stealth. Silent Movement and other stealth skills are no…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-87baaae1f0f0</guid>
      <pubDate>Fri, 24 Jul 2026 09:41:32 -0500</pubDate>
      <description><![CDATA[Fixed fall damage breaking stealth. Silent Movement and other stealth skills are no longer canceled by falling; damage from enemies still breaks stealth as before.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Healing Burst ignoring your life attunement. It was the only heal that did not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-63eb71716a45</guid>
      <pubDate>Fri, 24 Jul 2026 09:55:48 -0500</pubDate>
      <description><![CDATA[Fixed Healing Burst ignoring your life attunement. It was the only heal that did not scale with attunement, so Tap Soul's negative life attunement did not reduce it. It now scales like the other heals.]]></description>
    </item>
    <item>
      <title>Combat: Fixed a PvP display bug from the old bug backlog: Stone Fist showed its stun icon on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-7c5da49281e7</guid>
      <pubDate>Fri, 24 Jul 2026 09:56:05 -0500</pubDate>
      <description><![CDATA[Fixed a PvP display bug from the old bug backlog: Stone Fist showed its stun icon on the attacker's view of the target even when the stun had not landed, so the skill looked unreliable (from-jira #1994). The attacker's target bar now waits for the confirmed result and only shows the stun when the defender is really stunned. The same correction covers other chance-based control icons shown on another player, such as roots and mesmerize.]]></description>
    </item>
    <item>
      <title>Combat: Also stopped restored and synchronized combat effects from billing the caster a second…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-a3f3a7d5f042</guid>
      <pubDate>Fri, 24 Jul 2026 09:56:11 -0500</pubDate>
      <description><![CDATA[Also stopped restored and synchronized combat effects from billing the caster a second time for weapon durability, reagents, and glyph charges. Logging back in with active effects no longer wears your weapon.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Thrust not applying weapon poison or other on-hit weapon effects when it landed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-66e9ad64e5db</guid>
      <pubDate>Fri, 24 Jul 2026 10:06:50 -0500</pubDate>
      <description><![CDATA[Fixed Thrust not applying weapon poison or other on-hit weapon effects when it landed. The same fix restores on-hit weapon effects for other skills that use variable-damage attacks, such as Puncture, Piercing Shot, and Multishot.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Taunt wearing down shield durability on every cast even though it deals no damage…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-a58578449bf4</guid>
      <pubDate>Fri, 24 Jul 2026 10:13:45 -0500</pubDate>
      <description><![CDATA[Fixed Taunt wearing down shield durability on every cast even though it deals no damage. It no longer charges weapon or shield durability, matching the other no-damage stance skills.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Chaotic Clone with the Chaos specialization showing a stealth buff without actually…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-1177ad981787</guid>
      <pubDate>Fri, 24 Jul 2026 10:13:45 -0500</pubDate>
      <description><![CDATA[Fixed Chaotic Clone with the Chaos specialization showing a stealth buff without actually hiding you. It now applies real invisibility like the other stealth skills.]]></description>
    </item>
    <item>
      <title>Launcher: Crash reports from a client that got stuck on the loading screen are now labelled as a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-fa5ff3a4efc4</guid>
      <pubDate>Fri, 24 Jul 2026 04:51:07 -0500</pubDate>
      <description><![CDATA[Crash reports from a client that got stuck on the loading screen are now labelled as a scene-load failure instead of being lumped in with startup failures, so that kind of hang is easier to spot and chase.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Started the inventory-side UI Toolkit conversion: rebuilt the in-game item-query window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-ee3181a6f66c</guid>
      <pubDate>Fri, 24 Jul 2026 04:54:06 -0500</pubDate>
      <description><![CDATA[Started the inventory-side <b>UI Toolkit</b> conversion: rebuilt the in-game item-query window as a searchable, sortable results list with item icons and hover tooltips on the shared window chrome. This landed a reusable item-icon list column that the backpack, bank, and vendor windows will build on as those conversions follow.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Started the UI Toolkit rebuild of the item drag-and-drop plumbing — the groundwork behind…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-8d249b334ae5</guid>
      <pubDate>Fri, 24 Jul 2026 06:09:43 -0500</pubDate>
      <description><![CDATA[Started the UI Toolkit rebuild of the item drag-and-drop plumbing — the groundwork behind moving items between bags, the bank, vendors, and mail. First piece landed: converted windows can now be recognized as drop targets when you release a dragged item over them. No in-game change yet; this clears the way for the inventory and vendor windows to move over next.]]></description>
    </item>
    <item>
      <title>UI Toolkit: Added the floating icon layer that carries a dragged item above the new UI windows — so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-2f4758968a44</guid>
      <pubDate>Fri, 24 Jul 2026 06:48:33 -0500</pubDate>
      <description><![CDATA[Added the floating icon layer that carries a dragged item above the new UI windows — so when the inventory and vendor screens move over, you still see what you are holding while you drag it. Still groundwork; it connects to the drag system with the first inventory window.]]></description>
    </item>
    <item>
      <title>Rendering: Started an experimental Pixel Art mode for the client: the live 3D world drawn as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-a5774fa0abac</guid>
      <pubDate>Fri, 24 Jul 2026 06:09:05 -0500</pubDate>
      <description><![CDATA[Started an experimental <b>Pixel Art mode</b> for the client: the live 3D world drawn as low-resolution pixel art, with the pixels holding still while the camera moves instead of the usual crawling that screen filters produce. The scene renders at one third of screen resolution with the camera snapped to a pixel-sized grid every frame, gets reduced to a 32-color palette with ordered dithering, and scales up with hard pixel edges. The UI, nameplates, and text stay full resolution. Developer console toggles only for now.]]></description>
    </item>
    <item>
      <title>Rendering: Built the measurement rig with it: a scripted camera bench that replays fixed motion…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-bfd889726c3c</guid>
      <pubDate>Fri, 24 Jul 2026 06:09:06 -0500</pubDate>
      <description><![CDATA[Built the measurement rig with it: a scripted camera bench that replays fixed motion paths and counts changed pixels frame to frame, plus 37 new editor tests including a render proof of the core trick. First numbers: a small sideways camera drift re-decides 1.25% of pixels with plain low-res rendering and 0.00% with the grid snap on.]]></description>
    </item>
    <item>
      <title>Rendering: First live run of Pixel Art mode in Soltown. Two fixes came out of it: the low-resolution…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-165c73aae409</guid>
      <pubDate>Fri, 24 Jul 2026 07:02:44 -0500</pubDate>
      <description><![CDATA[First live run of <b>Pixel Art mode</b> in Soltown. Two fixes came out of it: the low-resolution redirect now happens at the end of the frame update instead of the camera pre-cull callback (assigning the render target in pre-cull silently misses that frame on Unity 6, which presented a sky-only image), and the stability bench had its motion-compensation direction reversed. With those in, the full pipeline works in a real town: pixelated world, full-resolution UI and nameplates, live console toggling between the old and new modes.]]></description>
    </item>
    <item>
      <title>Rendering: The stability numbers from that run, measured on a 612x340 pixel grid: a sub-pixel camera…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-d8f19cd8abbf</guid>
      <pubDate>Fri, 24 Jul 2026 07:02:45 -0500</pubDate>
      <description><![CDATA[The stability numbers from that run, measured on a 612x340 pixel grid: a sub-pixel camera wiggle re-decides 36.1% of pixels with normal rendering and 4.5% through the old mosaic filter, while the new grid snap holds camera-caused flicker at zero, matching its 0.00% result in the controlled test scene. The surprise was the scene itself: wind-blown foliage, water, and townsfolk re-decide 51% of low-res pixels every frame with the camera perfectly still. Taming that animation churn is exactly what the stepped-animation and steady-lighting phases of the plan are for, and now there is a hard number to beat.]]></description>
    </item>
    <item>
      <title>Rendering: Correction from later the same day: the "everything in shadow" seen on that first run was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-ca025f86efb2</guid>
      <pubDate>Fri, 24 Jul 2026 07:02:46 -0500</pubDate>
      <description><![CDATA[Correction from later the same day: the "everything in shadow" seen on that first run was not a bug at all. In-game time runs about twelve times faster than real time, and the sun was setting between the comparison shots. Verified side by side at a pinned midday: rendering to a texture matches normal rendering, shadows and all. A new editor test now guards that path permanently, and the bench already pins the clock during measurements.]]></description>
    </item>
    <item>
      <title>Rendering: First in-game screenshots of Pixel Art mode : the same Soltown street rendered normally…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-3fba83a40518</guid>
      <pubDate>Fri, 24 Jul 2026 07:55:44 -0500</pubDate>
      <description><![CDATA[First in-game screenshots of <b>Pixel Art mode</b>: the same Soltown street rendered normally and through the pixel path at a pinned midday, with the interface staying full resolution over the pixelated world. The look is far from final: dark ground currently leans purple in the 32-color match and the dithering reads strong in shadow, both on the tuning list for the look pass.]]></description>
    </item>
    <item>
      <title>Rendering: Finished the render-quality half of the Pixel Art mode polish pass. The upscale now uses…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-218277bac221</guid>
      <pubDate>Fri, 24 Jul 2026 08:18:31 -0500</pubDate>
      <description><![CDATA[Finished the render-quality half of the Pixel Art mode polish pass. The upscale now uses an analytic filter that keeps pixel edges hard at any window size: whole scale factors reproduce exact pixel blocks, fractional ones confine blending to a band thinner than one screen pixel, verified by 3 new editor tests. Writing those tests caught a subtle flaw in the popular version of this filter, which softens one pixel column at every block edge even at exact whole-number scales; our version centers the blend band on the edge instead.]]></description>
    </item>
    <item>
      <title>Rendering: Two smaller fixes in the same pass: the render target is cleared on creation so the first…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-1ae992f2b749</guid>
      <pubDate>Fri, 24 Jul 2026 08:18:32 -0500</pubDate>
      <description><![CDATA[Two smaller fixes in the same pass: the render target is cleared on creation so the first frame of the mode no longer shows a flash of uninitialized memory, and the in-game photo camera works while the mode is on, producing a low-resolution photo to match the look instead of failing on a size mismatch.]]></description>
    </item>
    <item>
      <title>Rendering: The Pixel Art mode pixel grid now anchors to the real camera distance: the stabilizer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-17f39ee69d65</guid>
      <pubDate>Fri, 24 Jul 2026 09:31:52 -0500</pubDate>
      <description><![CDATA[The <b>Pixel Art mode</b> pixel grid now anchors to the real camera distance: the stabilizer reads the live zoom and camera-collision distance every frame instead of a fixed 5 meters, held through a small deadband so the grid stays perfectly still once the camera settles instead of rescaling a hair per frame while zoom easing finishes. First person keeps the fixed mid-range anchor. Benchmark runs pin the distance for their whole run so their numbers stay comparable.]]></description>
    </item>
    <item>
      <title>Rendering: Two new opt-in Pixel Art mode stabilizers: a camera rotation snap that quantizes turning…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-e1709169f821</guid>
      <pubDate>Fri, 24 Jul 2026 09:31:52 -0500</pubDate>
      <description><![CDATA[Two new opt-in <b>Pixel Art mode</b> stabilizers: a camera rotation snap that quantizes turning to whole-pixel angular steps, with the in-between remainder smoothed by the same sub-pixel scroll already used for movement, and a field-of-view tuner (0.5x to 1.2x) that can narrow the view to cut perspective-induced pixel drift. 17 new editor tests pin the math, including two render tests that would catch a wrong-way scroll sign as doubled motion.]]></description>
    </item>
    <item>
      <title>Docs: Rewrote the Lua addon API reference so each category opens with a quick-reference table…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-b9afe3a4e08c</guid>
      <pubDate>Fri, 24 Jul 2026 06:17:02 -0500</pubDate>
      <description><![CDATA[Rewrote the Lua addon API reference so each category opens with a quick-reference table that links to a full entry per function: the call signature, its arguments, the return value and failure values, and a short example. It now covers the whole scripting surface, from player and pet stats to targeting, party, inventory, the UI widget calls, sound, timers, and saved variables, taken straight from the client bindings.]]></description>
    </item>
    <item>
      <title>Docs: Published the Lua addon documentation as a public website, no login required: a landing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-b5e3dfbb7b42</guid>
      <pubDate>Fri, 24 Jul 2026 07:02:03 -0500</pubDate>
      <description><![CDATA[Published the Lua addon documentation as a public website, no login required: a landing page, the authoring guide, the full API reference with a category sidebar and a per-function search, and a host-internals page. It is generated from the same docs kept with the code, so it stays in step with the game.]]></description>
    </item>
    <item>
      <title>Audio: Fixed tree chopping playing its sound on only every other swing. Pine and maple trees now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-4d59a35b6155</guid>
      <pubDate>Fri, 24 Jul 2026 06:20:27 -0500</pubDate>
      <description><![CDATA[Fixed tree chopping playing its sound on only every other swing. Pine and maple trees now play a chop sound on every swing, and chopping one tree no longer mutes another nearby one.]]></description>
    </item>
    <item>
      <title>Audio: Fixed the accordion and other instruments that use one recording per key jumping oddly on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-7c81ba94b711</guid>
      <pubDate>Fri, 24 Jul 2026 06:20:27 -0500</pubDate>
      <description><![CDATA[Fixed the accordion and other instruments that use one recording per key jumping oddly on the top note. The 8th key now plays its own high note instead of repeating the lowest key's sound, so the scale climbs smoothly.]]></description>
    </item>
    <item>
      <title>Audio: Crafting station sounds now stop when a craft finishes or when you walk away from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-c49b95ea9114</guid>
      <pubDate>Fri, 24 Jul 2026 06:20:27 -0500</pubDate>
      <description><![CDATA[Crafting station sounds now stop when a craft finishes or when you walk away from the station, instead of lingering after you leave and stacking a second copy when you craft again.]]></description>
    </item>
    <item>
      <title>Audio: Escorting companions and creatures now make their combat bark when a fight begins rather…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-5b97bded89a5</guid>
      <pubDate>Fri, 24 Jul 2026 06:20:28 -0500</pubDate>
      <description><![CDATA[Escorting companions and creatures now make their combat bark when a fight begins rather than repeating it every few seconds while switching between enemies.]]></description>
    </item>
    <item>
      <title>Audio: Summoned Wisps now have sound effects. The summoned Wisp pet was silent while the wild…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-5423aa06703c</guid>
      <pubDate>Fri, 24 Jul 2026 06:47:07 -0500</pubDate>
      <description><![CDATA[Summoned Wisps now have sound effects. The summoned Wisp pet was silent while the wild Wisp had its movement and casting sounds; the summoned version now uses the same sound set.]]></description>
    </item>
    <item>
      <title>Lua Addons: Fixed a hole in the addon safety system: a disabled addon could still have its functions…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-7d57b8fec4ee</guid>
      <pubDate>Fri, 24 Jul 2026 07:15:14 -0500</pubDate>
      <description><![CDATA[Fixed a hole in the addon safety system: a disabled addon could still have its functions run from the <code>/lua</code> command. Disabled addons now stay completely inert, defining nothing, until you enable them.]]></description>
    </item>
    <item>
      <title>Lua Addons: Buff-icon addons can now show your buffs using the real in-game skill icons, and hovering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-4df82742a953</guid>
      <pubDate>Fri, 24 Jul 2026 09:17:00 -0500</pubDate>
      <description><![CDATA[Buff-icon addons can now show your buffs using the real in-game skill icons, and hovering an icon shows the skill name, its effect, and the time remaining. Before this an addon had to ship its own artwork and could not say which skill an icon was. A ready-made <strong>Buff Icons</strong> addon is included as an example, and the addon API reference gained the new icon and tooltip calls.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-24</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-images</guid>
      <pubDate>Fri, 24 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/pixelart-shimmer-naive-heatmap.png" data-full="https://catnipgames.net/blog/images/pixelart-shimmer-naive-heatmap.png"
               data-cap="Pixel Art mode stability test, plain low-res rendering: the camera moved sideways less than half a pixel between two frames, and every red line is a column of pixels that changed. This is the flicker the mode exists to remove."
               alt="Checkerboard test render with vertical red lines marking columns of changed pixels after a tiny camera move" loading="lazy">
          <span class="cap">Sub-pixel camera move, plain: pixels flicker</span>
        
        
          <img src="https://catnipgames.net/blog/images/pixelart-shimmer-snapped-heatmap.png" data-full="https://catnipgames.net/blog/images/pixelart-shimmer-snapped-heatmap.png"
               data-cap="The same two-frame camera move with the grid snap on: zero changed pixels. The image only re-decides its pixels when the camera crosses a whole pixel boundary, so the picture holds still like real pixel art."
               alt="The same checkerboard test render with no red change markers anywhere" loading="lazy">
          <span class="cap">Same move with grid snap: zero flicker</span>
        
        
          <img src="https://catnipgames.net/blog/images/lua-addon-docs-site.png" data-full="https://catnipgames.net/blog/images/lua-addon-docs-site.png"
               data-cap="The new public Lua addon documentation website. Each API category opens with a quick-reference table that links to a full entry per function, alongside a category sidebar and a function search."
               alt="Lua addon API reference web page: a category sidebar on the left and a table of target functions with their call forms and short descriptions" loading="lazy">
          <span class="cap">Lua addon docs site: category tables and sidebar</span>
        
        
          <img src="https://catnipgames.net/blog/images/pixelart-soltown-mode-off.png" data-full="https://catnipgames.net/blog/images/pixelart-soltown-mode-off.png"
               data-cap="The reference shot: a Soltown street at a pinned midday, rendered normally. Compare with the Pixel Art mode capture of the same view."
               alt="A village street in Soltown rendered normally: dirt road, timber buildings, NPCs, afternoon light" loading="lazy">
          <span class="cap">Soltown street, normal rendering</span>
        
        
          <img src="https://catnipgames.net/blog/images/pixelart-soltown-mode-on.png" data-full="https://catnipgames.net/blog/images/pixelart-soltown-mode-on.png"
               data-cap="The same street through Pixel Art mode: one art pixel per 3x3 screen pixels, a 32-color palette with ordered dithering, banded lighting, and the interface staying full resolution. Early look; palette and dither tuning still to come."
               alt="The same Soltown street rendered as chunky pixel art with a 32-color palette and visible dithering, while the interface stays sharp" loading="lazy">
          <span class="cap">Same street in Pixel Art mode (early look)</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Tooling: Reworked how this development log is generated: each entry is now stored as its own file…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-22e96184932b</guid>
      <pubDate>Fri, 24 Jul 2026 07:55:59 -0500</pubDate>
      <description><![CDATA[Reworked how this development log is generated: each entry is now stored as its own file and the pages are rebuilt from them on publish, so several people writing at the same time no longer overwrite each other's updates. The published pages read exactly as before.]]></description>
    </item>
    <item>
      <title>Tooling: Wired the dungeon builder to use the new deco data: props now snap to the correct surface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-cc0aebc027da</guid>
      <pubDate>Fri, 24 Jul 2026 16:06:52 -0500</pubDate>
      <description><![CDATA[Wired the dungeon builder to use the new deco data: props now snap to the correct surface when placed - wall pieces seat flush against a wall and turn to face the room, ceiling pieces hang from the ceiling, floor pieces sit on the floor - and a piece that can't find its surface fails the build instead of floating. Added a pathfinding safety check that bakes the dungeon's navigation mesh and fails the build if decoration has walled off a room, so a dungeon can never ship with an unreachable section. Both are covered by automated tests.]]></description>
    </item>
    <item>
      <title>Build: Added a failover procedure for the legacy build farm so the game-client builds no longer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-24-b0819892d058</guid>
      <pubDate>Fri, 24 Jul 2026 15:58:58 -0500</pubDate>
      <description><![CDATA[Added a failover procedure for the legacy build farm so the game-client builds no longer depend on a single machine. Each platform (Windows, Mac, Linux) normally builds on its own machine to keep the Unity import cache warm; if that machine goes offline, a spare can now take over that platform's builds in about a minute, with a helper to check the current assignments and switch them. Verified the switch and switch-back on the live server without disrupting normal builds.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-23</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-headlines</guid>
      <pubDate>Thu, 23 Jul 2026 20:38:46 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Last night's test server release was skipped by a <b>bug in the release gate itself</b>, not by anything wrong with the game code. Fixed, and the release is running now.</li>
        <li>Player dungeons and basements can be <b>named</b>: the owner sets a name at the entrance, everyone sees it paired with the owner's name, and kill statistics can finally tell one player's dungeon from another's.</li>
        <li>Lua addons got a safety pass: they now run in a sandbox with a watchdog against stuck scripts, install disabled by default, and can save settings between sessions.</li>
        <li>Every in-game tooltip now renders on the UI Toolkit interface. Items, skills, locations and equipment comparison all moved over, and the old tooltip rendering code and prefabs were removed.</li>
        <li><b>Search All My Stuff</b> is built: one search across your inventory, bank, lot chests, mail, and vendor listings in every scene, with the named chest that holds each match. From wishlist request #1104; riding the next chaos build.</li>
        <li>Crash report triage: the build-49 farming crash confirmed dead on build 50 with server logs going from 1,248 errors to zero, and the launcher's crash reporting fixed to survive damaged Linux settings files and to label logs carried over from an earlier session.</li>
        <li>The community addon store is deployed and live: a package format, an AI reviewer that reads every submission and writes a description plus a safety verdict, admin approval before anything lists, and the website all running and verified end to end. The in-game Community Addons window and submit flow ship with the next client update.</li>
        <li>The combat HUD status bars moved to the UI Toolkit interface: combatant nameplates, the party frame, companion bars, the skill-up popup, and the quest tracker, plus the teleporter destination picker and the ransom window.</li>
        <li>A <b>tracker bug sweep</b> fixed ten reported bugs in one pass: artifact repair by right-click, the frozen lot tax countdown on new claims, the uncraftable Clay Tip Jar, teleport window text clipping, draggable deck labels, two Lua addon API bugs, and in-game windows lingering over the avatar select screen.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed 5 wishlist ideas (per-account blazon slots, lot-free dungeon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-6b5b18ac7a8c</guid>
      <pubDate>Thu, 23 Jul 2026 03:23:48 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed 5 wishlist ideas (per-account blazon slots, lot-free dungeon entrances for town owners, an in-game Lua addon installer, a 7-item request bundle, and restoring the old bag inventory skin) plus 2 bug reports (frozen tax countdown on newly claimed taxed lots, a blocking mob spawn in Spindle Extreme) to the tracker.]]></description>
    </item>
    <item>
      <title>UI: Fixed pop-up option menus opening behind the newer windows. Menus like the Social panel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-10c875f1def6</guid>
      <pubDate>Thu, 23 Jul 2026 06:50:25 -0500</pubDate>
      <description><![CDATA[Fixed pop-up option menus opening behind the newer windows. Menus like the Social panel Loot Mode list and the player Dungeon window options were drawing behind the window and could not be clicked. They now open in front and stay on screen. The fix is at the shared menu code, so every converted window and every future one gets it.]]></description>
    </item>
    <item>
      <title>UI: Play-mode testing of the new menu code caught two positioning bugs before they shipped…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-0a19c3eedba2</guid>
      <pubDate>Thu, 23 Jul 2026 07:22:14 -0500</pubDate>
      <description><![CDATA[Play-mode testing of the new menu code caught two positioning bugs before they shipped. Menus opened in the top-left corner instead of at the pointer, and a menu opened near the bottom-right corner hung off the edge of the screen. Both came from the on-screen clamp running before the menu had been measured. Verified both cases in the editor after the fix.]]></description>
    </item>
    <item>
      <title>UI: Converted the lot storage slot tooltip to the UI Toolkit interface, keeping its wording…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-b4e11b326441</guid>
      <pubDate>Thu, 23 Jul 2026 08:33:05 -0500</pubDate>
      <description><![CDATA[Converted the lot storage slot tooltip to the UI Toolkit interface, keeping its wording and layout. Added the shared icon groundwork the remaining tooltip types (item, skill, scene, equipment comparison) reuse.]]></description>
    </item>
    <item>
      <title>UI: Converted the item tooltip to the UI Toolkit interface. Hovering an item still shows its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8917ff3bff54</guid>
      <pubDate>Thu, 23 Jul 2026 08:33:05 -0500</pubDate>
      <description><![CDATA[Converted the item tooltip to the UI Toolkit interface. Hovering an item still shows its icon, dye pattern, heraldry, name and details as before, now drawn on the new interface.]]></description>
    </item>
    <item>
      <title>UI: Fixed formatting codes such as [c] and [/c] showing as plain text in the converted…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-be02a117795d</guid>
      <pubDate>Thu, 23 Jul 2026 09:16:35 -0500</pubDate>
      <description><![CDATA[Fixed formatting codes such as [c] and [/c] showing as plain text in the converted windows. Buff and item hover tooltips were the worst case; the markup translator now understands every code the old UI emits, so colored text renders in color instead of leaking bracket codes.]]></description>
    </item>
    <item>
      <title>UI: Window titles and list rows in the converted windows now translate old-style formatting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-b28a85929b2e</guid>
      <pubDate>Thu, 23 Jul 2026 09:16:35 -0500</pubDate>
      <description><![CDATA[Window titles and list rows in the converted windows now translate old-style formatting automatically, so window conversions get correct text without per-window wiring. 53 automated checks cover the translator and the windows it feeds.]]></description>
    </item>
    <item>
      <title>UI: Converted the skill training-mode tooltip to the UI Toolkit interface. The Training, Not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-9ae972f96a89</guid>
      <pubDate>Thu, 23 Jul 2026 10:01:00 -0500</pubDate>
      <description><![CDATA[Converted the skill training-mode tooltip to the UI Toolkit interface. The Training, Not Training, Maintaining and Unlearning badge and its explanation now render on the new interface.]]></description>
    </item>
    <item>
      <title>UI: Converted the location tooltip to the UI Toolkit interface. Hovering a place still shows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-23bb8712e028</guid>
      <pubDate>Thu, 23 Jul 2026 10:01:01 -0500</pubDate>
      <description><![CDATA[Converted the location tooltip to the UI Toolkit interface. Hovering a place still shows its name, summary, town and explored markers and the two-column details, with Hold Ctrl to expand.]]></description>
    </item>
    <item>
      <title>UI: Converted the skill tooltip to the UI Toolkit interface. The full skill card (icon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-0fc4d085dcbc</guid>
      <pubDate>Thu, 23 Jul 2026 10:01:02 -0500</pubDate>
      <description><![CDATA[Converted the skill tooltip to the UI Toolkit interface. The full skill card (icon, description, costs, requirements, current and next level rewards) now renders on the new interface.]]></description>
    </item>
    <item>
      <title>UI: Converted the equipment comparison tooltip to the UI Toolkit interface. Hovering gear you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-89199721e496</guid>
      <pubDate>Thu, 23 Jul 2026 10:01:03 -0500</pubDate>
      <description><![CDATA[Converted the equipment comparison tooltip to the UI Toolkit interface. Hovering gear you could equip shows it beside what you have on for a side-by-side compare.]]></description>
    </item>
    <item>
      <title>UI: Finished moving every in-game tooltip onto the UI Toolkit interface and removed the old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-55f2d25e0117</guid>
      <pubDate>Thu, 23 Jul 2026 10:01:04 -0500</pubDate>
      <description><![CDATA[Finished moving every in-game tooltip onto the UI Toolkit interface and removed the old tooltip rendering code and prefabs.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the equipped-deck HUD display on the UI Toolkit interface. It shows your equipped…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8bace653254e</guid>
      <pubDate>Thu, 23 Jul 2026 10:01:05 -0500</pubDate>
      <description><![CDATA[Rebuilt the equipped-deck HUD display on the UI Toolkit interface. It shows your equipped and alternate deck names when both are set, and you can drag it and it remembers where you put it.]]></description>
    </item>
    <item>
      <title>UI: Began the groundwork to move the in-game status bars (health and focus, party frames)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-9e1052e88a2f</guid>
      <pubDate>Thu, 23 Jul 2026 18:17:19 -0500</pubDate>
      <description><![CDATA[Began the groundwork to move the in-game status bars (health and focus, party frames) onto the UI Toolkit interface, starting with a shared bar element that reproduces the fill and the brief damage or heal flash the old bars showed.]]></description>
    </item>
    <item>
      <title>UI: The destination picker for public teleporters and the Sextant now runs on the UI Toolkit…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-6d00b1069818</guid>
      <pubDate>Thu, 23 Jul 2026 18:51:21 -0500</pubDate>
      <description><![CDATA[The destination picker for public teleporters and the Sextant now runs on the UI Toolkit interface. It keeps the same sorted list, the default arrival point preselected, undiscovered spots shown but not choosable, and selection by mouse or arrow keys.]]></description>
    </item>
    <item>
      <title>UI: The on-screen quest tracker moved to the UI Toolkit interface. It lists your tracked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-42f7cb7c6fec</guid>
      <pubDate>Thu, 23 Jul 2026 19:18:50 -0500</pubDate>
      <description><![CDATA[The on-screen quest tracker moved to the UI Toolkit interface. It lists your tracked tasks, updates as you make progress, and clicking a task opens your journal to that entry.]]></description>
    </item>
    <item>
      <title>UI: The skill advancement popup (a skill's icon, name, level, and progress bar shown when it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-05ed9cacf213</guid>
      <pubDate>Thu, 23 Jul 2026 20:11:13 -0500</pubDate>
      <description><![CDATA[The skill advancement popup (a skill's icon, name, level, and progress bar shown when it levels up) moved to the UI Toolkit interface.]]></description>
    </item>
    <item>
      <title>UI: Combat nameplates (the name and health/focus bars over creatures and players) moved to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-bfc54bdc5f5b</guid>
      <pubDate>Thu, 23 Jul 2026 20:11:14 -0500</pubDate>
      <description><![CDATA[Combat nameplates (the name and health/focus bars over creatures and players) moved to the UI Toolkit interface, including the damage and heal flash on the bars and the fade with distance. A few extras (active rune-effect icons, guild and party markers, and clicking the nameplate itself to target) are off for now and return in a later update.]]></description>
    </item>
    <item>
      <title>UI: The ransom window (The Price of the Oracle) moved to the UI Toolkit interface, keeping…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-5269fcf15485</guid>
      <pubDate>Thu, 23 Jul 2026 20:11:15 -0500</pubDate>
      <description><![CDATA[The ransom window (The Price of the Oracle) moved to the UI Toolkit interface, keeping the ransom list, the selected-item detail pane, and all the pay, give up, clear, and collect actions.]]></description>
    </item>
    <item>
      <title>UI: Party-member bars and companion bars moved to the UI Toolkit interface. The party list is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-1dc13c61d1e9</guid>
      <pubDate>Thu, 23 Jul 2026 20:37:46 -0500</pubDate>
      <description><![CDATA[Party-member bars and companion bars moved to the UI Toolkit interface. The party list is draggable and remembers where you put it, party rows show the leader star and let you click a member to target them, and your companions show in their own list.]]></description>
    </item>
    <item>
      <title>UI: Fixed the teleport scroll destination window cutting off the bottom of letters like y and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-626b85ebb5bb</guid>
      <pubDate>Thu, 23 Jul 2026 18:29:45 -0500</pubDate>
      <description><![CDATA[Fixed the teleport scroll destination window cutting off the bottom of letters like y and p. The same fix protects every other new-UI list that shortens long text with three dots.]]></description>
    </item>
    <item>
      <title>UI: Deck names next to the deck swap icon can no longer be dragged around the screen. They…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-149c00e975ae</guid>
      <pubDate>Thu, 23 Jul 2026 18:29:46 -0500</pubDate>
      <description><![CDATA[Deck names next to the deck swap icon can no longer be dragged around the screen. They sit fixed by the icon and mouse clicks pass through them to the game world.]]></description>
    </item>
    <item>
      <title>UI: In-game windows from the new interface (Players in Scene, Oracle, Titles, Party Finder…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-ef44261c7a84</guid>
      <pubDate>Thu, 23 Jul 2026 18:46:30 -0500</pubDate>
      <description><![CDATA[In-game windows from the new interface (Players in Scene, Oracle, Titles, Party Finder, Guild War list) now close automatically when exiting to the main menu instead of floating over the avatar select screen.]]></description>
    </item>
    <item>
      <title>UI: Fixed window title bars pushing the pin checkmark and close button past the right edge of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d17051bb769a</guid>
      <pubDate>Thu, 23 Jul 2026 18:46:31 -0500</pubDate>
      <description><![CDATA[Fixed window title bars pushing the pin checkmark and close button past the right edge of the window on pinnable windows.]]></description>
    </item>
    <item>
      <title>UI: Hovering a row in the new-UI lists now brightens the text over a clearly darker…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-17cb555cfc9e</guid>
      <pubDate>Thu, 23 Jul 2026 19:03:39 -0500</pubDate>
      <description><![CDATA[Hovering a row in the new-UI lists now brightens the text over a clearly darker highlight. Hovered rows on the tester board were nearly unreadable, light text on a light wash.]]></description>
    </item>
    <item>
      <title>UI: The journal no longer opens itself after login. A journal left open across a zone change…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-bfe92cf43e12</guid>
      <pubDate>Thu, 23 Jul 2026 19:03:39 -0500</pubDate>
      <description><![CDATA[The journal no longer opens itself after login. A journal left open across a zone change or logout was remembered as open and came back on every login until closed by hand.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Air interface theme blowing out to white: the drifting ambient effect was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-a467765ad7a3</guid>
      <pubDate>Thu, 23 Jul 2026 19:14:24 -0500</pubDate>
      <description><![CDATA[Fixed the Air interface theme blowing out to white: the drifting ambient effect was tinted pure white over already pale panels. It now drifts as a soft sky shade and window fills sit a step off white, so text and buttons keep contrast.]]></description>
    </item>
    <item>
      <title>UI: Tester board rows no longer slice the bottom off letters with tails.</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-c2eff9905199</guid>
      <pubDate>Thu, 23 Jul 2026 19:26:59 -0500</pubDate>
      <description><![CDATA[Tester board rows no longer slice the bottom off letters with tails.]]></description>
    </item>
    <item>
      <title>UI: Friendly skills cast on your own targeted pet now land on the pet instead of a nearby…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-7f93fef022cb</guid>
      <pubDate>Thu, 23 Jul 2026 20:08:26 -0500</pubDate>
      <description><![CDATA[Friendly skills cast on your own targeted pet now land on the pet instead of a nearby party member. Pets stay lower priority only for untargeted casts.]]></description>
    </item>
    <item>
      <title>UI: The tester verification board gained a Directives only filter that hides tester-filed bug…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d29af4a677da</guid>
      <pubDate>Thu, 23 Jul 2026 20:11:39 -0500</pubDate>
      <description><![CDATA[The tester verification board gained a Directives only filter that hides tester-filed bug reports, so directives can be worked without wading through reports. The choice persists between sessions.]]></description>
    </item>
    <item>
      <title>UI: The pet sheet damage line now reads the summon's real attack, so gear like the Summoned…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-32c8fb24931a</guid>
      <pubDate>Thu, 23 Jul 2026 20:26:10 -0500</pubDate>
      <description><![CDATA[The pet sheet damage line now reads the summon's real attack, so gear like the Summoned Water Creature Damage necklace shows its effect. The bonus always worked in combat; only the sheet was wrong.]]></description>
    </item>
    <item>
      <title>Build: Fixed the build gate that skipped last night's test server release. The gate checks that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-50c51e7b80e7</guid>
      <pubDate>Thu, 23 Jul 2026 07:05:34 -0500</pubDate>
      <description><![CDATA[Fixed the build gate that skipped last night's test server release. The gate checks that a server file added to one project list also lands in the other, and it crashed on startup on the Linux build machines instead of running the check. Nothing was actually wrong with the code; the check itself had a bug that only showed up on machines without Visual Studio installed, so the gate that runs on Windows kept reporting green while the release path was dead.]]></description>
    </item>
    <item>
      <title>Build: Found a second build gate that was reporting success without checking anything. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-e330c2a58206</guid>
      <pubDate>Thu, 23 Jul 2026 07:52:38 -0500</pubDate>
      <description><![CDATA[Found a second build gate that was reporting success without checking anything. The per-push version of the same server-file check ran an old copy of the checker left on one of the build machines, from a checkout that had not been refreshed since 17 July. That copy predated the fix that lets the check run without Visual Studio, so it skipped and passed. It now runs the copy from the code being pushed, so an out-of-date build machine can no longer turn the gate into a no-op.]]></description>
    </item>
    <item>
      <title>Build: Hardened the commit helper every session here uses. Passing it several files at once…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-3a232b9eb800</guid>
      <pubDate>Thu, 23 Jul 2026 07:58:23 -0500</pubDate>
      <description><![CDATA[Hardened the commit helper every session here uses. Passing it several files at once quietly committed only the first one, because the extra names were being absorbed by the commit-message option instead. It now refuses the ambiguous form outright rather than committing less than it was asked for.]]></description>
    </item>
    <item>
      <title>Build: Repaired the last two scene validation jobs on the legacy build server after the old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-401c2569cb0c</guid>
      <pubDate>Thu, 23 Jul 2026 08:31:22 -0500</pubDate>
      <description><![CDATA[Repaired the last two scene validation jobs on the legacy build server after the old build machine retirement. One was still assigned to the retired machine, the other sat behind a stale queued build and an agent allow list. Both are running on the current machines again, and the navmesh check already cleared the pending scene backlog with nothing to rebuild.]]></description>
    </item>
    <item>
      <title>Build: Wired the server-file check to run automatically on every push, instead of only on a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-2267a036e678</guid>
      <pubDate>Thu, 23 Jul 2026 08:33:09 -0500</pubDate>
      <description><![CDATA[Wired the server-file check to run automatically on every push, instead of only on a schedule. Drift between the two project lists now shows up within about a minute of the code landing rather than at the next nightly run.]]></description>
    </item>
    <item>
      <title>Build: Paused the hourly reported-content job for the dev shard on the legacy build server. It…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-a6bebc4a23db</guid>
      <pubDate>Thu, 23 Jul 2026 09:52:00 -0500</pubDate>
      <description><![CDATA[Paused the hourly reported-content job for the dev shard on the legacy build server. It had failed every hour since July 1 because the dev shard service it reads from is down, roughly 530 red builds. The live shard version keeps running and is unaffected.]]></description>
    </item>
    <item>
      <title>Build: Fixed the nightly automated test run, which had been reporting failures since Monday…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-e356cda445e1</guid>
      <pubDate>Thu, 23 Jul 2026 13:43:22 -0500</pubDate>
      <description><![CDATA[Fixed the nightly automated test run, which had been reporting failures since Monday: eight recently added UI and lighting tests need a real graphics device, and the test runner launched without one. The runner now runs with graphics enabled; verified all previously failing checks pass.]]></description>
    </item>
    <item>
      <title>Housing: Player dungeons and basements can now be named by the lot owner from the entrance Options…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-39c5bb426821</guid>
      <pubDate>Thu, 23 Jul 2026 09:16:05 -0500</pubDate>
      <description><![CDATA[Player dungeons and basements can now be named by the lot owner from the entrance Options menu (50 character cap, same character rules as lot names). The entrance tooltip and window show the custom name together with the owner's name, plus a [PvP] tag when Open PvP is on.]]></description>
    </item>
    <item>
      <title>Housing: Kill and location records from inside a player dungeon or basement now carry the custom…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-3801e3239123</guid>
      <pubDate>Thu, 23 Jul 2026 09:16:09 -0500</pubDate>
      <description><![CDATA[Kill and location records from inside a player dungeon or basement now carry the custom name, the owner, and the plot id as extra trailing fields, so different players' dungeons can be told apart in the statistics. The scene column itself is unchanged and existing consumers keep parsing. Lua addons can read the name via <b>ShroudGetCurrentDungeonName()</b> and <b>ShroudGetCurrentDungeonOwner()</b>.]]></description>
    </item>
    <item>
      <title>Housing: Follow-up on dungeon naming: the rename dialog's input field now accepts the full 50…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-45625ff350c6</guid>
      <pubDate>Thu, 23 Jul 2026 09:21:21 -0500</pubDate>
      <description><![CDATA[Follow-up on dungeon naming: the rename dialog's input field now accepts the full 50 character limit (it stopped at 30 while validation already allowed 50).]]></description>
    </item>
    <item>
      <title>Housing: Fixed the tax countdown freezing for the first day on newly claimed taxed lots. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-491a1e33d2dc</guid>
      <pubDate>Thu, 23 Jul 2026 18:46:31 -0500</pubDate>
      <description><![CDATA[Fixed the tax countdown freezing for the first day on newly claimed taxed lots. The countdown now ticks from the moment of claim; the amount of tax owed is unchanged.]]></description>
    </item>
    <item>
      <title>Housing: Fixed the solid door basement entrances (wood and metal gothic arch) not responding at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8a67d4b07ff3</guid>
      <pubDate>Thu, 23 Jul 2026 19:14:24 -0500</pubDate>
      <description><![CDATA[Fixed the solid door basement entrances (wood and metal gothic arch) not responding at all: the interactive part of the decoration was wired to a different spot than the clickable part. Owners get the options window again and visitors can enter.]]></description>
    </item>
    <item>
      <title>Housing: Fixed claiming a lot from its sign: the deed window could lose track of which lot the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-87acc6f64e99</guid>
      <pubDate>Thu, 23 Jul 2026 19:26:58 -0500</pubDate>
      <description><![CDATA[Fixed claiming a lot from its sign: the deed window could lose track of which lot the sign belonged to and drop the Claim Lot option. The sign now hands the exact lot to the deed window.]]></description>
    </item>
    <item>
      <title>Lua Addons: Lua addons now run in a safety sandbox: an addon's file access is limited to the addon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-042d8abb3bfb</guid>
      <pubDate>Thu, 23 Jul 2026 09:39:23 -0500</pubDate>
      <description><![CDATA[Lua addons now run in a safety sandbox: an addon's file access is limited to the addon folder, so installing a community addon is safer.]]></description>
    </item>
    <item>
      <title>Lua Addons: Added a watchdog so a stuck addon can no longer freeze the client. An addon that keeps…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-37cbfbdd2a91</guid>
      <pubDate>Thu, 23 Jul 2026 09:39:24 -0500</pubDate>
      <description><![CDATA[Added a watchdog so a stuck addon can no longer freeze the client. An addon that keeps erroring is now turned off automatically, and every addon error in chat now starts with the addon's name so you can tell which one is at fault.]]></description>
    </item>
    <item>
      <title>Lua Addons: New addons now install disabled and must be enabled in the addon manager. A chat line…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-79fbd493c460</guid>
      <pubDate>Thu, 23 Jul 2026 09:39:24 -0500</pubDate>
      <description><![CDATA[New addons now install disabled and must be enabled in the addon manager. A chat line reports when a new addon is detected, so nothing you download runs until you allow it.]]></description>
    </item>
    <item>
      <title>Lua Addons: Addons can now save settings that persist between sessions, per character or per account…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-cf20f8ed3884</guid>
      <pubDate>Thu, 23 Jul 2026 09:39:24 -0500</pubDate>
      <description><![CDATA[Addons can now save settings that persist between sessions, per character or per account, through a new saved-variables API.]]></description>
    </item>
    <item>
      <title>Lua Addons: Fixed the /lua chat command: reload, unload, path, running a snippet with /lua code , and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-1be56e580d5c</guid>
      <pubDate>Thu, 23 Jul 2026 09:39:32 -0500</pubDate>
      <description><![CDATA[Fixed the <b>/lua</b> chat command: reload, unload, path, running a snippet with <b>/lua code</b>, and calling an addon function by name all work now.]]></description>
    </item>
    <item>
      <title>Lua Addons: Published a full addon authoring guide and API reference for addon makers, including the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-1d85fd27b56e</guid>
      <pubDate>Thu, 23 Jul 2026 09:39:33 -0500</pubDate>
      <description><![CDATA[Published a full addon authoring guide and API reference for addon makers, including the adjustments existing addons need.]]></description>
    </item>
    <item>
      <title>Server: Built the server side of the player item search from wishlist request #1104 (search all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-420fde8a422b</guid>
      <pubDate>Thu, 23 Jul 2026 11:03:09 -0500</pubDate>
      <description><![CDATA[Built the server side of the player item search from wishlist request #1104 (search all my stuff). One indexed query walks every container an account owns across all scenes, plus vendor listings and ransom holdings; results carry which chest or pouch holds the item, which character carries it, and named storage crates. Capped and rate limited, with the worst hoarder account measured at 38 ms.]]></description>
    </item>
    <item>
      <title>Server: Hardened the GM item lookup while in there: it now requires dev or admin access (it was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-39ca093243da</guid>
      <pubDate>Thu, 23 Jul 2026 11:03:12 -0500</pubDate>
      <description><![CDATA[Hardened the GM item lookup while in there: it now requires dev or admin access (it was reachable by any logged-in client), rejects empty queries, cleans up its database cursors, and no longer does one database round trip per matched item on lot storage.]]></description>
    </item>
    <item>
      <title>Server: Reconciled the shared server code mirror that had drifted since the source import: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-be2c5a33fc90</guid>
      <pubDate>Thu, 23 Jul 2026 19:57:22 -0500</pubDate>
      <description><![CDATA[Reconciled the shared server code mirror that had drifted since the source import: the client copy gained a missing pet data handler and the crown repair item logging, and both sides are byte-identical again.]]></description>
    </item>
    <item>
      <title>Server: Oversized pet data can no longer break loading another player nearby: the reply is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-b306fbd52265</guid>
      <pubDate>Thu, 23 Jul 2026 19:57:23 -0500</pubDate>
      <description><![CDATA[Oversized pet data can no longer break loading another player nearby: the reply is trimmed to fit the message size limit instead of being dropped whole, with a log line when trimming happens.]]></description>
    </item>
    <item>
      <title>Server: Deleting a character can no longer cost the account a slot: deletion now also removes the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8be42d91b8ff</guid>
      <pubDate>Thu, 23 Jul 2026 20:26:11 -0500</pubDate>
      <description><![CDATA[Deleting a character can no longer cost the account a slot: deletion now also removes the character's name record, so a re-save racing the delete gets detected and cleaned automatically instead of lingering as an invisible slot-eater.]]></description>
    </item>
    <item>
      <title>Unity client: Added the Search All My Stuff window from wishlist request #1104. Type a few letters and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-461fb71cf477</guid>
      <pubDate>Thu, 23 Jul 2026 11:15:00 -0500</pubDate>
      <description><![CDATA[Added the <b>Search All My Stuff</b> window from wishlist request #1104. Type a few letters and press Enter to search everything you own: inventory on any character, bank storage in every town, mail attachments, chests on your lots in any scene, storage crates, crafting stations, vendor listings, and ransom holdings. Each row shows the quantity, the place, and the named chest or pouch holding the item; results on your lot in the current scene can be marked on the compass. Open it from the window selector, /findmystuff in chat, or a bindable hotkey.]]></description>
    </item>
    <item>
      <title>Unity client: Ran the full test suite headless after the item search work: 2,527 of 2,529 tests pass…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-943403327df7</guid>
      <pubDate>Thu, 23 Jul 2026 14:36:21 -0500</pubDate>
      <description><![CDATA[Ran the full test suite headless after the item search work: 2,527 of 2,529 tests pass, including all 25 new item search cases; both new window prefabs import clean. Fixed a compiler warning the run surfaced in the new search window. The two failures are in unrelated areas and are noted for follow-up.]]></description>
    </item>
    <item>
      <title>Unity client: The loot roll popup, the roll or pass window that appears when your group shares loot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-55f2a720020f</guid>
      <pubDate>Thu, 23 Jul 2026 16:25:58 -0500</pubDate>
      <description><![CDATA[The loot roll popup, the roll or pass window that appears when your group shares loot, moved to the new UI framework. It keeps the item tooltip on hover and the strip of items still waiting for your choice.]]></description>
    </item>
    <item>
      <title>Unity client: Moved four more windows to the new UI framework: the Send CS Message report window and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-1db023635ebd</guid>
      <pubDate>Thu, 23 Jul 2026 16:26:42 -0500</pubDate>
      <description><![CDATA[Moved four more windows to the new UI framework: the Send CS Message report window and three support tools for renaming a guild, renaming a player, and clearing a guild description. The shared form code behind the old versions was retired.]]></description>
    </item>
    <item>
      <title>Unity client: The town access management window (add residents, raise stewards, and manage the banned…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-20fae312c2a6</guid>
      <pubDate>Thu, 23 Jul 2026 16:26:42 -0500</pubDate>
      <description><![CDATA[The town access management window (add residents, raise stewards, and manage the banned list) moved to the new UI framework. It is the last of the housing permission windows to convert.]]></description>
    </item>
    <item>
      <title>World: Restored the single merged Hilt Fortress entrance door in the Novia Region 9 underground…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-49b423370a4d</guid>
      <pubDate>Thu, 23 Jul 2026 13:43:25 -0500</pubDate>
      <description><![CDATA[Restored the single merged Hilt Fortress entrance door in the Novia Region 9 underground passage after a cross-team content sync brought back the old two-door setup. One door again offers both the multiplayer dungeon and the quest scenario, with the quest option shown only while the quest is active.]]></description>
    </item>
    <item>
      <title>World: The observatory telescope no longer shows its own tube in the zoomed view. It hides its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-a0245e4e932c</guid>
      <pubDate>Thu, 23 Jul 2026 19:26:58 -0500</pubDate>
      <description><![CDATA[The observatory telescope no longer shows its own tube in the zoomed view. It hides its whole model while you look through it and restores it when you step away.]]></description>
    </item>
    <item>
      <title>World: Fixed towns with a salt or fetid fishing statue losing the water depth readout (and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-7b80cfa95e98</guid>
      <pubDate>Thu, 23 Jul 2026 19:36:35 -0500</pubDate>
      <description><![CDATA[Fixed towns with a salt or fetid fishing statue losing the water depth readout (and the depth-based trophy quality scaling) for all their real water. The statue now only changes the water type.]]></description>
    </item>
    <item>
      <title>World: Hardened the light fade logic so a lit light can no longer be stranded dim or fully dark…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-1649eb81fd50</guid>
      <pubDate>Thu, 23 Jul 2026 19:36:35 -0500</pubDate>
      <description><![CDATA[Hardened the light fade logic so a lit light can no longer be stranded dim or fully dark by unlucky fade timing (three latent defects found in an earlier lamp investigation).]]></description>
    </item>
    <item>
      <title>World: Scene map captures learned four lessons for the next recapture: gathering nodes stay off…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8c84374eb575</guid>
      <pubDate>Thu, 23 Jul 2026 20:08:27 -0500</pubDate>
      <description><![CDATA[Scene map captures learned four lessons for the next recapture: gathering nodes stay off maps, house furniture is no longer photographed through missing roofs, roofs render at full detail, and water paints as water instead of showing the lakebed and whatever hides under it.]]></description>
    </item>
    <item>
      <title>World: Pushed the Island Challenge navmesh fix through the build pipeline: the rebaked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-0098eade8e4e</guid>
      <pubDate>Thu, 23 Jul 2026 20:16:15 -0500</pubDate>
      <description><![CDATA[Pushed the Island Challenge navmesh fix through the build pipeline: the rebaked pathfinding data was in the repo but builds kept shipping the stale copy because only the data file had changed, so the scene itself now carries a change to force its data to rebuild.]]></description>
    </item>
    <item>
      <title>World: Distant creatures stopped bouncing and freezing: the far ground clamp now tracks terrain…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-c9175a007060</guid>
      <pubDate>Thu, 23 Jul 2026 20:26:10 -0500</pubDate>
      <description><![CDATA[Distant creatures stopped bouncing and freezing: the far ground clamp now tracks terrain every frame, brief network delays no longer halt movement playback, and moving creatures keep their walk animation at range instead of sliding with frozen legs.]]></description>
    </item>
    <item>
      <title>Addons: Started the community addon sharing service. Uploaded addon packages are strictly checked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8b5957786a3a</guid>
      <pubDate>Thu, 23 Jul 2026 14:01:15 -0500</pubDate>
      <description><![CDATA[Started the community addon sharing service. Uploaded addon packages are strictly checked (file types, size limits, archive safety) and stored with a review lifecycle so every version waits for admin approval before it can appear in game. 234 server-side tests cover the format and lifecycle rules.]]></description>
    </item>
    <item>
      <title>Addons: Added the community addon sharing epic to the roadmap, with a matching entry on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-285f0a0a78ac</guid>
      <pubDate>Thu, 23 Jul 2026 14:07:01 -0500</pubDate>
      <description><![CDATA[Added the community addon sharing epic to the roadmap, with a matching entry on the public roadmap page.]]></description>
    </item>
    <item>
      <title>Addons: Client groundwork for addon packages: the package manifest format, install folder rules…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d6089129fb8b</guid>
      <pubDate>Thu, 23 Jul 2026 14:10:44 -0500</pubDate>
      <description><![CDATA[Client groundwork for addon packages: the package manifest format, install folder rules, and safety checks on downloaded archives are in, with about 90 new automated tests. Hand-installed single-file addons keep working exactly as before.]]></description>
    </item>
    <item>
      <title>Addons: The addon sharing service now has its web API: authors sign in with their game account…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-ac01d652967a</guid>
      <pubDate>Thu, 23 Jul 2026 14:22:38 -0500</pubDate>
      <description><![CDATA[The addon sharing service now has its web API: authors sign in with their game account, submissions are checked and queued for review, and the game can list, download, and count installs of approved packages. 273 server-side tests.]]></description>
    </item>
    <item>
      <title>Addons: The game can now install addon packages into their own folders and run them, with your…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-7523d25f04cc</guid>
      <pubDate>Thu, 23 Jul 2026 14:32:18 -0500</pubDate>
      <description><![CDATA[The game can now install addon packages into their own folders and run them, with your hand-installed single-file addons untouched. Installing a package leaves it turned off until you enable it, the same safety rule new addons already follow.]]></description>
    </item>
    <item>
      <title>Addons: Wired the game client to the addon store: it can list packages, download and install…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-4a55efb35058</guid>
      <pubDate>Thu, 23 Jul 2026 14:47:13 -0500</pubDate>
      <description><![CDATA[Wired the game client to the addon store: it can list packages, download and install them, sign in with your game account to submit your own, and report installs. The store window that uses all this is next. A shard with no store configured just shows it as unavailable.]]></description>
    </item>
    <item>
      <title>Addons: The addon store service is feature complete. Submitted addons are read by an AI reviewer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-f98b354033e8</guid>
      <pubDate>Thu, 23 Jul 2026 15:02:45 -0500</pubDate>
      <description><![CDATA[The addon store service is feature complete. Submitted addons are read by an AI reviewer that writes a plain description for players and a detailed report for the team, flags risky patterns, and does a second skeptical pass on anything not clearly safe. A public catalog page and an admin review console round it out.]]></description>
    </item>
    <item>
      <title>Addons: Built the in-game Community Addons window: browse approved addons, install and update…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8b206c1c2d9c</guid>
      <pubDate>Thu, 23 Jul 2026 15:30:27 -0500</pubDate>
      <description><![CDATA[Built the in-game Community Addons window: browse approved addons, install and update them, remove them, and turn them on, with a My Submissions tab. Submitting your own addon works from inside the game too, signed in with your game account. Open it with /addons.]]></description>
    </item>
    <item>
      <title>Addons: Wrote the server setup scripts for the addon store so it can be deployed to the web host…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-76cf61eabacf</guid>
      <pubDate>Thu, 23 Jul 2026 15:30:27 -0500</pubDate>
      <description><![CDATA[Wrote the server setup scripts for the addon store so it can be deployed to the web host in one step once given the go-ahead.]]></description>
    </item>
    <item>
      <title>Addons: Verified the addon package code end to end: all 138 Lua addon tests pass along with the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-31c858c04304</guid>
      <pubDate>Thu, 23 Jul 2026 15:39:19 -0500</pubDate>
      <description><![CDATA[Verified the addon package code end to end: all 138 Lua addon tests pass along with the new store tests, confirming that hand-installed single-file addons behave exactly as before after the package changes.]]></description>
    </item>
    <item>
      <title>Addons: The community addon store service is deployed and running. Submitting a test addon end to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d2a4d30c2c0d</guid>
      <pubDate>Thu, 23 Jul 2026 17:57:15 -0500</pubDate>
      <description><![CDATA[The community addon store service is deployed and running. Submitting a test addon end to end confirmed the full path: the server checks the package, the AI reviewer reads it and writes a description and a safety verdict, and it waits for admin approval before listing. The public site is served over HTTPS with the admin review page locked down. The in-game window that uses all this arrives with the next client update.]]></description>
    </item>
    <item>
      <title>Crash Reporting: Reviewed the client crash reports uploaded from the test shard over the last two days…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d089d22861d4</guid>
      <pubDate>Thu, 23 Jul 2026 14:05:42 -0500</pubDate>
      <description><![CDATA[Reviewed the client crash reports uploaded from the test shard over the last two days. The farming crash spam from build 49 (16,000 errors in one session log) is confirmed gone on build 50: server logs recorded 1,248 of those errors the day before the fix and zero since.]]></description>
    </item>
    <item>
      <title>Crash Reporting: Fixed two launcher crash-report defects: a damaged Linux settings file made the launcher…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-38871f2bc0ab</guid>
      <pubDate>Thu, 23 Jul 2026 14:05:43 -0500</pubDate>
      <description><![CDATA[Fixed two launcher crash-report defects: a damaged Linux settings file made the launcher misclassify every session as a failed start (it now recovers the exit stamps and reports the file state), and a launch that dies before the engine boots no longer presents the previous session's log as the crashed one.]]></description>
    </item>
    <item>
      <title>Crash Reporting: The client now clears its in-world crash marker when it returns to character select…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d53b5362ebcd</guid>
      <pubDate>Thu, 23 Jul 2026 14:05:43 -0500</pubDate>
      <description><![CDATA[The client now clears its in-world crash marker when it returns to character select, ending false in-world crash reports from menu quits, and disables text rebuilds during shutdown, which removed dozens of font errors from the tail of every uploaded log.]]></description>
    </item>
    <item>
      <title>Crash Reporting: Filed a bug from the same triage: one Linux session ran at 11 fps on a high-end graphics…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-f3aeeb8af387</guid>
      <pubDate>Thu, 23 Jul 2026 14:05:43 -0500</pubDate>
      <description><![CDATA[Filed a bug from the same triage: one Linux session ran at 11 fps on a high-end graphics card with constant low-memory warnings from the graphics driver.]]></description>
    </item>
    <item>
      <title>Crash Reporting: Released launcher build 22 for Windows and Linux with the crash-report fixes, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-6d6fbd2c1965</guid>
      <pubDate>Thu, 23 Jul 2026 14:31:36 -0500</pubDate>
      <description><![CDATA[Released launcher build 22 for Windows and Linux with the crash-report fixes, and deployed the matching receiver update. Installed launchers self-update on next start; the next round of Linux reports will say whether the settings file on the affected machine is missing or damaged.]]></description>
    </item>
    <item>
      <title>Client: Fixed item tooltips showing leftover content from other tooltips. After casting a skill…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-6e0646833f45</guid>
      <pubDate>Thu, 23 Jul 2026 14:41:20 -0500</pubDate>
      <description><![CDATA[Fixed item tooltips showing leftover content from other tooltips. After casting a skill, grabbing a decoration, or hovering sheet music, the next inventory item you hovered could show that skill or object stacked inside its own tooltip. Reported by testers with screenshots this morning. Regression tests added.]]></description>
    </item>
    <item>
      <title>Client: Raw materials with no crafting bonus, fish included, no longer show an empty Material…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-0e4949a90f95</guid>
      <pubDate>Thu, 23 Jul 2026 14:41:27 -0500</pubDate>
      <description><![CDATA[Raw materials with no crafting bonus, fish included, no longer show an empty Material Crafting Bonus heading in their tooltips. The heading now appears only when there are bonus lines under it.]]></description>
    </item>
    <item>
      <title>Docs: Documented the addon store: a service and admin runbook, a player-facing packaging and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-ab1014de2192</guid>
      <pubDate>Thu, 23 Jul 2026 15:09:13 -0500</pubDate>
      <description><![CDATA[Documented the addon store: a service and admin runbook, a player-facing packaging and submit guide in the Lua addon docs, and a fix to a stale note that claimed addons had no runaway-script watchdog (they have had one since the sandbox pass).]]></description>
    </item>
    <item>
      <title>Infra: Tracked down both failures from the afternoon test run. One was already fixed upstream…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-d2f0c8c3d173</guid>
      <pubDate>Thu, 23 Jul 2026 16:25:15 -0500</pubDate>
      <description><![CDATA[Tracked down both failures from the afternoon test run. One was already fixed upstream minutes later (a Lua addon test asserting the wrong rejection order). The other was a race in the test harness itself: the editor assistant plugin was answering stale tool calls during batch runs and logging from a background thread, which the Unity test framework cannot tolerate mid-check. The headless runner now puts that plugin to sleep for the duration of a run and restores it after.]]></description>
    </item>
    <item>
      <title>Tutorial: New Isle of Storms tutorial step: Lock Your Gear . After the hotbar lesson, new players…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-bec722c0baf1</guid>
      <pubDate>Thu, 23 Jul 2026 17:30:46 -0500</pubDate>
      <description><![CDATA[New Isle of Storms tutorial step: <b>Lock Your Gear</b>. After the hotbar lesson, new players get a task and an on-screen hint to right-click a worn item and choose Lock To Inventory, which protects it from accidental sale, trade, or salvage. Completing it writes a journal entry.]]></description>
    </item>
    <item>
      <title>Tutorial: Item locking now raises a game-wide notification when an item is locked or unlocked. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-edd90b444f21</guid>
      <pubDate>Thu, 23 Jul 2026 17:33:58 -0500</pubDate>
      <description><![CDATA[Item locking now raises a game-wide notification when an item is locked or unlocked. The new tutorial step listens for it, and EditMode tests cover the notification rules and the two new journal entries.]]></description>
    </item>
    <item>
      <title>Lua: Fixed ShroudGetInputText() returning only the visible part of an input field. Addons now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-6655c6bb4e08</guid>
      <pubDate>Thu, 23 Jul 2026 18:29:46 -0500</pubDate>
      <description><![CDATA[Fixed ShroudGetInputText() returning only the visible part of an input field. Addons now get the full typed text back.]]></description>
    </item>
    <item>
      <title>Lua: Fixed string.byte() corrupting byte value 255 into 63. The full 0 to 255 range now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-4da73ed12a1a</guid>
      <pubDate>Thu, 23 Jul 2026 18:29:46 -0500</pubDate>
      <description><![CDATA[Fixed string.byte() corrupting byte value 255 into 63. The full 0 to 255 range now round-trips through string.char and string.byte, so addons can store binary data in strings safely.]]></description>
    </item>
    <item>
      <title>Items: Fixed right-click Repair on artifacts: it now uses an ancient essence from your bags…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-8d9aa61c0dd5</guid>
      <pubDate>Thu, 23 Jul 2026 18:46:29 -0500</pubDate>
      <description><![CDATA[Fixed right-click Repair on artifacts: it now uses an ancient essence from your bags instead of giving up after trying an ordinary repair kit first. Drag and drop was already fine.]]></description>
    </item>
    <item>
      <title>Items: Blocked loot attempts now say why in plain words (party loot rules, or loot that belongs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-0142ab141178</guid>
      <pubDate>Thu, 23 Jul 2026 18:46:31 -0500</pubDate>
      <description><![CDATA[Blocked loot attempts now say why in plain words (party loot rules, or loot that belongs to another player or party) instead of doing nothing at all.]]></description>
    </item>
    <item>
      <title>Items: Obsidian Chainmail now accepts patterns in all five slots. The Obsidian pieces were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-f85c6dee0686</guid>
      <pubDate>Thu, 23 Jul 2026 19:14:24 -0500</pubDate>
      <description><![CDATA[Obsidian Chainmail now accepts patterns in all five slots. The Obsidian pieces were missing from the pattern eligibility lists for chain armor.]]></description>
    </item>
    <item>
      <title>Crafting: Fixed the Clay Tip Jar recipe, which could not be crafted at all after its move to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-eddceec04ebd</guid>
      <pubDate>Thu, 23 Jul 2026 18:46:30 -0500</pubDate>
      <description><![CDATA[Fixed the Clay Tip Jar recipe, which could not be crafted at all after its move to Smelting. It is now discoverable at a smelting station with 6 clay and can be taught like the other clay decorations.]]></description>
    </item>
    <item>
      <title>Crafting: Threshing wheat no longer increases carry weight: sacks of wheat grain and flour are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-c1f25b64b532</guid>
      <pubDate>Thu, 23 Jul 2026 19:57:23 -0500</pubDate>
      <description><![CDATA[Threshing wheat no longer increases carry weight: sacks of wheat grain and flour are lighter, so threshing reduces weight a little and milling keeps it unchanged.]]></description>
    </item>
    <item>
      <title>Combat: Golem magic cancellation no longer strips Silent Movement and Shadow Form. The two…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-e067b85ca9f2</guid>
      <pubDate>Thu, 23 Jul 2026 19:03:38 -0500</pubDate>
      <description><![CDATA[Golem magic cancellation no longer strips Silent Movement and Shadow Form. The two stealth skills carried a leftover Moon magic tag, so anything that cancels the nine magic schools caught them too.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the balance report tripling skills that randomly pick one effect per cast. Chaos…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-fd9d27afa33a</guid>
      <pubDate>Thu, 23 Jul 2026 19:03:39 -0500</pubDate>
      <description><![CDATA[Fixed the balance report tripling skills that randomly pick one effect per cast. Chaos Bolt, Obsidian Onslaught, and Juxtapose now show their real averaged damage on the next report refresh, with a test pinning the math.]]></description>
    </item>
    <item>
      <title>Combat: Savage Sonata now shows its song ring: the burst on a successful start and the circling…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-f54ab2aa79cf</guid>
      <pubDate>Thu, 23 Jul 2026 19:44:34 -0500</pubDate>
      <description><![CDATA[Savage Sonata now shows its song ring: the burst on a successful start and the circling ring around the performer while the song runs. The ring effects were never wired up for it.]]></description>
    </item>
    <item>
      <title>Audio: Blink, Summon Skeleton, and Reveal Hidden now play cast sounds. All three had no audio…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-6ba0c9341509</guid>
      <pubDate>Thu, 23 Jul 2026 19:26:59 -0500</pubDate>
      <description><![CDATA[Blink, Summon Skeleton, and Reveal Hidden now play cast sounds. All three had no audio authored on their effects at all; Blink and Reveal Hidden even had dedicated recorded clips that were never wired up.]]></description>
    </item>
    <item>
      <title>Audio: Liches and the remaining plain-voiced skeletons (Awakened Dead, Cursed, Fighter…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-507a8e392ab4</guid>
      <pubDate>Thu, 23 Jul 2026 20:30:33 -0500</pubDate>
      <description><![CDATA[Liches and the remaining plain-voiced skeletons (Awakened Dead, Cursed, Fighter, Guardian, Archmage, Prince) moved to the deep rasping undead voice treatment, and the full voice set was regenerated and republished. Voice changes are live on a fresh login with no patch.]]></description>
    </item>
    <item>
      <title>Audio: The republished voice set also restores the Ebon Dawn Ritual Master's intended male voice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-09242f88b5f9</guid>
      <pubDate>Thu, 23 Jul 2026 20:30:33 -0500</pubDate>
      <description><![CDATA[The republished voice set also restores the Ebon Dawn Ritual Master's intended male voice and gives Eugena in Solace Bridge her missing voice.]]></description>
    </item>
    <item>
      <title>Localization: Repaired broken text markup in four interface strings and six store descriptions that the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-e3072ad5305f</guid>
      <pubDate>Thu, 23 Jul 2026 19:36:36 -0500</pubDate>
      <description><![CDATA[Repaired broken text markup in four interface strings and six store descriptions that the translation checker had been rejecting. They pick up translations in all seven languages on the next fill pass.]]></description>
    </item>
    <item>
      <title>Localization: The translation source generators can no longer sweep out hand-registered records, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-11ae5c132c46</guid>
      <pubDate>Thu, 23 Jul 2026 20:08:26 -0500</pubDate>
      <description><![CDATA[The translation source generators can no longer sweep out hand-registered records, and the 18 records lost to an earlier sweep (Ultima mode labels, compass toggle strings, teleport window columns) are restored. A keep list now protects hand adds.]]></description>
    </item>
    <item>
      <title>Networking: Players on slow machines no longer get kicked to the title screen during long scene…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-f06d623ae879</guid>
      <pubDate>Thu, 23 Jul 2026 19:57:23 -0500</pubDate>
      <description><![CDATA[Players on slow machines no longer get kicked to the title screen during long scene loads. The connection is given 90 seconds on the client and two minutes on the server to ride out a heavy load, up from 30 seconds on both.]]></description>
    </item>
    <item>
      <title>Quests: Skarde in Spindelskog now mentions the bag of runestones in his replies so Bodil's errand…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-23-663e57748a3a</guid>
      <pubDate>Thu, 23 Jul 2026 20:26:11 -0500</pubDate>
      <description><![CDATA[Skarde in Spindelskog now mentions the bag of runestones in his replies so Bodil's errand can be continued with a click. The hand-off only answered one exact typed phrase before.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-22</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-headlines</guid>
      <pubDate>Wed, 22 Jul 2026 06:51:49 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Twelve more windows moved to UI Toolkit</b> across batches 7 and 8: the lot and deco permission editors, dungeon entrance and connection, leaderboards, the journal, the custom NPC dialogue editor, the Languard Gemstrike and Puzzle Box mini-games, the enchant and masterwork bonus-effect picker, and the lot deeds window.</li>
        <li>Widened the dungeon builder's deco library to 493 props across 31 categories, the groundwork for teaching it to decorate rooms with intent instead of scattering pieces.</li>
        <li>Every one of the 493 dungeon props now carries a card describing its look, its proper surface, its path-blocking, and its story role, so rooms can be dressed with intent instead of guesswork.</li>
        <li><b>Crafting stations can now use lot storage</b>: mark placed containers as crafting supply, tick the new Use lot storage option at a station on your lot, and recipes count that stock, fill the table from your backpack first, and take only the exact shortfall from the marked chests. Every take is named in chat, container permissions still decide who may pull, the chests are claimed only for the moment of the pull, and the crafting engine itself consumes nothing but the table. Eleven new tests pin the pull arithmetic.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>UI: The dungeon entrance moved to the new UI, with the dungeon picker folded into the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-d3b06b0140b1</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:05 -0500</pubDate>
      <description><![CDATA[The dungeon entrance moved to the new UI, with the dungeon picker folded into the same window: enter your dungeon or a sample dungeon, flip through the No Dungeon option and every dungeon deed you own, and the options menu (Open PvP, transfer contents to bank, adventure mode, lot access) all work as before, including the warning before a swap sends your dungeon contents to the bank.]]></description>
    </item>
    <item>
      <title>UI: The chest, player vendor, and door access-permission window moved to the new UI: a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-7b3baf53919a</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:06 -0500</pubDate>
      <description><![CDATA[The chest, player vendor, and door access-permission window moved to the new UI: a sortable list of who can open it (you shown as Manager, others as Guest), type a name and press Enter to add a player, select a row and Remove Permissions to take one off, with the add limits and the you-cannot-remove-yourself rule preserved. Three legacy list classes retired with it.]]></description>
    </item>
    <item>
      <title>UI: The Decoration Placement Settings window moved to the new UI: four dropdowns (who can…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-d11016b08683</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:07 -0500</pubDate>
      <description><![CDATA[The Decoration Placement Settings window moved to the new UI: four dropdowns (who can remove or modify a decoration, add to or take from a container, and add vendor listings), each with Kindred, Trustee, Co-Owner, and Private, remembered between sessions and applied to items as you place them.]]></description>
    </item>
    <item>
      <title>UI: The Leaderboards window moved to the new UI: pick a board on the left, choose the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-820b537a35d3</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:08 -0500</pubDate>
      <description><![CDATA[The Leaderboards window moved to the new UI: pick a board on the left, choose the timeframe and Rank By column, and the ranked table fills in with your own row highlighted and sortable columns. The data download and cache work as before. Three legacy list classes retired with it.]]></description>
    </item>
    <item>
      <title>UI: The dungeon-piece connection window moved to the new UI: pick the piece that connects at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-daafcd6cb8b8</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:09 -0500</pubDate>
      <description><![CDATA[The dungeon-piece connection window moved to the new UI: pick the piece that connects at a socket, see its point value against your dungeon point limit, and buy more limit with gold or crowns, with previews, snapping, and confirmations working as before. Double-clicking a matching piece in your bags still selects it.]]></description>
    </item>
    <item>
      <title>UI: The lot access-permission window moved to the new UI: Access and Banned tabs where you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-e1c40e698614</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:10 -0500</pubDate>
      <description><![CDATA[The lot access-permission window moved to the new UI: Access and Banned tabs where you add players by name and set their role (Guest, Kindred, Trustee, Co-Owner, Tenant), revoke access, ban and unban, plus the restricted-access, strict decoration-move, and guild chapter house toggles. Three legacy list classes retired with it.]]></description>
    </item>
    <item>
      <title>UI: The Custom NPC dialogue editor moved to the new UI: it shows the NPC current dialogue and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-08501a30c0a4</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:11 -0500</pubDate>
      <description><![CDATA[The Custom NPC dialogue editor moved to the new UI: it shows the NPC current dialogue and lets you import a new dialogue script, browsing your Ink files by name and date, compiling, and uploading, with the same result messages as before.]]></description>
    </item>
    <item>
      <title>UI: The Journal moved to the new UI: Tasks, Journal, and Entries tabs with details for the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-c76a8007fa08</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:12 -0500</pubDate>
      <description><![CDATA[The Journal moved to the new UI: Tasks, Journal, and Entries tabs with details for the selected entry, a search box on each list, Track and Untrack to show tasks on your HUD, and a Settings tab for the HUD task list. Clicking a task on the HUD still opens the Journal to it.]]></description>
    </item>
    <item>
      <title>UI: The Languard Gemstrike teletype mini-game moved to the new window system: the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-123c1a012322</guid>
      <pubDate>Wed, 22 Jul 2026 02:54:13 -0500</pubDate>
      <description><![CDATA[The Languard Gemstrike teletype mini-game moved to the new window system: the game screen, dungeon, text, and command buttons are unchanged; the window frame, close, pin, and dragging are new.]]></description>
    </item>
    <item>
      <title>UI: The Puzzle Box code-guessing mini-game (the one that opens certain mystery boxes) moved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-78a44527833f</guid>
      <pubDate>Wed, 22 Jul 2026 03:44:48 -0500</pubDate>
      <description><![CDATA[The Puzzle Box code-guessing mini-game (the one that opens certain mystery boxes) moved to UI Toolkit. The A to F letter steppers, the black and white peg feedback, the ten-try limit, and the open-the-box reward flow all carry over; the scoring moved to a unit-tested model and the two old NGUI helper scripts retired.]]></description>
    </item>
    <item>
      <title>UI: The enchant and masterwork bonus-effect picker moved to UI Toolkit. When a craft lets you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-69b9fef5bcd1</guid>
      <pubDate>Wed, 22 Jul 2026 04:22:43 -0500</pubDate>
      <description><![CDATA[The enchant and masterwork bonus-effect picker moved to UI Toolkit. When a craft lets you choose the bonus effect, the window now shows a card per effect with its name and stats, a Revise Effects button to reroll when the recipe allows it, and no way to dismiss it without choosing (picking is what finishes the craft). The awaited crafting logic that drives the choice is unchanged; only the window was rebuilt.]]></description>
    </item>
    <item>
      <title>UI: The lot deeds window (your My Lots list) moved to UI Toolkit. Deeds now show in a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-8ed6983767b2</guid>
      <pubDate>Wed, 22 Jul 2026 04:59:49 -0500</pubDate>
      <description><![CDATA[The lot deeds window (your My Lots list) moved to UI Toolkit. Deeds now show in a sortable table with name, type, location, past-due tax, and days-remaining columns; claiming a lot, paying taxes, clearing tax debt, adding tax credit, and upgrading eligible deeds all carry over, and the pay-tax and add-credit prompts are unchanged.]]></description>
    </item>
    <item>
      <title>UI: Started moving the in-game hover tooltips onto the UI Toolkit interface. The shared…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-222f03213346</guid>
      <pubDate>Wed, 22 Jul 2026 06:13:55 -0500</pubDate>
      <description><![CDATA[Started moving the in-game hover tooltips onto the UI Toolkit interface. The shared tooltip host is in place and plain text tooltips render through it, and the groundwork lets the already-converted UI Toolkit windows show tooltips too. Item and skill tooltips come next and keep the current look until then.]]></description>
    </item>
    <item>
      <title>Community: Filed 9 items to the tracker from the community forums: player suggestions on naming…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-53c4664d3d0c</guid>
      <pubDate>Wed, 22 Jul 2026 03:26:24 -0500</pubDate>
      <description><![CDATA[Filed 9 items to the tracker from the community forums: player suggestions on naming player dungeons, searching personal storage, stealth visibility, skill balance, and instrument crafting, plus two bug reports on golem spell cancellation and a Lua text function.]]></description>
    </item>
    <item>
      <title>Combat: Raised the stealth self-view tint so you can faintly see your own character while…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-110e24617e02</guid>
      <pubDate>Wed, 22 Jul 2026 03:41:34 -0500</pubDate>
      <description><![CDATA[Raised the stealth self-view tint so you can faintly see your own character while stealthed (day 2% to 5%, night 0.5% to 2%). Helps you track where you are standing at night and indoors. Other players and stealthed NPCs render the same as before.]]></description>
    </item>
    <item>
      <title>Crafting: Started on crafting stations using materials from the lot they sit on. Storage containers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-3c45b7e09d16</guid>
      <pubDate>Wed, 22 Jul 2026 05:12:43 -0500</pubDate>
      <description><![CDATA[Started on crafting stations using materials from the lot they sit on. Storage containers can now carry a crafting supply designation, the first piece of an opt-in system where the crafting table counts and pulls missing ingredients from designated chests on the same lot. Container take permissions still decide who may pull, and nothing changes unless the new option is turned on.]]></description>
    </item>
    <item>
      <title>Crafting: The lot storage side of crafting moved forward on the server: three new scene operations…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-e13c1e108712</guid>
      <pubDate>Wed, 22 Jul 2026 05:29:42 -0500</pubDate>
      <description><![CDATA[The lot storage side of crafting moved forward on the server: three new scene operations let a crafting station ask what the lot's designated supply chests hold, claim just the chests a pull needs, and release them afterward. The claim uses the same per-chest locks the game already applies when a player opens a chest, none of the new operations move items themselves, and a crashed client cannot leave a chest stuck claimed: the server clears its claims when the player disconnects or after five minutes.]]></description>
    </item>
    <item>
      <title>Crafting: The client side of crafting supply counts went in: the game can now ask the server what…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-a5da0413b770</guid>
      <pubDate>Wed, 22 Jul 2026 05:39:40 -0500</pubDate>
      <description><![CDATA[The client side of crafting supply counts went in: the game can now ask the server what the lot's designated supply chests hold and show it on recipe ingredient rows, which read like 3/10 (+12 lot) with their own color when lot storage is what makes a recipe craftable. The display stays off until the crafting window option that turns the whole feature on arrives.]]></description>
    </item>
    <item>
      <title>Crafting: The pull itself went in: with the new Use lot storage option on, clicking a recipe fills…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-5d99feb093bb</guid>
      <pubDate>Wed, 22 Jul 2026 05:53:55 -0500</pubDate>
      <description><![CDATA[The pull itself went in: with the new Use lot storage option on, clicking a recipe fills the crafting table from your backpack first and takes only the exact shortfall from the lot's designated supply chests, with a chat line for every take naming the amount, the item, and the container it came from. The chests are claimed for just the moment of the pull using the same locks as opening them by hand, the server builds every moved item itself, and a first-time confirmation explains what the option may touch before it can be switched on.]]></description>
    </item>
    <item>
      <title>Crafting: The two checkboxes went into the interface: Use lot storage sits under the Only craftable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-dd8a6c7e18fb</guid>
      <pubDate>Wed, 22 Jul 2026 06:00:13 -0500</pubDate>
      <description><![CDATA[The two checkboxes went into the interface: Use lot storage sits under the Only craftable filter in the crafting window, and placed storage containers gained a Crafting supply checkbox next to their permission settings. Marking a chest and enabling the option is now the whole setup.]]></description>
    </item>
    <item>
      <title>Crafting: Batch crafting joined the lot storage system: crafting 20 of something pulls the whole…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-67f3ce13ea33</guid>
      <pubDate>Wed, 22 Jul 2026 06:10:17 -0500</pubDate>
      <description><![CDATA[Batch crafting joined the lot storage system: crafting 20 of something pulls the whole remaining shortfall from the supply chests once, up front, instead of touching the chests per item, and the quantity spinner counts lot stock while the option is on. A planning bug the new tests caught was fixed on the way: two ingredients resolving to the same material could plan more out of one stack than it held. 11 tests now pin the pull arithmetic.]]></description>
    </item>
    <item>
      <title>Crafting: Two more safety tests joined the lot storage work: one fails the test suite if any item…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-81de4cd418a6</guid>
      <pubDate>Wed, 22 Jul 2026 06:20:03 -0500</pubDate>
      <description><![CDATA[Two more safety tests joined the lot storage work: one fails the test suite if any item creating, destroying, or moving call ever appears in the supply operations (which only read chests and set claim markers by design), and one checks across a grid of request and stack shapes that a pull is never planned for more than was asked or more than a chest holds. 13 tests now cover the system, and the crafting and consumption code itself is verified unchanged by the whole feature.]]></description>
    </item>
    <item>
      <title>Crafting: Ran the lot storage crafting work through an adversarial review and fixed what it found…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-9b4171444453</guid>
      <pubDate>Wed, 22 Jul 2026 06:50:49 -0500</pubDate>
      <description><![CDATA[Ran the lot storage crafting work through an adversarial review and fixed what it found. The important result: no way to create items without consuming materials and no duplication, since every move goes through the game's existing checked transfers and the crafting code is unchanged. The fixes: two ingredients made from the same material could take slightly more than asked from a chest, which is now summed and taken exactly; the option could disable itself after one use or get stuck if the connection dropped mid-pull; and a few cases where a chest's in-use marker could stick and leave it unopenable now always clear or retry.]]></description>
    </item>
    <item>
      <title>Dev Tools: Fixed the client test harness hold mode on Windows: the game client it launched was shut…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-e4a84985fc0b</guid>
      <pubDate>Wed, 22 Jul 2026 05:12:43 -0500</pubDate>
      <description><![CDATA[Fixed the client test harness hold mode on Windows: the game client it launched was shut down together with the runner instead of staying up for the driving agent. The client now detaches and keeps running.]]></description>
    </item>
    <item>
      <title>Tooling: Broadened the dungeon builder's decoration catalog from 259 to 493 props across 31…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-9fa371324c45</guid>
      <pubDate>Wed, 22 Jul 2026 05:20:09 -0500</pubDate>
      <description><![CDATA[Broadened the dungeon builder's decoration catalog from 259 to 493 props across 31 families, adding cages, altars, coffins, corpses, bookshelves, banners, urns, sacks, statues, cauldrons, alchemy glassware and more. Emitted a flat classification queue that will drive an upcoming pass to examine each prop and record how it should be placed.]]></description>
    </item>
    <item>
      <title>Tooling: Built the deco cataloger for the dungeon builder: it stands each of the 493 props on a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-289e9cc0620f</guid>
      <pubDate>Wed, 22 Jul 2026 05:34:47 -0500</pubDate>
      <description><![CDATA[Built the deco cataloger for the dungeon builder: it stands each of the 493 props on a clean lit stage, measures its size, collider footprint, pivot and light/particle/sound payload, works out whether it would block a walking path and how much floor it eats, and saves three reference angles per prop. Ran the whole set with no failures, producing the geometry and imagery the classification pass will read.]]></description>
    </item>
    <item>
      <title>Tooling: Classified all 493 dungeon decoration props: a fleet of agents examined each prop's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-e89dfd4cca2a</guid>
      <pubDate>Wed, 22 Jul 2026 06:10:04 -0500</pubDate>
      <description><![CDATA[Classified all 493 dungeon decoration props: a fleet of agents examined each prop's reference renders and recorded a card describing what it is, its condition, whether it is a centrepiece or background filler, which surface it belongs on (floor, wall, ceiling, water, tabletop or hanging), whether it blocks a walking path, and its in-game story role and which props pair with it. Built a browsable catalog to review the whole set and excluded pieces that only make sense as structural swaps rather than placed decor.]]></description>
    </item>
    <item>
      <title>Build: Closed a gap where a server file added to one project file but not its parallel copy…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-22-e3fcccbe260e</guid>
      <pubDate>Wed, 22 Jul 2026 05:40:18 -0500</pubDate>
      <description><![CDATA[Closed a gap where a server file added to one project file but not its parallel copy would compile everywhere yet ship missing from the build the test server runs. One check now catches the mismatch when the change is committed, rejects it at the server before it can land, and flags it in CI within a minute, with a one-command fix to reconcile the two. The check needs no special build tools, so it runs the same on every machine. This was the miss that failed a nightly build gate earlier this week.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-21</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-headlines</guid>
      <pubDate>Tue, 21 Jul 2026 19:35:17 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>A connection lost while zoning no longer strands the game on the loading screen with no way out but Task Manager: one class of disconnect was going unhandled, and the same wedged session filled the log file with 5,000 spawn errors (#1040)</li>
        <li><b>UI rebuild batch 4 complete, five windows in one day</b>: the three guild war windows (war list, scoreboard, declare war), the Looking For Group window, and the quit dialog now run on the new interface system, with sortable columns, live countdowns, per-player kill tables, and ten more legacy UI classes retired.</li>
        <li>Designed a full <b>Chaos Magic</b> rework: the signature nuke finally resistable, spells that work from the first trainer visit, deck-shuffling glyphs, a grandmaster transformation, and Cabalist sieges and shardfall storms drawn from the game's own lore.</li>
        <li><b>Batch 5 of the UI overhaul is complete: all 20 small windows converted in one day.</b> The confirmations, Pay Lot Taxes, three report windows on one shared form kit, rename, the treasure map with its runic flip side, help, the Tablet of Finding, the HUD timers strip, Choose One rewards, the housing lot list, the phonograph, teleport to player, and the internet radio all run on the new UI. Around 25,000 lines of legacy window data retired, four latent bugs fixed on the way through.</li>
        <li>Fixed the new UI windows grabbing Esc and leaking clicks and typing into the game world; Esc now closes the window you used last instead of opening Options on top.</li>
        <li>The <b>dungeon builder</b> went from plan to a working dungeon in a day: a knowledge base covering all 666 kit pieces, then a build engine that assembles a walkable sewer network from a JSON plan, lights and floods it with torches, water, webs, and crates, populates it with monster spawners, a loot chest, and a lever-gated portcullis, and bakes the navmesh so it can actually be played. Every layer places from the same plan and re-runs with zero changes.</li>
        <li>Mega-farm farming round 2: found and removed the 20,000 object cap that corrupted plant updates on 41k-spot farms, second watering passes send again, and relogs will show true plant state.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Filed 17 player suggestions and one Lua addon bug from the forums to the tracker…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-7c950138a75c</guid>
      <pubDate>Tue, 21 Jul 2026 03:27:37 -0500</pubDate>
      <description><![CDATA[Filed 17 player suggestions and one Lua addon bug from the forums to the tracker, spanning building QoL, crafting, and API requests.]]></description>
    </item>
    <item>
      <title>Items: The White Birthday Candle now shows its own white icon, body, and flame. The white set…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-5e85f06c0dce</guid>
      <pubDate>Tue, 21 Jul 2026 05:32:50 -0500</pubDate>
      <description><![CDATA[The <b>White Birthday Candle</b> now shows its own white icon, body, and flame. The white set had been file-copied from the original candle with clashing internal ids, so it fell back to the plain candle look everywhere.]]></description>
    </item>
    <item>
      <title>Decorations: The three placeable shipwreck pieces could spawn an older model without the adjusted size…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-e22354f28075</guid>
      <pubDate>Tue, 21 Jul 2026 05:32:50 -0500</pubDate>
      <description><![CDATA[The three placeable shipwreck pieces could spawn an older model without the adjusted size and colliders depending on which machine built the game; their ids are now unique and the deco items always use the adjusted versions.]]></description>
    </item>
    <item>
      <title>World: Checked in pending world edits: terrain touch-ups in Port Harmony and on the Novia forest…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-d555298b15d9</guid>
      <pubDate>Tue, 21 Jul 2026 05:32:50 -0500</pubDate>
      <description><![CDATA[Checked in pending world edits: terrain touch-ups in Port Harmony and on the Novia forest road, and a brighter fog and ambient lighting pass on the Sequana Colossus zone.]]></description>
    </item>
    <item>
      <title>Dev Tools: Voice pipeline staging now picks an OS-appropriate default folder, and the stray staging…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-a35aaf9fbee9</guid>
      <pubDate>Tue, 21 Jul 2026 05:32:50 -0500</pubDate>
      <description><![CDATA[Voice pipeline staging now picks an OS-appropriate default folder, and the stray staging files a Mac run had scattered (including the newer Frost Giant voice maps) were merged into the proper location. Also cleaned up leftover metadata for UI scripts removed in the interface rebuild.]]></description>
    </item>
    <item>
      <title>Dev Tools: Dungeon builder: the engine now dresses what it builds. Four new passes (water, deco…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-01eadb37f433</guid>
      <pubDate>Tue, 21 Jul 2026 13:34:21 -0500</pubDate>
      <description><![CDATA[Dungeon builder: the engine now dresses what it builds. Four new passes (water, deco, lighting, ambient audio) place theme props from the same manifest that drives the shell, each prop anchored to its room so layout edits carry the dressing along.]]></description>
    </item>
    <item>
      <title>Dev Tools: The test sewer went from bare stone to a lit, dripping tunnel run: water in the gutters…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-a9fededa2f13</guid>
      <pubDate>Tue, 21 Jul 2026 13:34:21 -0500</pubDate>
      <description><![CDATA[The test sewer went from bare stone to a lit, dripping tunnel run: water in the gutters, tilted wall torches, puddles, webs, crates, and drip loops, all placed by the engine from data mined out of the shipped sewer scenes. Re-running every pass changes nothing, which is the property the whole system is built on.]]></description>
    </item>
    <item>
      <title>Dev Tools: Fixed the scene report filename cleaner to strip the same set of unsafe characters on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-a71051debc2d</guid>
      <pubDate>Tue, 21 Jul 2026 13:30:29 -0500</pubDate>
      <description><![CDATA[Fixed the scene report filename cleaner to strip the same set of unsafe characters on every platform; reports written on a Mac could carry characters Windows rejects. Also dropped eight orphaned asset bookkeeping files left behind by the retired legacy dialog prefabs.]]></description>
    </item>
    <item>
      <title>Dev Tools: Dungeon builder: the engine now populates a dungeon, not just decorates it. New passes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-8ee089602563</guid>
      <pubDate>Tue, 21 Jul 2026 15:09:51 -0500</pubDate>
      <description><![CDATA[Dungeon builder: the engine now populates a dungeon, not just decorates it. New passes place monster spawners, loot chests, a lever-gated portcullis, the entrance and exit points, and then bake the walkable navmesh so creatures and players can actually move through the rooms it built.]]></description>
    </item>
    <item>
      <title>Dev Tools: Ran the whole gameplay layer through an automated review of 38 checks against the real…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-031f8f403936</guid>
      <pubDate>Tue, 21 Jul 2026 15:09:51 -0500</pubDate>
      <description><![CDATA[Ran the whole gameplay layer through an automated review of 38 checks against the real game code before committing. It caught a handful of ways the builder could have placed objects that looked right but would not work in play, plus three cases where a validation pop-up would have frozen the editor mid-build; all fixed, and the test dungeon rebuilds with zero changes on a second run.]]></description>
    </item>
    <item>
      <title>Dev Tools: Dungeon builder: added the checks and the shipping groundwork. A test suite now opens the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-c38fca33e131</guid>
      <pubDate>Tue, 21 Jul 2026 15:35:42 -0500</pubDate>
      <description><![CDATA[Dungeon builder: added the checks and the shipping groundwork. A test suite now opens the engine's output and confirms every room, spawner, chest, and the navmesh match the plan, and a dry-run reports exactly what registering a new dungeon with the game would do before anything is written. Wrote up the whole system and its knowledge base in the repo docs.]]></description>
    </item>
    <item>
      <title>Dev Tools: Dungeon builder: dungeons can now grow after they are built. Each one ships with sealed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-a97c94c9caad</guid>
      <pubDate>Tue, 21 Jul 2026 18:07:19 -0500</pubDate>
      <description><![CDATA[Dungeon builder: dungeons can now grow after they are built. Each one ships with sealed stubs at its edges; opening one lets the builder add a new wing, remove the old cap, and rebuild only the new section while leaving everything already placed untouched. Proved it on the test dungeon by opening a stub into a fresh tunnel run with the water and navmesh extending to match.]]></description>
    </item>
    <item>
      <title>Dev Tools: Fixed the dungeon builder dropping props outside the tunnels: a crate and barrel were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-acbb6c5cf24d</guid>
      <pubDate>Tue, 21 Jul 2026 18:43:53 -0500</pubDate>
      <description><![CDATA[Fixed the dungeon builder dropping props outside the tunnels: a crate and barrel were floating in the void beside the walkway. Floor props now snap down onto the actual floor, and if one is placed past the wall where there is no floor the build stops and flags it instead of shipping a prop in mid-air.]]></description>
    </item>
    <item>
      <title>Dev Tools: Fixed the dungeon builder standing a large dungeon gatehouse across a round sewer tunnel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-872f72300f10</guid>
      <pubDate>Tue, 21 Jul 2026 19:34:17 -0500</pubDate>
      <description><![CDATA[Fixed the dungeon builder standing a large dungeon gatehouse across a round sewer tunnel, where its square frame cut through the walls. A gate that blocks a passage is now placed as part of the tunnel opening, using the sewer set's own barred grate that matches the round bore, with a wall switch to open it, instead of a mismatched prop dropped in at a guessed angle.]]></description>
    </item>
    <item>
      <title>Client: Fixed the loading screen hanging forever after a lost connection. If the server closed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-4a5b1b9d167e</guid>
      <pubDate>Tue, 21 Jul 2026 05:54:04 -0500</pubDate>
      <description><![CDATA[Fixed the loading screen hanging forever after a lost connection. If the server closed the link while you were zoning into a scene, the game sat on the loading screen with no message and no way back to character select except ending the process. Found in two overnight crash uploads from the same player, 45 minutes apart, entering the same zone. One class of disconnect was going unhandled; all of them now run the same recovery (#1040, verify task #1043).]]></description>
    </item>
    <item>
      <title>Client: The same wedged session had creatures retrying their spawns against the dead connection…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-095ab3ab81a3</guid>
      <pubDate>Tue, 21 Jul 2026 05:54:04 -0500</pubDate>
      <description><![CDATA[The same wedged session had creatures retrying their spawns against the dead connection forever: the two uploads carried 5,035 and 3,857 identical errors with full stack traces, growing the log file to 3.5 MB, heavy enough to get the client kicked off the logging service for spam. Spawning now stops when the connection is down, and a repeating failure reports three times then a running total, so that storm collapses to 54 lines. 11 new tests, including one that fails if a future disconnect code is ignored the same way.]]></description>
    </item>
    <item>
      <title>Client: Crash reports from the launcher now carry what Windows itself recorded about the session…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-5f2c9e2126d9</guid>
      <pubDate>Tue, 21 Jul 2026 05:54:20 -0500</pubDate>
      <description><![CDATA[Crash reports from the launcher now carry what Windows itself recorded about the session: whether the game faulted and in which component, whether the graphics driver reset, and whether the machine lost power. Prompted by a report the same night where the game vanished with a healthy 86 fps a few seconds earlier, no crash file, and a log that simply stopped, leaving nothing to tell those three apart. Only the game's own records are collected, other programs are left alone, and personal paths are stripped before anything is sent (#1041).]]></description>
    </item>
    <item>
      <title>Client: Fixed the observatory telescope so it actually magnifies. Looking through a placed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-eed36a79c0c5</guid>
      <pubDate>Tue, 21 Jul 2026 06:36:36 -0500</pubDate>
      <description><![CDATA[Fixed the observatory telescope so it actually magnifies. Looking through a placed telescope and scrolling now narrows the view and enlarges the moons, planets, and stars, the way a telescope should. Before, zooming just slid the camera a couple of metres forward and did nothing to the sky.]]></description>
    </item>
    <item>
      <title>Client: Distant land holds its detail while you are zoomed in through the telescope, and aiming…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-396eecbe3385</guid>
      <pubDate>Tue, 21 Jul 2026 06:36:43 -0500</pubDate>
      <description><![CDATA[Distant land holds its detail while you are zoomed in through the telescope, and aiming slows down at high magnification so a small mouse move no longer whips across the sky.]]></description>
    </item>
    <item>
      <title>Creatures: Summoning a water elemental no longer logs a missing-script warning. The pet prefab…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-d31562058398</guid>
      <pubDate>Tue, 21 Jul 2026 05:54:20 -0500</pubDate>
      <description><![CDATA[Summoning a water elemental no longer logs a missing-script warning. The pet prefab carried a leftover empty component, there since the original import from the old version control, that its sibling elementals had already had removed.]]></description>
    </item>
    <item>
      <title>Infrastructure: Last night's automated build stopped before it started: a server file added with the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-88f7f5dca68d</guid>
      <pubDate>Tue, 21 Jul 2026 06:30:11 -0500</pubDate>
      <description><![CDATA[Last night's automated build stopped before it started: a server file added with the global dev deco work was registered in one of the two project files and not the other, so it would have been missing from the build the test server actually runs. Added the missing entry and confirmed the server compiles and publishes clean.]]></description>
    </item>
    <item>
      <title>Infrastructure: Wired the project-file consistency check into the commit path so that mismatch is caught…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-8f48f2f724f0</guid>
      <pubDate>Tue, 21 Jul 2026 06:30:11 -0500</pubDate>
      <description><![CDATA[Wired the project-file consistency check into the commit path so that mismatch is caught locally instead of hours later on the build machine. It only runs when a server project file is part of the change, and refuses the commit with the exact missing line to add.]]></description>
    </item>
    <item>
      <title>Infrastructure: Published the Chaos Magic rework design doc to the team wiki's Design Plans chapter, next…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-0279acea0584</guid>
      <pubDate>Tue, 21 Jul 2026 09:18:31 -0500</pubDate>
      <description><![CDATA[Published the <b>Chaos Magic</b> rework design doc to the team wiki's Design Plans chapter, next to the other feature plans, and refreshed the wiki assistant's doc map so it can answer questions about it.]]></description>
    </item>
    <item>
      <title>Lua addons: Added four Lua addon functions that report what is under the mouse cursor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-f7c589242433</guid>
      <pubDate>Tue, 21 Jul 2026 06:38:36 -0500</pubDate>
      <description><![CDATA[Added four Lua addon functions that report what is under the mouse cursor: <strong>ShroudGetDescriptionUnderMouse</strong>, <strong>ShroudGetNameUnderMouse</strong>, <strong>ShroudGetKindUnderMouse</strong>, and <strong>ShroudGetIdUnderMouse</strong>. They cover NPCs, other players, world items and containers, placed decorations, inventory and vendor items, and UI elements, returning the same tooltip text the game already shows with formatting codes stripped.]]></description>
    </item>
    <item>
      <title>Dev Portal: Region fields across the dev portals now show real region names from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-6e321c65c851</guid>
      <pubDate>Tue, 21 Jul 2026 07:30:44 -0500</pubDate>
      <description><![CDATA[Region fields across the dev portals now show real region names from the designer-authored list checked in yesterday: the character viewer and the scenes portal read "Regalis and Midmaer" or "Perennial Coast" instead of internal codes like NoviaRegion03. The scenes region filter and text search understand the friendly names too.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the guild war list window on the new interface system: guild names, scores, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-464d11cb0199</guid>
      <pubDate>Tue, 21 Jul 2026 08:20:19 -0500</pubDate>
      <description><![CDATA[Rebuilt the guild war list window on the new interface system: guild names, scores, and live time remaining in sortable columns, active wars grouped on top, ended wars tinted by outcome, forfeit and scoreboard actions on the right-click menu.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the guild war scoreboard and the declare-war window on the new interface system…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-5fe722a2665f</guid>
      <pubDate>Tue, 21 Jul 2026 08:20:19 -0500</pubDate>
      <description><![CDATA[Rebuilt the guild war scoreboard and the declare-war window on the new interface system. The scoreboard shows both guilds' scores with per-player kills and deaths tables and a live countdown; the declare-war window keeps its duration picker and cancel-while-waiting behavior.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the Looking For Group window on the new interface system: two-line listing cards…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-c800ac238b62</guid>
      <pubDate>Tue, 21 Jul 2026 08:43:52 -0500</pubDate>
      <description><![CDATA[Rebuilt the Looking For Group window on the new interface system: two-line listing cards with leader, member count, description, started-ago time, and an inline Join button, plus a filter box. Fixed the listing age showing the wrong number of days after the first day.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt the quit and exit dialog on the new interface system. The confirmation, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-b15105d34ee2</guid>
      <pubDate>Tue, 21 Jul 2026 08:43:52 -0500</pubDate>
      <description><![CDATA[Rebuilt the quit and exit dialog on the new interface system. The confirmation, the server logout countdown, and the please-wait stage now live in one window; the ransom warning, Enter-to-confirm, and the no-hang shutdown guard all carried over.]]></description>
    </item>
    <item>
      <title>UI: Started UI conversion batch 5 (20 small windows). First up: the PVP zone entry warning…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-404129b2511e</guid>
      <pubDate>Tue, 21 Jul 2026 10:42:06 -0500</pubDate>
      <description><![CDATA[Started UI conversion batch 5 (20 small windows). First up: the PVP zone entry warning now uses the new-style confirmation window, with its Ask me every time checkbox intact. The old NGUI dialog was retired.]]></description>
    </item>
    <item>
      <title>UI: Fixed the skills window keeping capped skill levels on the icons after leaving a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-6717c284793e</guid>
      <pubDate>Tue, 21 Jul 2026 10:56:51 -0500</pubDate>
      <description><![CDATA[Fixed the skills window keeping capped skill levels on the icons after leaving a level-capped zone (shardfalls, PvP arena, Opalis ruins). The window now repaints skill levels on every scene change, so a skill trained past the cap reads its true level again at home instead of the capped 100 until relog. Display bug only, stored skill experience was never affected. Player-reported on live; the same code ships on chaos. Tester verification task #1056 filed.]]></description>
    </item>
    <item>
      <title>UI: Batch 5 continued: the repair kit confirmation moved to the new-style window, keeping its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-641b89865c87</guid>
      <pubDate>Tue, 21 Jul 2026 11:00:34 -0500</pubDate>
      <description><![CDATA[Batch 5 continued: the repair kit confirmation moved to the new-style window, keeping its Ask me every time checkbox. Another NGUI dialog retired.]]></description>
    </item>
    <item>
      <title>UI: The follow-your-party-leader prompt joined the new-style confirmations. Same Follow and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-d208358f2978</guid>
      <pubDate>Tue, 21 Jul 2026 11:31:10 -0500</pubDate>
      <description><![CDATA[The follow-your-party-leader prompt joined the new-style confirmations. Same Follow and Stay Here choices; the Episode 2 access check is unchanged.]]></description>
    </item>
    <item>
      <title>UI: The party summon prompt moved to the new-style confirmations. Go and Stay Here work as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-b9e52782dbd4</guid>
      <pubDate>Tue, 21 Jul 2026 11:39:31 -0500</pubDate>
      <description><![CDATA[The party summon prompt moved to the new-style confirmations. Go and Stay Here work as before, including the PvP zone warning variant.]]></description>
    </item>
    <item>
      <title>UI: The instance restart prompt (Reload or Stay here when a server instance is closing) moved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-c44fbc9d626c</guid>
      <pubDate>Tue, 21 Jul 2026 12:26:13 -0500</pubDate>
      <description><![CDATA[The instance restart prompt (Reload or Stay here when a server instance is closing) moved to the new-style confirmations, retiring the last of the old yes/no dialog windows.]]></description>
    </item>
    <item>
      <title>UI: The Pay Lot Taxes window was rebuilt in the new UI style: days slider and number box stay…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-e03e2ae5a5b7</guid>
      <pubDate>Tue, 21 Jul 2026 12:26:13 -0500</pubDate>
      <description><![CDATA[The Pay Lot Taxes window was rebuilt in the new UI style: days slider and number box stay in sync, Enter confirms, and the window locks itself while the payment processes. About 3,000 lines of legacy window data came out of the deed list in the process.]]></description>
    </item>
    <item>
      <title>UI: Fixed the converted UI Toolkit windows leaking input to the game: clicks inside the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-26774e662591</guid>
      <pubDate>Tue, 21 Jul 2026 12:31:11 -0500</pubDate>
      <description><![CDATA[Fixed the converted UI Toolkit windows leaking input to the game: clicks inside the tester, GM, Oracle, tip jar, and game table windows no longer hit the world behind them, and typing in their text boxes no longer moves the character or fires hotbar keys. New shared <b>SotAUitkInput</b> signals (pointer over a window, text box focused) feed the same global gates the old NGUI UI used.]]></description>
    </item>
    <item>
      <title>UI: Esc now closes the front-most open tool window instead of opening the Options menu on top…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-b43e496a67bf</guid>
      <pubDate>Tue, 21 Jul 2026 12:31:11 -0500</pubDate>
      <description><![CDATA[Esc now closes the front-most open tool window instead of opening the Options menu on top of it (new <b>SotAUitkEscapeStack</b> registry consulted by the game Esc chain, most recent window first). Esc while typing deselects the text box first; the next press closes the window.]]></description>
    </item>
    <item>
      <title>UI: Releasing a dragged inventory item over one of the new windows no longer drops it into…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-576ef68cc311</guid>
      <pubDate>Tue, 21 Jul 2026 12:31:11 -0500</pubDate>
      <description><![CDATA[Releasing a dragged inventory item over one of the new windows no longer drops it into the world underneath. Also fixed the pointer-over checks of the Oracle, tip jar, and game table windows testing a vertically mirrored area (all four now share one screen-to-panel conversion). 26 new EditMode tests cover the registry, the input gates, and chain wiring.]]></description>
    </item>
    <item>
      <title>UI: Wrote up the batch 5 working plan (recipes, remaining 14 windows, and the gotchas found…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-f22503f822eb</guid>
      <pubDate>Tue, 21 Jul 2026 12:36:28 -0500</pubDate>
      <description><![CDATA[Wrote up the batch 5 working plan (recipes, remaining 14 windows, and the gotchas found so far) into the repo docs so the batch can continue from any machine. Roadmap updated to match.]]></description>
    </item>
    <item>
      <title>UI: The stuck spot and task problem report window was rebuilt in the new UI style: reason…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-447712ba76e0</guid>
      <pubDate>Tue, 21 Jul 2026 13:30:23 -0500</pubDate>
      <description><![CDATA[The stuck spot and task problem report window was rebuilt in the new UI style: reason dropdown, comment box with a live 500 character counter that turns red at the limit, and a Submit button that stays off until a reason is picked and a comment is typed. First window on a new shared form kit (<b>SotAUitkForm</b>) the remaining report forms will reuse; about 2,100 lines of legacy window data retired with it.]]></description>
    </item>
    <item>
      <title>UI: The report content window (/reportcontent in chat) moved to the new UI on the same shared…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-e9f50aaff9ff</guid>
      <pubDate>Tue, 21 Jul 2026 13:39:26 -0500</pubDate>
      <description><![CDATA[The report content window (/reportcontent in chat) moved to the new UI on the same shared form kit: reason dropdown, comment box prefilled from the chat command, and the window stays open until the report goes through. Another 2,100 lines of legacy window data retired.]]></description>
    </item>
    <item>
      <title>UI: The report player window finished the report-form family on the new UI: all six reasons…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-883c714053d0</guid>
      <pubDate>Tue, 21 Jul 2026 13:43:53 -0500</pubDate>
      <description><![CDATA[The report player window finished the report-form family on the new UI: all six reasons, the player name header, and both ways in (the chat command with a reason prefill and the player right-click menu) work as before. Screenshots and recent chat still ride along with the report. Three report windows now share one form kit.]]></description>
    </item>
    <item>
      <title>UI: The rename window (items, pets, houses, vendor naming) moved to the new UI: current name…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-52e3dc26403d</guid>
      <pubDate>Tue, 21 Jul 2026 13:52:17 -0500</pubDate>
      <description><![CDATA[The rename window (items, pets, houses, vendor naming) moved to the new UI: current name shown, live name filtering as you type (letters, numbers, one apostrophe, single spaces), an inline invalid-name message, and Set to Default to clear a custom name. All the rename flows in the game go through this one window; about 1,900 lines of legacy window data retired.]]></description>
    </item>
    <item>
      <title>UI: Deleted the dead player feedback survey windows (a star rating form and its launcher)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-0ffddd2f4de2</guid>
      <pubDate>Tue, 21 Jul 2026 13:56:08 -0500</pubDate>
      <description><![CDATA[Deleted the dead player feedback survey windows (a star rating form and its launcher) after confirming nothing in the game opens them: three classes and two window prefabs gone.]]></description>
    </item>
    <item>
      <title>UI: The treasure map window moved to the new UI: the map shows in a draggable window, Flip…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-7bf1466522ac</guid>
      <pubDate>Tue, 21 Jul 2026 14:05:30 -0500</pubDate>
      <description><![CDATA[The treasure map window moved to the new UI: the map shows in a draggable window, Flip Map turns to the mirrored back with the hint still written in the runic or handwriting font, the page turn sound plays, and several maps can be open at once. Also fixed the X button on multi-instance windows (like the guild war scoreboard) leaving an invisible window behind.]]></description>
    </item>
    <item>
      <title>UI: The in-game help window (contextual hints for crafting stations, banks, and other firsts)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-bf67463abb22</guid>
      <pubDate>Tue, 21 Jul 2026 14:11:00 -0500</pubDate>
      <description><![CDATA[The in-game help window (contextual hints for crafting stations, banks, and other firsts) moved to the new UI: resizable, pinnable, same help text, and the Show Hints checkbox still tracks the Options setting both ways. Fixed a leak where every help window left its hint-toggle handler behind after closing. Keyboard key lighting still follows the window.]]></description>
    </item>
    <item>
      <title>UI: Fyndoro's Tablet of Finding moved to the new UI: write a name, get the location, once a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-6a74b0d1eadc</guid>
      <pubDate>Tue, 21 Jul 2026 14:16:02 -0500</pubDate>
      <description><![CDATA[Fyndoro's Tablet of Finding moved to the new UI: write a name, get the location, once a day per tablet. The daily cooldown message, the placed-on-lot flow, and all the result messages work as before.]]></description>
    </item>
    <item>
      <title>UI: The HUD timers strip (team PVP score and countdown, battleground phase timer, treasure…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-b4e0edc10343</guid>
      <pubDate>Tue, 21 Jul 2026 14:28:12 -0500</pubDate>
      <description><![CDATA[The HUD timers strip (team PVP score and countdown, battleground phase timer, treasure map event timer) moved to the new UI: same numbers, drags as one piece, position remembered. The timing logic behind it now lives in small tested modules, and a battleground crash right as the scoreboard loads was fixed along the way.]]></description>
    </item>
    <item>
      <title>UI: The Choose One reward window (pick a single item from a bundle) moved to the new UI…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-52df113cbc43</guid>
      <pubDate>Tue, 21 Jul 2026 14:36:25 -0500</pubDate>
      <description><![CDATA[The Choose One reward window (pick a single item from a bundle) moved to the new UI: icons and names in the list, the are-you-sure confirmation before the pick is final, and the already-known-emote guard all work as before. Three legacy list classes retired with it.]]></description>
    </item>
    <item>
      <title>UI: The housing lot list (town guide and lot conversations) moved to the new UI: owner, house…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-70c317e3cbe2</guid>
      <pubDate>Tue, 21 Jul 2026 14:45:07 -0500</pubDate>
      <description><![CDATA[The housing lot list (town guide and lot conversations) moved to the new UI: owner, house name, lot type, basement, and dungeon columns that sort on click, the available count up top, and Set Compass Destination working as before. Fixed a handler leak the old window left behind on every close.]]></description>
    </item>
    <item>
      <title>UI: The phonograph song list moved to the new UI: one row per wax cylinder with icon, song…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-db7784718e31</guid>
      <pubDate>Tue, 21 Jul 2026 14:53:21 -0500</pubDate>
      <description><![CDATA[The phonograph song list moved to the new UI: one row per wax cylinder with icon, song, composer, and album, Play and Stop with the now-playing readout, live list updates as cylinders enter or leave your bags, and double click to play.]]></description>
    </item>
    <item>
      <title>UI: The Select Player window for teleport scrolls moved to the new UI: friends and party…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-3af494024aca</guid>
      <pubDate>Tue, 21 Jul 2026 15:02:02 -0500</pubDate>
      <description><![CDATA[The Select Player window for teleport scrolls moved to the new UI: friends and party members with live locations, unreachable players greyed out, the PVP zone warning still in the path, and a fix for a subtle case where the game could lose track of who you picked while the teleport was being checked.]]></description>
    </item>
    <item>
      <title>UI: The Aether Vibration Device (internet radio) finished the batch: station list with your…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-9384fbd4fcfe</guid>
      <pubDate>Tue, 21 Jul 2026 15:10:59 -0500</pubDate>
      <description><![CDATA[The Aether Vibration Device (internet radio) finished the batch: station list with your saved stations intact, Play and Stop with the current station readout, and adding or editing a station now happens in a panel inside the window instead of a separate popup. One whole legacy window (the old add-station popup) retired outright.]]></description>
    </item>
    <item>
      <title>UI: Both PVP stats windows moved to the new UI: the open-PVP kill list (your row in green…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-650d9f5d11c6</guid>
      <pubDate>Tue, 21 Jul 2026 15:24:46 -0500</pubDate>
      <description><![CDATA[Both PVP stats windows moved to the new UI: the open-PVP kill list (your row in green, the same who-you-can-see rules, everyone visible in battlegrounds) and the team stats window with the Virtue and Chaos rosters under the live score and round timer. The timers strip and this window now share one timing component with no duplicated display code left.]]></description>
    </item>
    <item>
      <title>UI: The quantity picker (splitting stacks, buying in bulk, mail and trade amounts) moved to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-288ad9d07eab</guid>
      <pubDate>Tue, 21 Jul 2026 15:33:17 -0500</pubDate>
      <description><![CDATA[The quantity picker (splitting stacks, buying in bulk, mail and trade amounts) moved to the new UI: slider, number box, and nudge buttons in lockstep, arrow keys to fine tune, Enter to confirm, Escape to back out, opening right at your mouse like before.]]></description>
    </item>
    <item>
      <title>UI: The guild description editor moved to the new UI: the description loads with your guild…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-653440cb06b3</guid>
      <pubDate>Tue, 21 Jul 2026 15:40:21 -0500</pubDate>
      <description><![CDATA[The guild description editor moved to the new UI: the description loads with your guild name, officers with the right role edit and submit, everyone else gets a read-only view with a notice, and the window closes itself if your role changes or you leave the guild.]]></description>
    </item>
    <item>
      <title>UI: The vendor manager (every item you have posted on player vendors, worldwide) moved to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-8049802a21a7</guid>
      <pubDate>Tue, 21 Jul 2026 15:46:13 -0500</pubDate>
      <description><![CDATA[The vendor manager (every item you have posted on player vendors, worldwide) moved to the new UI: icon, name, and town per listing, stored vendors highlighted, multi-select Send To Bank with the confirmation and count summary, and the Refresh cooldown as before.]]></description>
    </item>
    <item>
      <title>UI: The crown store window moved to the new UI: five packages with live prices, sale prices…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-df7af36c99c4</guid>
      <pubDate>Tue, 21 Jul 2026 15:53:45 -0500</pubDate>
      <description><![CDATA[The crown store window moved to the new UI: five packages with live prices, sale prices shown next to the struck-through original with the Sale badge, the Best Seller and Best Value ribbons in place, and Buy opening the checkout as before.]]></description>
    </item>
    <item>
      <title>UI: The /loctrack location overlay (area name and live coordinates, handy for reporting exact…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-ae847fffe40c</guid>
      <pubDate>Tue, 21 Jul 2026 15:58:46 -0500</pubDate>
      <description><![CDATA[The /loctrack location overlay (area name and live coordinates, handy for reporting exact spots) moved to the new UI, and a dead loading-popup prefab nothing referenced was deleted.]]></description>
    </item>
    <item>
      <title>UI: The Select Destination window for teleport scrolls moved to the new UI: every discovered…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-c74b1cc772a3</guid>
      <pubDate>Tue, 21 Jul 2026 16:08:41 -0500</pubDate>
      <description><![CDATA[The Select Destination window for teleport scrolls moved to the new UI: every discovered destination with Summary, Tier, and Episode columns, a filter box, tournament towns colored by event and sorted to the top with their switch, hover reasons on places you cannot enter, and the PVP warning honoring its setting. The biggest single window converted so far.]]></description>
    </item>
    <item>
      <title>UI: The basement entrance moved to the new UI, with the basement picker folded into the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-2d33ab78c38f</guid>
      <pubDate>Tue, 21 Jul 2026 16:16:39 -0500</pubDate>
      <description><![CDATA[The basement entrance moved to the new UI, with the basement picker folded into the same window: enter your basement, flip through the empty basement and every deed that fits your lot, and the options menu (Open PvP, transfer contents to bank, lot access) all work as before, including the warning before a swap sends your basement contents to the bank.]]></description>
    </item>
    <item>
      <title>UI: The center-screen HUD messages (locked doors, tutorial prompts, zone and party notices…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-79c5dd98a9a9</guid>
      <pubDate>Tue, 21 Jul 2026 16:22:31 -0500</pubDate>
      <description><![CDATA[The center-screen HUD messages (locked doors, tutorial prompts, zone and party notices from around thirty game systems) moved to the new UI: same centered banner, timed messages clear themselves, persistent prompts stay until satisfied, and rapid messages still queue in order.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: Started an AI-assisted dungeon build system: a skill that designs and builds full dungeon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-a730e0c571b8</guid>
      <pubDate>Tue, 21 Jul 2026 08:21:17 -0500</pubDate>
      <description><![CDATA[Started an AI-assisted dungeon build system: a skill that designs and builds full dungeon scenes from the modular art kits (geometry, deco, lighting, spawners, loot, secrets, world wiring), with approval gates before anything ships. Plan approved; first target is a two-level drainage dungeon beneath Castle Atos.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: Mapped every dungeon construction system in the project to ground the builder: six…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-11816ef9c259</guid>
      <pubDate>Tue, 21 Jul 2026 08:21:27 -0500</pubDate>
      <description><![CDATA[Mapped every dungeon construction system in the project to ground the builder: six modular art kits on an 8m grid, the deco layer, spawn/loot data, scene registration, and the existing random-dungeon and scene-analysis tooling the new system reuses.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: First knowledge-base pass for the dungeon builder: 666 kit pieces cataloged with parsed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-485f39152609</guid>
      <pubDate>Tue, 21 Jul 2026 08:58:35 -0500</pubDate>
      <description><![CDATA[First knowledge-base pass for the dungeon builder: 666 kit pieces cataloged with parsed roles, and six existing dungeon scenes mined for how designers actually place them. The data settled two layout rules the plan had guessed at: pieces snap on a 2m grid with an 8m room pitch, and floors stack on a 5m vertical module.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: Measured every dungeon kit piece in the Editor: exact bounds and every opening on all six…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-312b81e979e1</guid>
      <pubDate>Tue, 21 Jul 2026 09:16:27 -0500</pubDate>
      <description><![CDATA[Measured every dungeon kit piece in the Editor: exact bounds and every opening on all six faces of all 666 pieces, probed with ray grids. Straight halls read as two clean doorways, T-intersections as three, and barred drain grates are detectable by how much of the opening the bars block.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: The dungeon knowledge base now has a full data definition per piece: every doorway on all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-7efd53265f00</guid>
      <pubDate>Tue, 21 Jul 2026 09:48:55 -0500</pubDate>
      <description><![CDATA[The dungeon knowledge base now has a full data definition per piece: every doorway on all 666 kit pieces identified with position, size, and a confidence score built from three independent sources (measured geometry, naming conventions, and real placements in shipped scenes). Straight tunnels read as two opposed doorways, T-intersections as three, X as four, endcaps as none. A sewer theme palette ties the pieces to matching deco families, monsters, loot, and fog settings for the Castle Atos pilot.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: Worked out how the dungeon kits hand off between themes and wrote it into the knowledge…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-3d2cbdaa4646</guid>
      <pubDate>Tue, 21 Jul 2026 09:58:24 -0500</pubDate>
      <description><![CDATA[Worked out how the dungeon kits hand off between themes and wrote it into the knowledge base: dedicated adapter pieces (sewer tunnel into dungeon stonework, tunnel into cistern), room walls pre-punched with another kit's doorway, cave and sewer corridor mouths that match closely enough to butt directly, breakable walls used as secret cross-theme passages, and the shipped-scene habit of changing theme on a level drop. The two sewer-to-dungeon adapters turned out to share their exact shell with the well-used cistern adapters, so their snapping rules carry over.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: Pinned down how the theme adapter pieces actually orient: the sewer-to-dungeon tunnels…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-117ddde695dd</guid>
      <pubDate>Tue, 21 Jul 2026 10:12:10 -0500</pubDate>
      <description><![CDATA[Pinned down how the theme adapter pieces actually orient: the sewer-to-dungeon tunnels keep their round sewer bore running straight through and carry a squared dungeon doorway on one side wall, so they add a side exit rather than capping a corridor. The transition staircase climbs one 5m level into a dungeon-floored landing, matching how shipped scenes stack dungeon halls above the sewers. Determined from the mesh materials, real scene placements, and renders of each piece.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: Knowledge base hardened and the build engine core is in: a test suite now guards the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-b7c592787b47</guid>
      <pubDate>Tue, 21 Jul 2026 11:32:31 -0500</pubDate>
      <description><![CDATA[Knowledge base hardened and the build engine core is in: a test suite now guards the whole piece catalog (it immediately caught one piece with an inflated footprint), every water channel was measured with floor depth-maps instead of eyeballed (two profiles: half-meter gutters and the big 1.5m-deep cistern trenches), and the theme adapters carry exact measured doorways. On top of that sits the first engine layer: a dungeon manifest format and a deterministic placer that validates piece fit, doorway matching, sealed seams, and reachability before anything touches a scene. Structural placement is locked to the raw kit pieces; the deco variants stay out of walls and floors.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: The dungeon builder now has its operator manual: a skill that walks from a one-line…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-775df7a3bfdd</guid>
      <pubDate>Tue, 21 Jul 2026 12:24:43 -0500</pubDate>
      <description><![CDATA[The dungeon builder now has its operator manual: a skill that walks from a one-line description through lore research, a design document with ASCII floor plans for approval, the build passes, a screenshot review, and shipping. Two approval gates are built in so nothing reaches the game without sign-off.]]></description>
    </item>
    <item>
      <title>Dungeon Builder: The engine built its first dungeon. A ten-piece sewer network with an entrance run, three…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-8cf4e4ba844e</guid>
      <pubDate>Tue, 21 Jul 2026 12:36:48 -0500</pubDate>
      <description><![CDATA[The engine built its first dungeon. A ten-piece sewer network with an entrance run, three junction types, a door frame, and five sealed expansion stubs went from a JSON plan to a walkable Unity scene: every piece on the grid, every seam tight, the floor channel running unbroken through the tunnels. Re-running the build is a clean no-op, which is the property that will let dungeons grow in later passes without disturbing what is already built.]]></description>
    </item>
    <item>
      <title>Build Infrastructure: Retired one of the legacy build farm machines and moved its player-report jobs to another…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-9ec3f0656df4</guid>
      <pubDate>Tue, 21 Jul 2026 08:21:51 -0500</pubDate>
      <description><![CDATA[Retired one of the legacy build farm machines and moved its player-report jobs to another build agent. Their first runs on the new agent hung: the jobs connect to the game database over SSH, the key file came out of source control with loose file permissions, and SSH rejected it and sat waiting on a password prompt that a build agent can never answer.]]></description>
    </item>
    <item>
      <title>Build Infrastructure: The report jobs now tighten the key file permissions before connecting and carry a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-7699ee9bbc51</guid>
      <pubDate>Tue, 21 Jul 2026 08:22:36 -0500</pubDate>
      <description><![CDATA[The report jobs now tighten the key file permissions before connecting and carry a one-hour timeout, so a stuck run cancels itself instead of parking a build agent all day.]]></description>
    </item>
    <item>
      <title>Build Infrastructure: The permissions fix alone was not enough: the report job fires a dozen SSH connections at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-aa4b29f58ea4</guid>
      <pubDate>Tue, 21 Jul 2026 09:29:24 -0500</pubDate>
      <description><![CDATA[The permissions fix alone was not enough: the report job fires a dozen SSH connections at the database box in the same instant, and the new agent is fast enough that the server's connection throttle dropped a couple every run. Split the job into two waves of six connections each; the reports built green end to end with the full set of files published.]]></description>
    </item>
    <item>
      <title>Build Infrastructure: Moved the rest of the retired build machine's jobs to the remaining build agents: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-82baa1126008</guid>
      <pubDate>Tue, 21 Jul 2026 09:54:26 -0500</pubDate>
      <description><![CDATA[Moved the rest of the retired build machine's jobs to the remaining build agents: the per-commit game client checks, server tools, the backend deploy packager, and the analytics jobs. The old localization jobs stay retired with the machine. First runs are re-syncing their working copies, which takes a few hours each; the backlog that piled up while the jobs had no machine is already draining.]]></description>
    </item>
    <item>
      <title>Build Infrastructure: One more difference between the retired build machine and its replacement surfaced in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-72796bb9722c</guid>
      <pubDate>Tue, 21 Jul 2026 13:46:17 -0500</pubDate>
      <description><![CDATA[One more difference between the retired build machine and its replacement surfaced in the report jobs: the new agent's file-copy tool speaks a newer protocol that two of the older game servers cannot follow, so reports generated but never made it back. The affected jobs now fall back to the older copy protocol. All three report flavors (live, QA, dev) now run green end to end.]]></description>
    </item>
    <item>
      <title>Combat: Wrote a full design doc for a Chaos Magic rework after a deep dive into the skill trees…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-f1d8cd507391</guid>
      <pubDate>Tue, 21 Jul 2026 08:29:32 -0500</pubDate>
      <description><![CDATA[Wrote a full design doc for a <b>Chaos Magic</b> rework after a deep dive into the skill trees and the Obsidian lore. The plan makes the school's signature nuke resistable for the first time, lets every Chaos spell work from trainer level instead of unlocking deep at grandmaster, and adds three new passives so Chaos matches the passive depth of Fire and Death.]]></description>
    </item>
    <item>
      <title>Combat: The rework proposal gives Chaos a deck-warfare identity with spells that discard and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-4d981205a2e1</guid>
      <pubDate>Tue, 21 Jul 2026 08:29:40 -0500</pubDate>
      <description><![CDATA[The rework proposal gives Chaos a deck-warfare identity with spells that discard and redraw glyphs, a grandmaster transformation capstone, and two new glyph combos. On the world side it proposes Obsidian artifacts that carry a visible tradeoff, the four Cabalist town sieges that never shipped, shardfall storm events on the astrology clock, and a Destiny Pool scrying basin that forecasts where the Cabalists strike next.]]></description>
    </item>
    <item>
      <title>Combat: Added the Chaos rework to the roadmap as a new epic with a phased plan: the balance patch…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-adda2c2a5b48</guid>
      <pubDate>Tue, 21 Jul 2026 08:29:40 -0500</pubDate>
      <description><![CDATA[Added the Chaos rework to the roadmap as a new epic with a phased plan: the balance patch first, the new spells second, the world content third. The public roadmap page picked up the entry too.]]></description>
    </item>
    <item>
      <title>Combat: Caught a balance-audit bug while double-checking the Chaos numbers: the tool added up…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-77838ea4a94d</guid>
      <pubDate>Tue, 21 Jul 2026 08:48:21 -0500</pubDate>
      <description><![CDATA[Caught a balance-audit bug while double-checking the Chaos numbers: the tool added up every outcome of Chaos Bolt's random elemental roll, but the game only picks one per cast. Modeled correctly the spell lands near the middle of the pack instead of far above it, so the damage cut drafted this morning is withdrawn and the audit tool goes in for a fix (#1050).]]></description>
    </item>
    <item>
      <title>Server: Fixed the red chat error Server: Unknown operation code 4200430430 that appeared twice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-04e4c5951476</guid>
      <pubDate>Tue, 21 Jul 2026 11:07:01 -0500</pubDate>
      <description><![CDATA[Fixed the red chat error <code>Server: Unknown operation code 4200430430</code> that appeared twice after every scene load on chaos build 48 (player report #1055). The new global deco list request was never wired into the scene server operation router, so the server rejected it as unknown; the GM Global Deco window was dead for the same reason. Verify task #1057.]]></description>
    </item>
    <item>
      <title>Build: New gate check-rcv-dispatch.ps1 in the chaos-release preflights and the nightly portwire…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-c6869ca0e284</guid>
      <pubDate>Tue, 21 Jul 2026 11:07:02 -0500</pubDate>
      <description><![CDATA[New gate <code>check-rcv-dispatch.ps1</code> in the chaos-release preflights and the nightly portwire gate: fails when a generated request dispatcher has no call site in hand-written server code. That exact miss compiles clean and only surfaces as red error text in game.]]></description>
    </item>
    <item>
      <title>Itemization: Bone armor stopped calling itself leather. The tooltip material line read "Leather Light…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-d40a41105c89</guid>
      <pubDate>Tue, 21 Jul 2026 13:52:16 -0500</pubDate>
      <description><![CDATA[Bone armor stopped calling itself leather. The tooltip material line read "Leather Light Armor (Head)" on every bone piece, including the Obsidian Bone set added yesterday; it now reads "Bone". The armor still behaves as light armor with the same crafting station, masterwork options and set bonus (#1063)]]></description>
    </item>
    <item>
      <title>Economy: Vendor sale mail now lists what was on the item: the bill of exchange shows one line per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-d6a9c9beeebe</guid>
      <pubDate>Tue, 21 Jul 2026 18:26:33 -0500</pubDate>
      <description><![CDATA[Vendor sale mail now lists what was on the item: the bill of exchange shows one line per enchantment and masterwork under the item name, with failed attempts collapsed to a count line. Applies to old sale mails already in mailboxes too, since the full item snapshot was always stored with the mail.]]></description>
    </item>
    <item>
      <title>Economy: Sold sheet music and player-written books are now named by their actual title in the sale…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-fbef9d2a276e</guid>
      <pubDate>Tue, 21 Jul 2026 18:26:33 -0500</pubDate>
      <description><![CDATA[Sold sheet music and player-written books are now named by their actual title in the sale mail subject, letter, and chat notice. The server looks up the title at sale time and stamps it into new sale mails; older mails keep the generic wording.]]></description>
    </item>
    <item>
      <title>Farming: Second round on the mega-farm agriculture bug after a tester failed verification on a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-e651061afd6a</guid>
      <pubDate>Tue, 21 Jul 2026 19:29:31 -0500</pubDate>
      <description><![CDATA[Second round on the mega-farm agriculture bug after a tester failed verification on a 41,277 spot farm. The client capped tracked lot objects at 20,000 and the first overflow corrupted every later plant update in the scene, so watering stopped showing at about 23,000 planted spots and a relog showed nothing watered. The cap is gone: the tracking table now grows as needed and an overflow can no longer corrupt anything. 10 new tests pin the bookkeeping.]]></description>
    </item>
    <item>
      <title>Farming: Also fixed in the same pass: the second watering sweep was dropped client-side before it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-28440c37d457</guid>
      <pubDate>Tue, 21 Jul 2026 19:29:40 -0500</pubDate>
      <description><![CDATA[Also fixed in the same pass: the second watering sweep was dropped client-side before it was even sent for any plant still awaiting fresh server data, plant data reloads still ran one at a time with a timeout bug that re-issued duplicate requests, and an oversized watering batch could hang the rest of the pass. Reloads now run nearest-first and pause while the player acts, and batches split below the message size limit.]]></description>
    </item>
    <item>
      <title>Farming: Server side of the same bug: watering silently skipped planters briefly locked by growth…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-c4e50f5a1062</guid>
      <pubDate>Tue, 21 Jul 2026 19:29:40 -0500</pubDate>
      <description><![CDATA[Server side of the same bug: watering silently skipped planters briefly locked by growth updates, which is why a random subset showed watered after a restart, and one mid-batch save error dropped every remaining planter. The lock now retries and logs, and each save is isolated so the rest of the batch persists.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-21</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-21-images</guid>
      <pubDate>Tue, 21 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/dungeon-builder-first-shell-interior.png" data-full="https://catnipgames.net/blog/images/dungeon-builder-first-shell-interior.png"
               data-cap="Inside the dungeon builder's first output: a sewer tunnel assembled by the engine from a JSON plan. The floor channel runs unbroken across three separate kit pieces."
               alt="Interior view down a round stone sewer tunnel with a water channel in the floor, assembled from modular kit pieces" loading="lazy">
          <span class="cap">First engine-built tunnel, from inside</span>
        
        
          <img src="https://catnipgames.net/blog/images/sewer-to-dungeon-adapter.png" data-full="https://catnipgames.net/blog/images/sewer-to-dungeon-adapter.png"
               data-cap="One of the theme adapter pieces the dungeon builder catalogued: the round sewer tunnel keeps flowing straight through, and a squared dungeon doorway is built into its side wall."
               alt="Kit piece render: a round stone sewer tunnel with a water channel, carrying a squared dungeon-style doorway on its side wall" loading="lazy">
          <span class="cap">Sewer-to-dungeon adapter piece</span>
        
        
          <img src="https://catnipgames.net/blog/images/scenes-region-names.png" data-full="https://catnipgames.net/blog/images/scenes-region-names.png"
               data-cap="The scenes portal list after the region-name pass: every zone shows its real region (Perennial Coast, Longfall, Regalis and Midmaer) from the designer-authored list, and the region filter uses the same names."
               alt="Scene analysis list view with a Region column reading Perennial Coast, Longfall, and Regalis and Midmaer instead of internal region codes" loading="lazy">
          <span class="cap">Real region names on the scenes portal</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-generic-report-window.png" data-full="https://catnipgames.net/blog/images/uitk-generic-report-window.png"
               data-cap="The stuck spot report window rebuilt on the new UI: reason dropdown, comment box with a live character counter, and a Submit button that stays greyed out until the form is complete."
               alt="Dark game window titled Report Stuck Spot with a reason dropdown, a comment box, a 0 / 500 counter, and a greyed-out Submit button" loading="lazy">
          <span class="cap">Report window on the new UI</span>
        
        
          <img src="https://catnipgames.net/blog/images/dungeon-builder-dressed-tunnel.png" data-full="https://catnipgames.net/blog/images/dungeon-builder-dressed-tunnel.png"
               data-cap="The same engine-built sewer after the dressing passes: a wall torch mounted at the height and tilt mined from the shipped sewers, water in the floor gutter, and a puddle catching the light down the walkway. Every prop came from the dungeon's JSON plan."
               alt="Torch-lit stone sewer tunnel interior with warm light on the wall, a water channel in the floor, and a puddle reflecting light in the distance" loading="lazy">
          <span class="cap">Dressed by the engine: torchlight in the test sewer</span>
        
        
          <img src="https://catnipgames.net/blog/images/dungeon-builder-deco-onfloor.png" data-full="https://catnipgames.net/blog/images/dungeon-builder-deco-onfloor.png"
               data-cap="After the floor-snap fix: the dungeon builder's crate and barrel sit on the tunnel floor inside the bore, flanking the water channel, instead of floating in the void. Floor props now snap to the real floor and a prop placed past the wall fails the build."
               alt="Torch-lit stone sewer tunnel with a wooden barrel and crate resting on the floor either side of a central water channel" loading="lazy">
          <span class="cap">Props seated on the floor after the fix</span>
        
        
          <img src="https://catnipgames.net/blog/images/dungeon-builder-barred-gate.png" data-full="https://catnipgames.net/blog/images/dungeon-builder-barred-gate.png"
               data-cap="The dungeon builder's sewer gate after the fix: a barred grate sized to the round tunnel bore, set into the opening with a wall switch to raise it and the water channel running through underneath, instead of a square dungeon gatehouse cutting through the walls."
               alt="Barred iron gate set into a round stone sewer tunnel opening, with a small wall switch on the left and a water channel running through beneath it" loading="lazy">
          <span class="cap">Sewer gate that fits the bore, after the fix</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-20</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-headlines</guid>
      <pubDate>Mon, 20 Jul 2026 22:24:11 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Hilt Fortress lost its 2019 two-door workaround</b>: one entrance door again at all three entrances, with a choice window only while the Vermillion Lens quest is active (#987)</li>
        <li><b>UI rebuild batch 3 complete in one day</b>: Titles, Blocked Players, Players in Scene, the player note editor, and all four invitation prompts now run on the new UI system, on shared window parts extracted from the Social window</li>
        <li><b>Lua addons</b> gained two long-requested powers in one day: reading your current target (name, health, focus, buffs, debuffs, stats; other players' details stay private) and sharing saved variables with custom NPC conversations, both wishlist requests open since 2024 (#745)</li>
        <li><b>The Options window now runs on the new UI framework</b>: all 7 tabs and about 150 settings rebuilt, a smooth keybinding editor, and a first-ever UI Scale slider. The largest single window of the UI rebuild so far.</li>
        <li><b>Ten player-filed bugs swept today in three passes</b>: eight silent shrine caretakers voiced (11 more never-voiced NPCs caught by the same fix), skeleton archers recast to an undead rasp, Atolls of Atos fishing flipped to salt water, the invisible Well of Aldur wisp narrowed to runtime state, the shattered Simple Mantle Clock repaired, the Sequanna Colossus elevator no longer vanishing at certain camera angles, the Air Elemental summon visible again, the Faerie Belt shrinking its wearer again, Crystal Shield no longer buffing invisible still-loading players, and the Jotungrund Frost Giant trading his game-show voice for a deep boom, live without a build (#891, #904, #902, #900, #817, #744, #743, #871, #822, #825)</li>
        <li>The <b>scenes portal</b> went from 34 to all 291 zones in one day of designer-driven iteration: full NPC, quest, creature, chest, merchant, and spawner detail per scene, drill-down tables with loot values, a sortable list view, and a nightly build task to keep it fresh.</li>
        <li><b>A month of team content caught up in one pass</b>: 124 changelists brought in, fixing the broken store pet decorations (white cubes on lots) and adding garden bowers, new candle colors, and dozens of world fixes.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed 8 wishlist ideas and 1 bug report from player forum threads…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-d422e62794d2</guid>
      <pubDate>Mon, 20 Jul 2026 03:26:26 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed 8 wishlist ideas and 1 bug report from player forum threads (map art style, building snap-to-alignment, launcher player count, PvP battlefield mode, dynamic PoT maps, party loot-roll opt-out, more Obsidian crafting recipes, and a Lua addon scripting stutter).]]></description>
    </item>
    <item>
      <title>Community: The catnipgames.net front page now shows a live player counter for the Chaos shard: how…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-74d77dcf396a</guid>
      <pubDate>Mon, 20 Jul 2026 09:36:47 -0500</pubDate>
      <description><![CDATA[The catnipgames.net front page now shows a live player counter for the Chaos shard: how many players are logged in and in game, refreshed every minute (#908). Test bots are not counted. If the number stops updating the badge hides itself.]]></description>
    </item>
    <item>
      <title>UI: Fixed the vendor search slowdown reported by Saturday night's crash uploads: after…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-56acb10208d9</guid>
      <pubDate>Mon, 20 Jul 2026 07:26:35 -0500</pubDate>
      <description><![CDATA[Fixed the vendor search slowdown reported by Saturday night's crash uploads: after hovering listings to load their details, the game could sink below 10 fps and never recover, forcing a quit (#915). Search rows now keep a stable identity when their full details arrive, a listing that appears twice in the results can no longer break the list, and the list rebuild recovers from a bad pass instead of repeating it every frame. Regression tests added; verify task #916.]]></description>
    </item>
    <item>
      <title>UI: Tracked down why interface text kept getting its bottom sliced off in the rebuilt…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-625ad0c03911</guid>
      <pubDate>Mon, 20 Jul 2026 07:28:11 -0500</pubDate>
      <description><![CDATA[Tracked down why interface text kept getting its bottom sliced off in the rebuilt windows. The interface font needs 19.2 pixels per line, more than the engine's stock font, and each window had its own hand-picked row height copied from the window before it, so a too-short value kept spreading. Row heights now come from one shared place, long names truncate with an ellipsis instead of being cut mid-letter, and a new test fails the build if a height drops below what the font actually measures.]]></description>
    </item>
    <item>
      <title>UI: Picked the next five windows for the UI rebuild and wrote the batch plan: the titles…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-747182e0341e</guid>
      <pubDate>Mon, 20 Jul 2026 07:39:20 -0500</pubDate>
      <description><![CDATA[Picked the next five windows for the UI rebuild and wrote the batch plan: the titles list, the players-in-scene list, the blocked players list, the four invitation prompts (party, guild, guild war, duel), and the social note editor. The heavier social windows (mail, party HUD, emotes) wait until the drag and drop foundation exists.]]></description>
    </item>
    <item>
      <title>UI: Extracted the Social window's titlebar, drag, resize, pin, and position memory into a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-f590b30db0ab</guid>
      <pubDate>Mon, 20 Jul 2026 07:39:20 -0500</pubDate>
      <description><![CDATA[Extracted the Social window's titlebar, drag, resize, pin, and position memory into a shared window chrome with reusable window and bridge bases, so each coming conversion starts from common parts instead of a copy. The Social window now runs on the shared chrome with identical behavior, guarded by new structure tests.]]></description>
    </item>
    <item>
      <title>UI: Started on UI size options. There has never been a way to change how big the interface…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-028e2127625b</guid>
      <pubDate>Mon, 20 Jul 2026 07:46:47 -0500</pubDate>
      <description><![CDATA[Started on UI size options. There has never been a way to change how big the interface is, and with the interface rebuild underway now is the time to settle it. The groundwork landed: one setting drives both the old and new interface systems together, so the heads-up display and the rebuilt windows stay the same size as it changes rather than drifting apart. The slider that exposes it comes next, followed by a separate text-size setting for readability.]]></description>
    </item>
    <item>
      <title>UI: Converted the Titles window to the new UI system, the first of the batch-3 five. Same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-422ddb1fb2db</guid>
      <pubDate>Mon, 20 Jul 2026 09:39:51 -0500</pubDate>
      <description><![CDATA[Converted the Titles window to the new UI system, the first of the batch-3 five. Same features (set or clear your worn title, bold active title, gold founder titles, sortable list, double-click to wear), now in a movable resizable themed window that remembers its position. The Social window's list component was generalized so the coming conversions reuse it. Verify task #923.]]></description>
    </item>
    <item>
      <title>UI: Two more windows converted to the new UI system: the Blocked Players window (block by…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-59a035d1caee</guid>
      <pubDate>Mon, 20 Jul 2026 09:39:51 -0500</pubDate>
      <description><![CDATA[Two more windows converted to the new UI system: the Blocked Players window (block by typed name, multi-select unblock, online players sort first, right-click player menu) and the player note editor (per-player private notes, save-button and character-counter behavior unchanged). Verify tasks #927 and #926.]]></description>
    </item>
    <item>
      <title>UI: The Players in Scene window joined the new UI system: same name colors and ordering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-4cebfe61a8b8</guid>
      <pubDate>Mon, 20 Jul 2026 09:39:51 -0500</pubDate>
      <description><![CDATA[The Players in Scene window joined the new UI system: same name colors and ordering (party, admin, guild, PvP, friend, everyone else, unknown PvP players as a gray question mark until targeted), right-click player menu, and the PvP-scene swap to the stats windows. Verify task #928.]]></description>
    </item>
    <item>
      <title>UI: The four invitation prompts (party, guild, guild war, duel) moved to the new UI system by…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-6e21e1f580c2</guid>
      <pubDate>Mon, 20 Jul 2026 09:52:19 -0500</pubDate>
      <description><![CDATA[The four invitation prompts (party, guild, guild war, duel) moved to the new UI system by rebuilding their one shared base, with the queue behavior and the PvP-flag warning intact. That completes all five pieces of UI rebuild batch 3 in a single day. Verify task #930.]]></description>
    </item>
    <item>
      <title>UI: Rebuilt /fps as a UI Toolkit Performance window: average fps, the fps during the slowest…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-8d7c6cd988e7</guid>
      <pubDate>Mon, 20 Jul 2026 10:04:18 -0500</pubDate>
      <description><![CDATA[Rebuilt <b>/fps</b> as a UI Toolkit Performance window: average fps, the fps during the slowest 5% of the last 30 seconds, and a 15 second frame-time bar graph with 16.7ms and 33.3ms gridlines. The old plain text counter is retired.]]></description>
    </item>
    <item>
      <title>UI: The graph recolors bars at the 60 and 30 fps thresholds, follows the active UI skin, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-1f264e106fe7</guid>
      <pubDate>Mon, 20 Jul 2026 10:05:16 -0500</pubDate>
      <description><![CDATA[The graph recolors bars at the 60 and 30 fps thresholds, follows the active UI skin, and the window remembers where you drag it. New frame-time sampler underneath with 21 new EditMode tests.]]></description>
    </item>
    <item>
      <title>UI: Started moving the Options window to the new UI framework: built the complete replacement…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-30caed32d4fd</guid>
      <pubDate>Mon, 20 Jul 2026 12:08:48 -0500</pubDate>
      <description><![CDATA[Started moving the Options window to the new UI framework: built the complete replacement window (7 tabs, about 150 settings, and the full keybinding list) plus 31 automated tests. Not player-visible yet; the switch-over comes next.]]></description>
    </item>
    <item>
      <title>UI: The Options window (the Esc menu) now runs on the new UI framework: all 7 tabs, about 150…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-df1956b662cc</guid>
      <pubDate>Mon, 20 Jul 2026 12:26:23 -0500</pubDate>
      <description><![CDATA[The Options window (the Esc menu) now runs on the new UI framework: all 7 tabs, about 150 settings, a smooth-scrolling keybinding editor for about 180 actions, and a new UI Scale slider (75 to 150 percent) that resizes the whole interface. The window is movable and resizable and remembers its position. The old 80,000-line options screen and six of its helper components were retired; settings still apply instantly and every entry point (Esc, login screen) works as before. Verify tasks #955 and #956.]]></description>
    </item>
    <item>
      <title>UI: Fixed dropdown text getting its bottom sliced off across the rebuilt windows (reported on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-b7aec3998558</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:52 -0500</pubDate>
      <description><![CDATA[Fixed dropdown text getting its bottom sliced off across the rebuilt windows (reported on the new Options window's theme pickers). The shared theme removed the stock vertical padding from text boxes months ago but never did the same for dropdowns, so every fixed-height dropdown clipped its value. One theme change heals them all, the Options window now uses minimum heights everywhere text lives, and a new test locks the rule in for both control kinds.]]></description>
    </item>
    <item>
      <title>UI: Fixed checkboxes vanishing under the mouse in the rebuilt windows (reported on the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-b2c7c14d6959</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:52 -0500</pubDate>
      <description><![CDATA[Fixed checkboxes vanishing under the mouse in the rebuilt windows (reported on the new Options window). The engine's stock theme has its own hover and click rules for checkbox art that quietly override ours, so pointing at a toggle blanked its circle. The shared theme now restates the art for every state, and a new test keeps it that way.]]></description>
    </item>
    <item>
      <title>UI: Swept the rest of the rebuilt-window controls for the same stock-theme override problem…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-f8185a62a381</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:52 -0500</pubDate>
      <description><![CDATA[Swept the rest of the rebuilt-window controls for the same stock-theme override problem behind the vanishing checkboxes: dropdown plates, text boxes, and slider handles all had engine hover rules waiting to repaint them light. All restated in the shared theme with test coverage, ahead of anyone hitting them.]]></description>
    </item>
    <item>
      <title>UI: Fixed the backgammon window breaking apart at its smallest size (tracker #876). Each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-46690127f73a</guid>
      <pubDate>Mon, 20 Jul 2026 14:44:43 -0500</pubDate>
      <description><![CDATA[Fixed the backgammon window breaking apart at its smallest size (tracker #876). Each tavern game now carries its own minimum window size: backgammon stops at 840x600, the size that still holds its full board, bar, and bear-off trays, while chess and checkers keep their smaller 640x520 floor. The board area also clips anything that would poke outside the frame. Commit 7a58611ec7.]]></description>
    </item>
    <item>
      <title>UI: Raised the vendor listings window minimum width so the Location column and its header…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-9cd6c625df06</guid>
      <pubDate>Mon, 20 Jul 2026 19:37:01 -0500</pubDate>
      <description><![CDATA[Raised the vendor listings window minimum width so the Location column and its header clear the scrollbar with a real margin at the smallest size (tracker #471, following up the earlier column-overflow fix).]]></description>
    </item>
    <item>
      <title>UI: The faint white square in the bottom right of the Oracle window (tracker #535) was the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-23408ed16865</guid>
      <pubDate>Mon, 20 Jul 2026 19:49:28 -0500</pubDate>
      <description><![CDATA[The faint white square in the bottom right of the Oracle window (tracker #535) was the window resize grip. It now sits nearly invisible until hovered, where it brightens to show the drag-to-resize corner. Applies to all the new-style windows that share the grip.]]></description>
    </item>
    <item>
      <title>UI: Fixed the bank window opening with a cut-off item list (tracker #464). The list viewport…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-66960d1d10c0</guid>
      <pubDate>Mon, 20 Jul 2026 21:16:19 -0500</pubDate>
      <description><![CDATA[Fixed the bank window opening with a cut-off item list (tracker #464). The list viewport now tracks the window size continuously, so a bank opened remotely through a Bank Access Device fills the dialog on the first frame instead of after a manual resize. A new layout test guards the prefab wiring.]]></description>
    </item>
    <item>
      <title>Client: Morning sweep of the overnight crash uploads and boot logs: the title-screen boot freeze…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-dae53ab0f2f1</guid>
      <pubDate>Mon, 20 Jul 2026 07:26:43 -0500</pubDate>
      <description><![CDATA[Morning sweep of the overnight crash uploads and boot logs: the title-screen boot freeze fix and the Linux startup crash fix both shipped in chaos build 44 today. Boot completions over the prior 36 hours were 83 of 108 starts on the old build; the next sweep checks build 44's rate.]]></description>
    </item>
    <item>
      <title>Client: Ran the full editor test suite over the UI rebuild groundwork: all new window-chrome and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2a485f41e5fc</guid>
      <pubDate>Mon, 20 Jul 2026 09:03:36 -0500</pubDate>
      <description><![CDATA[Ran the full editor test suite over the UI rebuild groundwork: all new window-chrome and social-window guards pass. Fixed a stale guard that still read the old tester fly-mode file after that code moved, and filed the one remaining failure (a compass options label missing its translation record) as #921.]]></description>
    </item>
    <item>
      <title>Client: Fixed the rebuilt UI Toolkit windows going dead after their first close: Social, Players…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-aaea43a55838</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:27 -0500</pubDate>
      <description><![CDATA[Fixed the rebuilt UI Toolkit windows going dead after their first close: Social, Players in Scene, Titles, Blocked Players, the note editor, invitation prompts, and the /fps window all opened once per session and then refused to appear again. The window contents were discarded when hidden and never rebuilt on reopen. Reproduced in the live chaos client, fixed in the shared window layer so every current and future converted window inherits the repair, and pinned by new guard tests.]]></description>
    </item>
    <item>
      <title>Lighting: Investigated the "Frosted Glass Lamps emit very little light" report (#646) with measured…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-475e5b8fa58b</guid>
      <pubDate>Mon, 20 Jul 2026 08:52:33 -0500</pubDate>
      <description><![CDATA[Investigated the &quot;Frosted Glass Lamps emit very little light&quot; report (#646) with measured editor renders and a check of the shipped content packs: the lamp lighting chain is healthy at every layer, and the dark-lamp look matched the content packaging bug already fixed in build 35 (#661; testers confirmed lamps on chaos in #719). Closed with the evidence attached.]]></description>
    </item>
    <item>
      <title>Lighting: Added LampLightIlluminationTests : an editor render test that fails if a lamp-strength…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-1b404a86ad59</guid>
      <pubDate>Mon, 20 Jul 2026 08:52:34 -0500</pubDate>
      <description><![CDATA[Added <b>LampLightIlluminationTests</b>: an editor render test that fails if a lamp-strength point light stops lighting a surface through the deferred pipeline, if the lamp prefab light data drifts, or if the custom deferred lighting shader diverges from Unity's builtin result.]]></description>
    </item>
    <item>
      <title>Dev Portal: The character viewer can now send your own game client somewhere with one click. Each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-9b413af2545a</guid>
      <pubDate>Mon, 20 Jul 2026 07:37:49 -0500</pubDate>
      <description><![CDATA[The character viewer can now send your own game client somewhere with one click. Each town on a character's page has a Go there button that loads that scene in your running client. It works for any game admin, with no special launch options.]]></description>
    </item>
    <item>
      <title>Dev Portal: Added a countdown to the portal front page: days until DragonCon (September 3) and until…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c98da4e28aa8</guid>
      <pubDate>Mon, 20 Jul 2026 07:39:15 -0500</pubDate>
      <description><![CDATA[Added a countdown to the portal front page: days until DragonCon (September 3) and until the test servers open to everyone (September 8). Tiles switch to Today on the day and drop off once a date has passed.]]></description>
    </item>
    <item>
      <title>Dev Portal: Scene Analysis pages now list every NPC in a scene: a filterable roster with merchant…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-da4ea598f76c</guid>
      <pubDate>Mon, 20 Jul 2026 12:20:37 -0500</pubDate>
      <description><![CDATA[Scene Analysis pages now list every NPC in a scene: a filterable roster with merchant, bank, trainer, and vendor role tags, level, spawn count, quest-giver badges, and each trainer's teachable skill list. Kingsport shows 55 NPCs; the 34 baked scenes carry 483 NPC records total.]]></description>
    </item>
    <item>
      <title>Dev Portal: Added a Quests panel per scene: quest cards with player-facing titles, steps completable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-308493b333c2</guid>
      <pubDate>Mon, 20 Jul 2026 12:20:37 -0500</pubDate>
      <description><![CDATA[Added a Quests panel per scene: quest cards with player-facing titles, steps completable in that scene versus the full quest, the NPCs involved, prerequisite chains, and the full journal text of every step. Quests reachable only through shared NPCs like town criers and the Oracle fold away separately.]]></description>
    </item>
    <item>
      <title>Dev Portal: Added a Creatures panel (hostile and ambient spawns with counts, levels, and boss tags)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-26ecc972f26e</guid>
      <pubDate>Mon, 20 Jul 2026 12:20:38 -0500</pubDate>
      <description><![CDATA[Added a Creatures panel (hostile and ambient spawns with counts, levels, and boss tags) plus per-type resource node breakdowns. All 34 baked scenes were republished with the richer data, and 21 new editor tests cover the extraction.]]></description>
    </item>
    <item>
      <title>Dev Portal: Owner feedback on the new scene pages: NPCs whose quest actions live in shared include…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-b95dd751a89f</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:27 -0500</pubDate>
      <description><![CDATA[Owner feedback on the new scene pages: NPCs whose quest actions live in shared include files (like the Helpful Automaton's guides) showed no quest involvement. Quest credit now follows each conversation's nested includes, which grew Kingsport's quest list from 9 to 16 and its quest-giver count from 8 to 10.]]></description>
    </item>
    <item>
      <title>Dev Portal: Scene pages also gained a Discoveries table (each point of interest with how it unlocks…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-6edb9ecc9b99</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:53 -0500</pubDate>
      <description><![CDATA[Scene pages also gained a Discoveries table (each point of interest with how it unlocks: by visiting, only during quest stages, or both) and a NavMesh tile showing the baked navmesh size and the date it was last regenerated.]]></description>
    </item>
    <item>
      <title>Dev Portal: The scenes portal now covers all 291 scenes, up from 34: every zone baked with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-8fd47ff54c73</guid>
      <pubDate>Mon, 20 Jul 2026 15:41:24 -0500</pubDate>
      <description><![CDATA[The scenes portal now covers all 291 scenes, up from 34: every zone baked with thumbnails, entry shots, NPC rosters, quest detail, creatures, chests, discoveries, and navmesh data. Portal-wide that is 2,215 NPCs, 3,365 creature entries, and 1,339 quest entries.]]></description>
    </item>
    <item>
      <title>Dev Portal: Designer feedback pass on the scene pages: the NPC and Creature tables split into Generic…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-e7316cc104a6</guid>
      <pubDate>Mon, 20 Jul 2026 15:41:24 -0500</pubDate>
      <description><![CDATA[Designer feedback pass on the scene pages: the NPC and Creature tables split into Generic and personal name columns ("Refugee / Abigail"), and the NPC versus creature call now follows the game's own talk rule, so hostile mobs with authored conversations (Necropolis spirits, skeleton fighters) list as creatures with their display names kept.]]></description>
    </item>
    <item>
      <title>Dev Portal: The Spawners, Chests, and Merchants tiles now open drill-down tables: every lootable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-15fe36729ca5</guid>
      <pubDate>Mon, 20 Jul 2026 15:41:24 -0500</pubDate>
      <description><![CDATA[The Spawners, Chests, and Merchants tiles now open drill-down tables: every lootable container with its loot bundle, approximate gold value, position, and prefab; every spawner with its mob, level, kind, and faction; every merchant with its sale inventory and what it buys. Chests broke down by container type along the way, and Kingsport's mystery 4 crafting stations turned out to be 2 Alchemy, 1 Butchery, 1 Cooking.]]></description>
    </item>
    <item>
      <title>Dev Portal: The scene grid gained a Cards or List toggle: list rows show a thumbnail plus sortable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-17031149a450</guid>
      <pubDate>Mon, 20 Jul 2026 15:41:24 -0500</pubDate>
      <description><![CDATA[The scene grid gained a Cards or List toggle: list rows show a thumbnail plus sortable columns for warnings, NPCs, creatures, spawners, median level, chests, resources, stations, quest givers, and live fps and load times. Numeric columns center per owner request.]]></description>
    </item>
    <item>
      <title>Dev Portal: New scene-analysis build task on the build server: bakes the portal data on the Windows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-0c216088b3b4</guid>
      <pubDate>Mon, 20 Jul 2026 15:41:25 -0500</pubDate>
      <description><![CDATA[New scene-analysis build task on the build server: bakes the portal data on the Windows agent and publishes it, data-only by default with an optional screenshot refresh. A guard refuses to publish if the build tree is older than what the portal already serves, after a trial run from a stale tree nearly rolled the pages back.]]></description>
    </item>
    <item>
      <title>Dev Portal: Character viewer: fixed player towns showing the wrong name. Town identity lives in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c9f1a16e183d</guid>
      <pubDate>Mon, 20 Jul 2026 17:41:48 -0500</pubDate>
      <description><![CDATA[Character viewer: fixed player towns showing the wrong name. Town identity lives in the scene scenario, not the shared template scene, and the name map only knew templates, so every town on a template rendered as one example town (a governor of Isle of Apples showed as governor of Ocllo; a character logged out in Anseldale showed Magna Planitia). The map now carries all 524 town and scenario entries under their full scene ids, and an unknown town falls back to its own name instead of a sibling's.]]></description>
    </item>
    <item>
      <title>Dev Portal: Character viewer: the Towns tab Scene column now shows the backing scene asset name next…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-d44e10e773eb</guid>
      <pubDate>Mon, 20 Jul 2026 17:41:49 -0500</pubDate>
      <description><![CDATA[Character viewer: the Towns tab Scene column now shows the backing scene asset name next to the town name, and the Overview panel gained a Region row. Vendor search location names pick up the same corrected data on its next refresh.]]></description>
    </item>
    <item>
      <title>Mounts: Gate levers now work while mounted (#878). Riders could already open doors and city gates…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-cda84c5098a3</guid>
      <pubDate>Mon, 20 Jul 2026 07:44:49 -0500</pubDate>
      <description><![CDATA[Gate levers now work while mounted (#878). Riders could already open doors and city gates from the saddle, but lever-operated gates like the Owl's Head north gate and the Castle Atos drawbridge still refused with a dismount message. Levers that drive a gate or drawbridge now respond while riding, the moving gate no longer knocks the rider off, and switches that do not drive a gate still require dismounting.]]></description>
    </item>
    <item>
      <title>Docs: Corrected the Unity test-runner notes: the MCP command line accepts a per-call timeout…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-a24871e300c9</guid>
      <pubDate>Mon, 20 Jul 2026 07:46:49 -0500</pubDate>
      <description><![CDATA[Corrected the Unity test-runner notes: the MCP command line accepts a per-call timeout option, so class-level test runs behind a fresh compile no longer lose their summary to the default 60 second limit.]]></description>
    </item>
    <item>
      <title>Docs: Wrote a five-page Player-Owned Towns deep dive for the team wiki: what a PoT actually is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c218d205d0ce</guid>
      <pubDate>Mon, 20 Jul 2026 08:32:58 -0500</pubDate>
      <description><![CDATA[Wrote a five-page Player-Owned Towns deep dive for the team wiki: what a PoT actually is (a scenario row layered on a shared template scene), the full size-tier table, the owner asset and server-report pipeline, how the server sets a town up, and step-by-step runbooks for changing a town's owner, size, or template today. Also put the two existing PoT ops runbooks on the wiki shelf.]]></description>
    </item>
    <item>
      <title>Docs: Wrote the plan for managing player-owned towns from the team portal with no client build…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-4c572276d5dd</guid>
      <pubDate>Mon, 20 Jul 2026 08:32:59 -0500</pubDate>
      <description><![CDATA[Wrote the plan for managing player-owned towns from the team portal with no client build: owner and size move into the game database as the runtime source, every change goes through an admin operation with an audit trail, and a new towns admin page fronts it. Template switching among already-shipped templates is a later, gated phase. Added the matching roadmap epic.]]></description>
    </item>
    <item>
      <title>Docs: The deep dive surfaced one real data bug: the client and server size tables disagree on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2230744afaa0</guid>
      <pubDate>Mon, 20 Jul 2026 08:33:00 -0500</pubDate>
      <description><![CDATA[The deep dive surfaced one real data bug: the client and server size tables disagree on the Devopolis tier's square footage (250,000 vs 166,800). Harmless today because live towns bake from the client table, but the plan pins it so the drift test starts green.]]></description>
    </item>
    <item>
      <title>Docs: Wrote up two test-runner traps from today: an unfiltered EditMode run pulls scene-loading…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-47610a0dac54</guid>
      <pubDate>Mon, 20 Jul 2026 14:28:46 -0500</pubDate>
      <description><![CDATA[Wrote up two test-runner traps from today: an unfiltered EditMode run pulls scene-loading fixtures and ran hours without finishing, and the async result callback does not survive a mid-run domain reload, which leaves a sentinel file claiming a long-dead run is still going. The runbook now carries the namespace filter to use, the ghost-run check, and the cancel recipe.]]></description>
    </item>
    <item>
      <title>Docs: Wrote up two traps that make a branch merge in the shared repo look like a hang rather…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-8236c76bd662</guid>
      <pubDate>Mon, 20 Jul 2026 21:33:43 -0500</pubDate>
      <description><![CDATA[Wrote up two traps that make a branch merge in the shared repo look like a hang rather than a stuck process: the Unity YAML merge helper waiting forever on a conflicted file, and the shared index being held by a parallel session. Both now have a diagnosis and a recipe in the operations docs.]]></description>
    </item>
    <item>
      <title>Lua Addons: Fixed the addon garbage collector interface after a forum report: collectgarbage("count")…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-ed429f0133f2</guid>
      <pubDate>Mon, 20 Jul 2026 07:47:45 -0500</pubDate>
      <description><![CDATA[Fixed the addon garbage collector interface after a forum report: <b>collectgarbage("count")</b> now returns memory use in kilobytes instead of nil, and a new <b>collectgarbage("step")</b> runs a time-budgeted incremental collection (default 3ms, capped at 50ms) so addons no longer need the full collect that froze a frame for 140-190ms. Unknown modes still return nil and addons still cannot disable collection.]]></description>
    </item>
    <item>
      <title>Lua Addons: Added a ShroudRealDeltaTime global for addon diagnostics: the existing ShroudDeltaTime is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-86aec0337ba8</guid>
      <pubDate>Mon, 20 Jul 2026 07:47:50 -0500</pubDate>
      <description><![CDATA[Added a <b>ShroudRealDeltaTime</b> global for addon diagnostics: the existing ShroudDeltaTime is clamped at 100ms by the engine, so long hitches all read the same; the new value reports the real frame duration. Also stopped rebuilding the ShroudServerTime string every frame; it now updates once per second.]]></description>
    </item>
    <item>
      <title>Lua Addons: Added a current-target API: 16 new functions report the targeted creature or player's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-23479b95edc4</guid>
      <pubDate>Mon, 20 Jul 2026 10:25:17 -0500</pubDate>
      <description><![CDATA[Added a current-target API: 16 new functions report the targeted creature or player's name, health, focus, buffs and debuffs, and stats, resolved the same way as the target frame. Fills a buff-monitor wishlist request open since 2024.]]></description>
    </item>
    <item>
      <title>Lua Addons: Kept fair-play limits in the new target API: another player's stats stay private apart…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-621319cc73c1</guid>
      <pubDate>Mon, 20 Jul 2026 10:25:26 -0500</pubDate>
      <description><![CDATA[Kept fair-play limits in the new target API: another player's stats stay private apart from health and focus, and creatures that hide their health hide it from addons too, with a new <b>ShroudIsTargetHealthHidden</b> flag so an addon can show a placeholder instead.]]></description>
    </item>
    <item>
      <title>Lua Addons: Buff lists from ShroudGetPlayerBuff , ShroudGetPetBuff , and the new ShroudGetTargetBuff…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-be72daeadc5d</guid>
      <pubDate>Mon, 20 Jul 2026 10:25:26 -0500</pubDate>
      <description><![CDATA[Buff lists from <b>ShroudGetPlayerBuff</b>, <b>ShroudGetPetBuff</b>, and the new <b>ShroudGetTargetBuff</b> now carry a rune id, a debuff flag, and a stack count. A new <b>ShroudLuaApiVersion</b> global lets addons detect the API level, and 9 new EditMode tests pin the rules.]]></description>
    </item>
    <item>
      <title>Lua Addons: Lua addons can now read and write the saved variables that custom NPC conversations keep…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-71783cccec42</guid>
      <pubDate>Mon, 20 Jul 2026 13:13:25 -0500</pubDate>
      <description><![CDATA[Lua addons can now read and write the saved variables that custom NPC conversations keep with their saveVariable and loadVariable script functions (#745, a forum request open since 2024). Four new functions (ShroudLoadInkVariable, ShroudSaveInkVariable, ShroudHasInkVariable, ShroudDeleteInkVariable) work on the same per-character store, so an addon can react to what a conversation saved and a conversation can read what an addon wrote.]]></description>
    </item>
    <item>
      <title>Lua Addons: Values cross the bridge in the exact string forms the conversation runtime parses back…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-6295a628115c</guid>
      <pubDate>Mon, 20 Jul 2026 13:13:25 -0500</pubDate>
      <description><![CDATA[Values cross the bridge in the exact string forms the conversation runtime parses back: whole numbers stay whole (42, never 42.0), booleans become 1 or 0. An EditMode suite pins the shared storage key format and the guards, so saves before character select fail cleanly and a saved empty string stays distinct from never saved.]]></description>
    </item>
    <item>
      <title>Localization: Numbers in translated clients now follow the selected game language instead of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2d2294c36a2d</guid>
      <pubDate>Mon, 20 Jul 2026 08:14:05 -0500</pubDate>
      <description><![CDATA[Numbers in translated clients now follow the selected game language instead of the Windows region format. A German client on English-region Windows showed 15,000 Punkte and now shows 15.000 Punkte; gold, experience, prices and quantities are covered everywhere a number lands in a sentence (Redmine #785, verify #920).]]></description>
    </item>
    <item>
      <title>Localization: Reworded three German templates that forced an unmodified name into a grammatically…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-af53d581572f</guid>
      <pubDate>Mon, 20 Jul 2026 08:14:17 -0500</pubDate>
      <description><![CDATA[Reworded three German templates that forced an unmodified name into a grammatically declined slot, including the landmark discovery message, which now reads Position auf Kompass und Karte markiert: followed by the place name. Regenerated the German client text files.]]></description>
    </item>
    <item>
      <title>Localization: Found during that rebuild: an automated regeneration of the localization source database…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-10c6cd47667a</guid>
      <pubDate>Mon, 20 Jul 2026 08:14:17 -0500</pubDate>
      <description><![CDATA[Found during that rebuild: an automated regeneration of the localization source database had dropped 18 hand-added records (Ultima mode options, compass toggle text), so the next text deploy for any language would revert those strings to English. Kept the affected file out of the commit and filed #919; an existing guard test already fails on the drift.]]></description>
    </item>
    <item>
      <title>Localization: Caught the nightly text generator dropping the 53 hand-registered Social and Theme Editor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-1e93c99108ca</guid>
      <pubDate>Mon, 20 Jul 2026 09:52:19 -0500</pubDate>
      <description><![CDATA[Caught the nightly text generator dropping the 53 hand-registered Social and Theme Editor translation records from the source database (the shipped language files were unaffected). Restored them and registered the new batch-3 window strings; noted on #919 so the generator fix covers this file too.]]></description>
    </item>
    <item>
      <title>Localization: Restored 105 dragon display-name records the automated localized-text regen dropped from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-84e33b3a303a</guid>
      <pubDate>Mon, 20 Jul 2026 10:23:33 -0500</pubDate>
      <description><![CDATA[Restored 105 dragon display-name records the automated localized-text regen dropped from the source db (the job ran from a checkout that predated the dragon totems) and rekeyed the Rise Shaft slot tooltip so translations pick up the new text. The regen-skew gotcha is documented in the localization notes.]]></description>
    </item>
    <item>
      <title>Localization: Filled all seven languages for the rebuilt Options window and the day's other new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-daa4ae207235</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:53 -0500</pubDate>
      <description><![CDATA[Filled all seven languages for the rebuilt Options window and the day's other new interface text: about 1,800 new lines per language translated, validated, and shipped into the client language files. Coverage stays at 99.4 to 99.8 percent everywhere. A handful of lines whose English source has broken formatting tags stay in English until the source text is fixed.]]></description>
    </item>
    <item>
      <title>Localization: The localization source db can no longer be stomped from the old build machine: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c1be5fd0ad97</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:53 -0500</pubDate>
      <description><![CDATA[The localization source db can no longer be stomped from the old build machine: the Perforce-to-git bridge now record-diffs every incoming change to the source files and restores any record a stale regeneration would delete, with an explicit override for intentional prunes. The dragon and UI window records it already lost this week are what prompted the guard.]]></description>
    </item>
    <item>
      <title>Localization: Localization source regeneration moved into the repo: the string extractors now run from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2c9545e74b8f</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:53 -0500</pubDate>
      <description><![CDATA[Localization source regeneration moved into the repo: the string extractors now run from the git tree (ported to Python 3, Perforce calls disabled) under the same deletion guard. The first run brought in a month of missing strings, 450 from code and 43 from assets (table games, rebuilt UI windows, tip jars, vendor search), minted ids into 9 assets, and marked 24 rewritten messages for retranslation.]]></description>
    </item>
    <item>
      <title>Localization: Fixed a long-standing extractor bug the Unity 6.5 reserialization exposed (the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-fb873f896879</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:53 -0500</pubDate>
      <description><![CDATA[Fixed a long-standing extractor bug the Unity 6.5 reserialization exposed (the single-quote scan lost its place on doubled escaped quotes) and merged a duplicated chat error string into one shared record.]]></description>
    </item>
    <item>
      <title>Maps: Regenerated the 25 scene maps added on July 16. They were captured before the terrain…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-fde6d91cadac</guid>
      <pubDate>Mon, 20 Jul 2026 09:39:52 -0500</pubDate>
      <description><![CDATA[Regenerated the 25 scene maps added on July 16. They were captured before the terrain data repair landed, so most of them had white untextured ground baked into the image. All 25 scenes were recaptured from the repaired terrain, every image reviewed, and the set re-accepted: 24 images changed, and East Vauban Foothills was already correct. The recomputed calibration matched the existing registry entries exactly.]]></description>
    </item>
    <item>
      <title>Maps: Added a recapture mode to the map capture batch: scenes can now be re-queued by name…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-d06e6630b642</guid>
      <pubDate>Mon, 20 Jul 2026 09:39:52 -0500</pubDate>
      <description><![CDATA[Added a recapture mode to the map capture batch: scenes can now be re-queued by name after their maps are accepted. The normal batch only targets scenes that have no map entry yet, so accepted maps could not be retaken before this.]]></description>
    </item>
    <item>
      <title>Gameplay: Party members can now skip item loot rolls while still receiving their gold share. Any…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-125f88655250</guid>
      <pubDate>Mon, 20 Jul 2026 09:39:52 -0500</pubDate>
      <description><![CDATA[Party members can now skip item loot rolls while still receiving their gold share. Any member can check the new <b>Skip loot rolls (keep gold share)</b> box in the Social window Party tab; while it is checked they are never entered in rolls and get no roll prompts. Requested on the official forum (tracker #911, verify task #925); rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Gameplay: Obsidian Forge expansion (player wishlist): a full Obsidian Chainmail set (5 pieces) with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-cf9b3c00f75a</guid>
      <pubDate>Mon, 20 Jul 2026 09:49:26 -0500</pubDate>
      <description><![CDATA[Obsidian Forge expansion (player wishlist): a full <b>Obsidian Chainmail</b> set (5 pieces) with two new forge materials, Coil of Obsidian Wire and Obsidian Binding. Dark undyeable look, magic resistance and chaos attunement per piece, 1 percent melee damage reflection carried by the wire, and a far lower fizzle penalty than obsidian plate (39 vs 54 set total) for casters.]]></description>
    </item>
    <item>
      <title>Gameplay: More Obsidian Forge recipes from the same wishlist item: obsidian versions of the round…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-176f54dd4525</guid>
      <pubDate>Mon, 20 Jul 2026 09:49:44 -0500</pubDate>
      <description><![CDATA[More Obsidian Forge recipes from the same wishlist item: obsidian versions of the round, triangle, and rectangle shields (darkened shield prefabs, reflection from the sheets), a 5-piece obsidian bone armor set built on a new Obsidian Enforced Bone Plate component, and a craftable Obsidian Ring and Necklace kept well below the artifact Obsidian Bands. 18 new recipes total, loot-taught in Hilt Fortress like the existing obsidian plate.]]></description>
    </item>
    <item>
      <title>Gameplay: The obsidian look reuses existing meshes with darkened material clones (the same…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-86f87000205b</guid>
      <pubDate>Mon, 20 Jul 2026 09:49:44 -0500</pubDate>
      <description><![CDATA[The obsidian look reuses existing meshes with darkened material clones (the same technique the obsidian plate set already used), so the whole expansion shipped without new art. Recipe hash uniqueness verified across all 3,275 recipes; 27 new EditMode tests cover the recipes, stats, and the classification isolation that keeps obsidian components out of generic recipes.]]></description>
    </item>
    <item>
      <title>Gameplay: PvP trophies (the skulls, jawbones, and hands claimed from a defeated player's remains)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-37e539358a8d</guid>
      <pubDate>Mon, 20 Jul 2026 11:02:26 -0500</pubDate>
      <description><![CDATA[PvP trophies (the skulls, jawbones, and hands claimed from a defeated player's remains) now record their history: the tooltip shows who collected the trophy, the zone the kill happened in, and the in-game date of the fight. Crafting a trophy into another item keeps the lines. Trophies claimed before the change are unchanged. (#695, verify #946)]]></description>
    </item>
    <item>
      <title>Tester Tools: Fixed the tester Duplicate button leaving item stacks red until relog. Rapid x1000 clicks…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-87622b4e591b</guid>
      <pubDate>Mon, 20 Jul 2026 10:01:25 -0500</pubDate>
      <description><![CDATA[Fixed the tester Duplicate button leaving item stacks red until relog. Rapid x1000 clicks aborted the duplicate partway once a stack neared the 32,767 cap, and the aborted request left the stack permanently flagged as pending. The tool now checks the cap up front, reports skipped stacks, and greys the button out until the duplicate finishes (Redmine #934).]]></description>
    </item>
    <item>
      <title>Tester Tools: Duplicating an item inside an open container no longer clones the container along with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-93236817e2dc</guid>
      <pubDate>Mon, 20 Jul 2026 10:01:33 -0500</pubDate>
      <description><![CDATA[Duplicating an item inside an open container no longer clones the container along with it, and copies of non-stacking items are capped at 100 per click. Six new editor tests pin the selection and validation logic.]]></description>
    </item>
    <item>
      <title>Tester Tools: Client control harness gained a dialog verb that opens, closes, and inspects any HUD…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-e18b7a5c5d33</guid>
      <pubDate>Mon, 20 Jul 2026 14:24:27 -0500</pubDate>
      <description><![CDATA[Client control harness gained a dialog verb that opens, closes, and inspects any HUD window by name and flags windows that are open but rendering nothing. A new scenario cycles every converted window through close and reopen so the next dead window is caught on the GM build instead of by a tester on chaos.]]></description>
    </item>
    <item>
      <title>Server: Root-caused a tester's 12-minute login lockout from this morning: a player-dungeon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-9173dc9cfd18</guid>
      <pubDate>Mon, 20 Jul 2026 10:01:42 -0500</pubDate>
      <description><![CDATA[Root-caused a tester's 12-minute login lockout from this morning: a player-dungeon instance wedged the moment he zoned in, login kept answering "waiting for character to leave the previous scene", and every retry extended the hold because re-authentication refreshes the session record the gate waits on. The login gate now frees a character whose scene has stopped reporting for 4 minutes, so the worst case dropped from 12+ minutes (unbounded while retrying) to about 4 (Redmine #935).]]></description>
    </item>
    <item>
      <title>Server: Hardened the scene-leave path around the same incident: the session release now runs even…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c19d387fd0b8</guid>
      <pubDate>Mon, 20 Jul 2026 10:01:45 -0500</pubDate>
      <description><![CDATA[Hardened the scene-leave path around the same incident: the session release now runs even when scene cleanup throws, game connections that go silent for 2 minutes are disconnected, one request can no longer add more than 100 items to a bag, and a new watchdog logs any scene operation that runs longer than 2 seconds or queues longer than 10.]]></description>
    </item>
    <item>
      <title>Dungeons: Rise Shaft dungeon room follow-up from an owner report: the totem slot takes elf, troll…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c35589b7c8e6</guid>
      <pubDate>Mon, 20 Jul 2026 10:23:32 -0500</pubDate>
      <description><![CDATA[Rise Shaft dungeon room follow-up from an owner report: the totem slot takes elf, troll, and dragon totems again (the dragon change had replaced the old elf/troll support instead of adding to it), and the hover text reads "Elf, Troll, or Dragon Totem Slot" instead of the stale elf-and-troll line. Spawn locations are filtered by totem type now, so a dragon totem spawns just the dragon and elf or troll totems never wake it.]]></description>
    </item>
    <item>
      <title>Dungeons: Dragon totem decos were rendering at 2.7m tall with a 5.1m wingspan (the foyer statue at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-a8de3f672e71</guid>
      <pubDate>Mon, 20 Jul 2026 10:23:32 -0500</pubDate>
      <description><![CDATA[Dragon totem decos were rendering at 2.7m tall with a 5.1m wingspan (the foyer statue at the wrong scale), which made the placement ghost unusable in the room. Rescaled to 0.59m, in line with the other totem lines, and switched to the standard totem box collider.]]></description>
    </item>
    <item>
      <title>Dungeons: Fixed monsters standing frozen at their spawn points in player dungeons (tracker #877)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-37f88a098e91</guid>
      <pubDate>Mon, 20 Jul 2026 14:44:44 -0500</pubDate>
      <description><![CDATA[Fixed monsters standing frozen at their spawn points in player dungeons (tracker #877). Spawning now waits for the dungeons wall and door seals to finish applying before placing monsters, and a monster whose spot no longer sits on walkable ground is nudged to the nearest usable spot. Two fire elemental spawn spots in the lava grotto rooms were moved onto walkable ground outright. A new editor test replays all 205 spawn points across the 16 spawn rooms against their baked navigation and failed 26 of them before the fix. Commit 5a759d7bd4.]]></description>
    </item>
    <item>
      <title>Dungeons: The same test flagged the Hilt Basement spider room: 16 of its 34 spawn points stand well…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-9ab79ab62c51</guid>
      <pubDate>Mon, 20 Jul 2026 14:44:44 -0500</pubDate>
      <description><![CDATA[The same test flagged the Hilt Basement spider room: 16 of its 34 spawn points stand well off the rooms stale baked navigation, beyond what the new runtime nudge can recover. Filed as tracker #971 for a rebake; the test carries an exclusion for the room until then.]]></description>
    </item>
    <item>
      <title>Dungeons: Hilt Fortress is back to one entrance door at each of its three entrances (Nightshade…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-939b40911b20</guid>
      <pubDate>Mon, 20 Jul 2026 18:55:35 -0500</pubDate>
      <description><![CDATA[Hilt Fortress is back to one entrance door at each of its three entrances (Nightshade Pass, Paladis Passage, Equitas Passage). Players not on the Vermillion Lens quest enter the standard dungeon directly; players on that quest step get a choice window for the standard dungeon or the solo quest version (#987).]]></description>
    </item>
    <item>
      <title>Dungeons: The 2019 door split also left an old auto-routing door active on the Nightshade Pass…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2d2c1efa5719</guid>
      <pubDate>Mon, 20 Jul 2026 18:56:07 -0500</pubDate>
      <description><![CDATA[The 2019 door split also left an old auto-routing door active on the Nightshade Pass tower gate that could force quest players into the solo version of Hilt Fortress. It now uses the same choice window. 11 new editor tests cover the door candidate logic and the scene config of all three entrances.]]></description>
    </item>
    <item>
      <title>Taming: Taming necklaces now credit the tamer (player wishlist #698): capturing a creature adds a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2ab2553e477c</guid>
      <pubDate>Mon, 20 Jul 2026 10:45:07 -0500</pubDate>
      <description><![CDATA[Taming necklaces now credit the tamer (player wishlist #698): capturing a creature adds a yellow "Tamed by" line under the crafter credit plus a gray line with the in-game capture date. Re-taming replaces the credit, releasing the pet clears it, and it disappears once a pet is permanently gone. Resurrecting another player's pet leaves their credit alone. Verify task #944.]]></description>
    </item>
    <item>
      <title>Taming: The tamer credit is server-checked: only the capturing player's own name is accepted and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-47625c9f5f40</guid>
      <pubDate>Mon, 20 Jul 2026 10:45:13 -0500</pubDate>
      <description><![CDATA[The tamer credit is server-checked: only the capturing player's own name is accepted and the capture time is stamped by the server, so the line on a traded necklace is trustworthy. Covered by 4 new EditMode tests.]]></description>
    </item>
    <item>
      <title>Portal: Added the missing Character Viewer card to the dev portal landing page; the character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-a1f9e5364b96</guid>
      <pubDate>Mon, 20 Jul 2026 10:49:27 -0500</pubDate>
      <description><![CDATA[Added the missing Character Viewer card to the dev portal landing page; the character search and admin page is now reachable from the portal instead of only by direct URL.]]></description>
    </item>
    <item>
      <title>Portal: Hardened the work blog publish after the morning counter outage: the live player counter…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-19b16779de9f</guid>
      <pubDate>Mon, 20 Jul 2026 11:10:32 -0500</pubDate>
      <description><![CDATA[Hardened the work blog publish after the morning counter outage: the live player counter now builds itself from the shared page script rather than page markup, and publishing refuses to deploy if required page furniture is missing, so the same class of mistake gets caught before it reaches the site.]]></description>
    </item>
    <item>
      <title>Portal: Character Viewer: the page now shows which server it is reading. A Chaos badge sits next…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-7b15c7c6e86b</guid>
      <pubDate>Mon, 20 Jul 2026 11:35:58 -0500</pubDate>
      <description><![CDATA[Character Viewer: the page now shows which server it is reading. A Chaos badge sits next to the title on the search page and the character page.]]></description>
    </item>
    <item>
      <title>Portal: Character Viewer: deleted characters now appear in search results with a deleted tag and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-25784dd62070</guid>
      <pubDate>Mon, 20 Jul 2026 11:35:59 -0500</pubDate>
      <description><![CDATA[Character Viewer: deleted characters now appear in search results with a deleted tag and a created date. Their page shows a notice explaining the character was deleted, and admin actions are disabled for them.]]></description>
    </item>
    <item>
      <title>Portal: Character Viewer: renamed characters now list their former names with date, reason, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-9e1bde71296e</guid>
      <pubDate>Mon, 20 Jul 2026 11:35:59 -0500</pubDate>
      <description><![CDATA[Character Viewer: renamed characters now list their former names with date, reason, and who made the change. The server keeps a permanent rename record going forward; older renames appear where the portal audit trail recorded them.]]></description>
    </item>
    <item>
      <title>Portal: Vendor search redeployed with the corrected town names and a full re-index of all 286,967…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2a6e9b371357</guid>
      <pubDate>Mon, 20 Jul 2026 19:20:09 -0500</pubDate>
      <description><![CDATA[Vendor search redeployed with the corrected town names and a full re-index of all 286,967 listings: vendors in player towns now show their actual town in search results instead of another town built from the same template.]]></description>
    </item>
    <item>
      <title>Housing: Large structure decorations can now be placed on balconies, walkable roofs, indoor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-946f72392b8a</guid>
      <pubDate>Mon, 20 Jul 2026 11:00:13 -0500</pubDate>
      <description><![CDATA[Large structure decorations can now be placed on balconies, walkable roofs, indoor floors, and the tops of building blocks and platforms. The pass covers 174 items: clock towers, the bell tower, guard towers, gazebos, pavilions, tents, windmills, greenhouses, outhouses, stone platforms, standing stones, boulders, tombstones, devotionals, and more. From a player wishlist request.]]></description>
    </item>
    <item>
      <title>Housing: Decoration placement gained an optional grid snap from a player wishlist request (#907)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-2923dda2512f</guid>
      <pubDate>Mon, 20 Jul 2026 14:18:02 -0500</pubDate>
      <description><![CDATA[Decoration placement gained an optional grid snap from a player wishlist request (#907): while holding a deco, G toggles a placement grid aligned to the lot and Alt+G cycles the cell size through 1m, 0.5m, 0.25m, and 0.125m. Rows of blocks, casks, and fences line up flush, stacking keeps the surface height, and wall decos snap within the wall plane.]]></description>
    </item>
    <item>
      <title>Housing: With the grid on, Q and E rotate the held deco in 15 degree steps. Designer snap points…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-af7c515c4c10</guid>
      <pubDate>Mon, 20 Jul 2026 14:18:03 -0500</pubDate>
      <description><![CDATA[With the grid on, Q and E rotate the held deco in 15 degree steps. Designer snap points such as display shelves and totem slots still win over the grid, both keys can be rebound under Options Controls, and the snap state and cell size persist per player. 47 new EditMode asserts pin the lattice math and the key wiring.]]></description>
    </item>
    <item>
      <title>World: Fishing in Atolls of Atos now draws from the salt water table (#902). The zone-wide water…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-185afa1cef47</guid>
      <pubDate>Mon, 20 Jul 2026 13:13:36 -0500</pubDate>
      <description><![CDATA[Fishing in Atolls of Atos now draws from the salt water table (#902). The zone-wide water volume was set to fresh water, so every catch and the fishing experience came out freshwater in open ocean. Lands in the next chaos build.]]></description>
    </item>
    <item>
      <title>World: The Sequanna Colossus ruins elevator could turn invisible at some camera angles while its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-81f8289070de</guid>
      <pubDate>Mon, 20 Jul 2026 17:15:20 -0500</pubDate>
      <description><![CDATA[The Sequanna Colossus ruins elevator could turn invisible at some camera angles while its shadow stayed and players could still ride it: the moving platform was flagged as static scenery, so the baked visibility data culled it at its parked spot. Cleared the flags there and on 25 other movers (mine carts, dungeon platforms, the Blood Bay airship, the Rhun floating island), rebaked the scene visibility data, and added an editor test that keeps mover geometry non-static (tracker #744).]]></description>
    </item>
    <item>
      <title>Audio: Eight more silent shrine caretakers speak now (#891): Fendrys in Aerie, Ardal in Point…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-21fddebb1ff1</guid>
      <pubDate>Mon, 20 Jul 2026 13:13:36 -0500</pubDate>
      <description><![CDATA[Eight more silent shrine caretakers speak now (#891): Fendrys in Aerie, Ardal in Point West, Raimi in Brookside, Koen in Etceter, Caden in Kiln, Xed in Jaanaford, Jephthah in Northwood, and Elon in Fortus End, plus seven colleagues at the same shrines. Six carried the same stale template data that silenced Tomas Cucu. The Kiln and Jaanaford pair were filed under crossed scene pointers that the voice exporter did not follow but the game did; the exporter now resolves conversations the way the game loads them, which surfaced 11 more never-voiced NPCs that got voices in the same pass. 2,131 lines generated and published; clients pick them up on next login.]]></description>
    </item>
    <item>
      <title>Audio: Skeleton archers die with a bone-rasp undead voice now (#904). Players reported the dying…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-603bc4d48af3</guid>
      <pubDate>Mon, 20 Jul 2026 13:13:37 -0500</pubDate>
      <description><![CDATA[Skeleton archers die with a bone-rasp undead voice now (#904). Players reported the dying word sounded like a living man giving an order; the archers were on a plain human voice while the bloodbone fighters already had the undead treatment. Recast and rebaked, live on next login. A pass for the remaining plain-voiced undead is filed as #965.]]></description>
    </item>
    <item>
      <title>Audio: Recast the Frost Giant in Jotungrund from a playful announcer voice to a deep booming one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-0766d68fefe5</guid>
      <pubDate>Mon, 20 Jul 2026 16:44:21 -0500</pubDate>
      <description><![CDATA[Recast the Frost Giant in Jotungrund from a playful announcer voice to a deep booming one (a leftover from the first auto-casting pass). Regenerated his 48 voice lines and published them to the voice CDN, so the fix is live without a client build (tracker #825, verify #980).]]></description>
    </item>
    <item>
      <title>Graphics: Dug into the invisible Will-O-Wisp in the Well of Aldur (#900). The likely suspect, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-3c6af88a5d79</guid>
      <pubDate>Mon, 20 Jul 2026 13:13:37 -0500</pubDate>
      <description><![CDATA[Dug into the invisible Will-O-Wisp in the Well of Aldur (#900). The likely suspect, the engine stripping shader variants from asset bundles, is ruled out with build-and-render experiments that now live on as regression tests, and the wisp assets render fine in isolation at every quality level. The remaining suspects are the creature runtime visual state systems, which need a live client session to pin down.]]></description>
    </item>
    <item>
      <title>Graphics: Hardened the creature fade-in that left the summoned Air Elemental nearly invisible…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-3ef7ff6cc970</guid>
      <pubDate>Mon, 20 Jul 2026 17:15:20 -0500</pubDate>
      <description><![CDATA[Hardened the creature fade-in that left the summoned Air Elemental nearly invisible, showing only its metal rings: a stalled fade now completes instead of hanging forever, a missing dissolve mask no longer aborts creature visual setup, and the hair material shipped 69 percent dissolved and was reset. The miner hat lamp beam also shipped fully dimmed and was restored (tracker #743).]]></description>
    </item>
    <item>
      <title>Graphics: Ultima mode kept its video-options setting but lost its visual effect after any scene…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-49532e9c9876</guid>
      <pubDate>Mon, 20 Jul 2026 19:37:01 -0500</pubDate>
      <description><![CDATA[Ultima mode kept its video-options setting but lost its visual effect after any scene change; the rebuilt scene camera never re-applied it. The retro look now survives zoning (tracker #516).]]></description>
    </item>
    <item>
      <title>Content: Confirmed why Island Challenge creatures still stand frozen after the navigation rebake…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-7b486d3f6a13</guid>
      <pubDate>Mon, 20 Jul 2026 14:44:44 -0500</pubDate>
      <description><![CDATA[Confirmed why Island Challenge creatures still stand frozen after the navigation rebake: the rebaked data never reached the shipped builds. Client logs show every island spawner failing its navigation snap on the two most recent builds, both built after the fix landed in source. The scene wiring in the repo checks out, so the gap is in build packaging; filed as tracker #969 and the tester task is on hold until a build actually carries it.]]></description>
    </item>
    <item>
      <title>Trackers: Closed tip jar bugs #874 (Visitors See dropdown rendering outside the window) and #873…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-63af39b38414</guid>
      <pubDate>Mon, 20 Jul 2026 14:44:44 -0500</pubDate>
      <description><![CDATA[Closed tip jar bugs #874 (Visitors See dropdown rendering outside the window) and #873 (window staying open after changing zones) as already fixed: both were covered by the earlier tip jar fix pass that shipped with chaos build 44, and the tester reports predated it. Verification rides the existing tester task #887.]]></description>
    </item>
    <item>
      <title>Travel: Fixed overworld travel speed staying locked to whatever terrain you started running on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-a9e196ff1565</guid>
      <pubDate>Mon, 20 Jul 2026 16:28:36 -0500</pubDate>
      <description><![CDATA[Fixed overworld travel speed staying locked to whatever terrain you started running on, broken since around 2021 (#741). The per-tile speed refresh was wired to a movement mode the game stopped using; it now runs from the active movement state, on foot and mounted, and the terrain speed table is pinned by new editor tests.]]></description>
    </item>
    <item>
      <title>Combat: Shield of Ice, Cocoon of Night, and Cleansing Rain now honor the reagent conservation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-daf9480aa941</guid>
      <pubDate>Mon, 20 Jul 2026 16:28:42 -0500</pubDate>
      <description><![CDATA[Shield of Ice, Cocoon of Night, and Cleansing Rain now honor the reagent conservation stat from wands and staves (#740). Their consume-chance data was a fixed number that ignored equipment; a new editor test sweeps every spell for the same data mistake and pins the known exceptions.]]></description>
    </item>
    <item>
      <title>Combat: Crystal Shield no longer attaches its buff visual to an invisible object (tracker #822…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-9217e9996331</guid>
      <pubDate>Mon, 20 Jul 2026 17:21:36 -0500</pubDate>
      <description><![CDATA[Crystal Shield no longer attaches its buff visual to an invisible object (tracker #822, verify #979). Friendly arc targeting could pick another player whose avatar had not finished loading into the scene. Targeting now skips players who are still loading, and the buff falls back to the caster as before.]]></description>
    </item>
    <item>
      <title>Decorations: Pennant pole flags and the pirate flag now turn to follow the wind (tracker #819). Placed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-27284b265774</guid>
      <pubDate>Mon, 20 Jul 2026 16:27:02 -0500</pubDate>
      <description><![CDATA[Pennant pole flags and the pirate flag now turn to follow the wind (tracker #819). Placed flags kept whatever direction their lot gave them, so identical pennants pointed different ways on differently rotated lots; the cloth now swivels around its own pole to the scene wind heading, which drifts over time, while the base keeps the player chosen rotation. Covers the 10 pennant decos, the 5 town pole flags, and the pirate flag; wall and standing banners do not flutter and are unchanged.]]></description>
    </item>
    <item>
      <title>Decorations: A new editor test pins all 16 flag prefabs to the wind alignment setup, so a future art…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-5e10a7e00234</guid>
      <pubDate>Mon, 20 Jul 2026 16:27:07 -0500</pubDate>
      <description><![CDATA[A new editor test pins all 16 flag prefabs to the wind alignment setup, so a future art edit that drops it fails the test run.]]></description>
    </item>
    <item>
      <title>Decorations: The Simple Mantle Clock no longer renders shattered: its 2005-era model file carried 8…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-40a08f744224</guid>
      <pubDate>Mon, 20 Jul 2026 17:15:11 -0500</pubDate>
      <description><![CDATA[The Simple Mantle Clock no longer renders shattered: its 2005-era model file carried 8 broken polygons that the Unity 6 importer trips over, dropping 140 of its 568 triangles. Repaired the model file in place; the wooden case and numbered face are whole again (tracker #817).]]></description>
    </item>
    <item>
      <title>Decorations: Fixed the new pet decorations (Ceramic Bowl, Ceramic Food Bowl, Ceramic Water Bowl, Pet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-a39923bd7849</guid>
      <pubDate>Mon, 20 Jul 2026 22:23:10 -0500</pubDate>
      <description><![CDATA[Fixed the new pet decorations (Ceramic Bowl, Ceramic Food Bowl, Ceramic Water Bowl, Pet Bed) showing as unknown white cubes that could not be placed (tracker #986). The store items had shipped before their art and item definitions reached the build; the missing files are now in and placed cubes heal to their real models on next scene load.]]></description>
    </item>
    <item>
      <title>Tools: New repair script for 2005-era model files: it drops the broken polygons that the Unity 6…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-ea0f8212839b</guid>
      <pubDate>Mon, 20 Jul 2026 17:20:10 -0500</pubDate>
      <description><![CDATA[New repair script for 2005-era model files: it drops the broken polygons that the Unity 6 importer trips over (the Simple Mantle Clock bug class), keeping names and references intact so prefabs keep working. Comes with a dry-run audit mode for the project-wide sweep (tracker #984).]]></description>
    </item>
    <item>
      <title>Items: Fixed the Faerie Belt doing nothing when equipped (tracker #871, verify #978). The belt…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-982b5f5a646e</guid>
      <pubDate>Mon, 20 Jul 2026 17:21:36 -0500</pubDate>
      <description><![CDATA[Fixed the Faerie Belt doing nothing when equipped (tracker #871, verify #978). The belt gained durability in an old item pass, and any belt stored since before that change read as permanently broken, which switched off its shrink effect while shrink potions kept working. The belt has no durability now, so every existing belt shrinks its wearer again with no item exchange. Also exempted the cosmetic shrink from per-scene gear caps and fixed equipment visuals keeping full size when rebuilt on a shrunken character.]]></description>
    </item>
    <item>
      <title>Items: Ran the new Faerie Belt and Crystal Shield test fixtures in the Editor test runner: all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-935a31459ce5</guid>
      <pubDate>Mon, 20 Jul 2026 18:31:01 -0500</pubDate>
      <description><![CDATA[Ran the new Faerie Belt and Crystal Shield test fixtures in the Editor test runner: all 15 tests pass. Fixing that run also caught an invalid hand-written meta file that had kept the belt fixture out of the compiled test assembly.]]></description>
    </item>
    <item>
      <title>Items: Oracle replies now follow the selected UI skin (tracker #369). The markdown renderer used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-e66f08636691</guid>
      <pubDate>Mon, 20 Jul 2026 21:16:29 -0500</pubDate>
      <description><![CDATA[Oracle replies now follow the selected UI skin (tracker #369). The markdown renderer used fixed dark text colors that made answers nearly unreadable on the light Air skin; colors now come from the shared skin tokens, and a new test fails the suite if a fixed color sneaks back in. Also removed the dead pre-markdown Oracle chat window that rendered raw markdown through NGUI color codes.]]></description>
    </item>
    <item>
      <title>Items: The Oracle taming guide now lists the equipment bonuses to a tamed pet's level (tracker…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-c09b70c78957</guid>
      <pubDate>Mon, 20 Jul 2026 21:16:29 -0500</pubDate>
      <description><![CDATA[The Oracle taming guide now lists the equipment bonuses to a tamed pet's level (tracker #469): per-rarity numbers for the seven artifact families, read from the item data, plus a note that the taming necklace grants none. Deployed to the Oracle service and confirmed with a live query.]]></description>
    </item>
    <item>
      <title>Zoning: Fixed the false Reconnecting to the game service message at the halfway mark of zone…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-15e1a381d6e2</guid>
      <pubDate>Mon, 20 Jul 2026 19:36:52 -0500</pubDate>
      <description><![CDATA[Fixed the false <b>Reconnecting to the game service</b> message at the halfway mark of zone loads. Zoning re-authenticates with the server before the scene load, and a slow load could stall the confirmation, triggering a second redundant reconnect that also flashed the player offline to friends. The loading checkpoint now waits for the in-flight handoff instead of tearing it down (tracker #520).]]></description>
    </item>
    <item>
      <title>Crafting: Centered the Only craftable checkbox under the Recipes header on crafting stations and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-e4b400fb8e5d</guid>
      <pubDate>Mon, 20 Jul 2026 19:37:01 -0500</pubDate>
      <description><![CDATA[Centered the <b>Only craftable</b> checkbox under the Recipes header on crafting stations and shrank its row background to fit the content instead of spanning the full window (tracker #513, #514).]]></description>
    </item>
    <item>
      <title>Social: Party member name tags above characters rendered as solid colored blocks after joining a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-19fd70520048</guid>
      <pubDate>Mon, 20 Jul 2026 19:49:28 -0500</pubDate>
      <description><![CDATA[Party member name tags above characters rendered as solid colored blocks after joining a party (tracker #521). The party tag draws with a see-through-walls text material whose shader predated the engine upgrade; it has been regenerated against the current text renderer, and party names, titles, and guild lines read normally again.]]></description>
    </item>
    <item>
      <title>Economy: Get Directions now works for vendor listings that come from the search index (tracker…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-5c97b429d366</guid>
      <pubDate>Mon, 20 Jul 2026 21:16:20 -0500</pubDate>
      <description><![CDATA[Get Directions now works for vendor listings that come from the search index (tracker #468). Search results always carried the vendor lot id and the client now uses it, so searched listings and buy orders mark the vendor on the compass. Rows with no locatable vendor grey the button out instead of showing an error.]]></description>
    </item>
    <item>
      <title>Creatures: Closed the Elysium Mines T-pose report (tracker #544) as already fixed: the July 15…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-317a98c5b880</guid>
      <pubDate>Mon, 20 Jul 2026 21:16:29 -0500</pubDate>
      <description><![CDATA[Closed the Elysium Mines T-pose report (tracker #544) as already fixed: the July 15 animation repair covered the satyrs there, and testers verified satyr and imp animations on chaos on July 17.]]></description>
    </item>
    <item>
      <title>Repo: Merged the day's parallel work back into a single branch: 39 incoming commits integrated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-896b9d0e655a</guid>
      <pubDate>Mon, 20 Jul 2026 21:24:49 -0500</pubDate>
      <description><![CDATA[Merged the day's parallel work back into a single branch: 39 incoming commits integrated, with the work log reconciled so it carries every bullet both checkouts wrote today. Also cleared seven leftover files from the retired NGUI list windows.]]></description>
    </item>
    <item>
      <title>Infrastructure: Caught the content pipeline up on about a month of team changes (124 changelists): new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-7db9bc6e20f9</guid>
      <pubDate>Mon, 20 Jul 2026 22:23:11 -0500</pubDate>
      <description><![CDATA[Caught the content pipeline up on about a month of team changes (124 changelists): new pet decorations, garden bower and fern urn revisions, birthday candle colors, shipwreck pieces, book placement flags, stuck-spot fixes, and localization updates.]]></description>
    </item>
    <item>
      <title>Infrastructure: Fixed three content-import bugs found during the catch-up: renames left a stale copy of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-7d89924aba28</guid>
      <pubDate>Mon, 20 Jul 2026 22:23:11 -0500</pubDate>
      <description><![CDATA[Fixed three content-import bugs found during the catch-up: renames left a stale copy of the old file behind (which broke asset identity for the birthday candle and shipwreck pieces), files from certain automated checkins were silently skipped, and a storage-rotation marker could delete a live file. Re-applied the handful of local changes the catch-up had overwritten, including the German localization payload (18k records restored) and the occlusion-plugin cleanup on ten scenes.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-20</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-images</guid>
      <pubDate>Mon, 20 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/hilt-single-door.png" data-full="https://catnipgames.net/blog/images/hilt-single-door.png"
               data-cap="The Hilt Fortress entrance in Nightshade Pass after the merge: one door where the 2019 quest and multiplayer pair used to stand (#987)."
               alt="Stone gatehouse entrance of Hilt Fortress with a single dark metal double door at the top of grass steps" loading="lazy">
          <span class="cap">Hilt Fortress single door</span>
        
        
          <img src="https://catnipgames.net/blog/images/deco-grid-snap-keybinds.png" data-full="https://catnipgames.net/blog/images/deco-grid-snap-keybinds.png"
               data-cap="The Options Controls tab with the two new rebindable actions for the deco grid snap: Deco Toggle Grid Snap on G and Deco Cycle Grid Size on Alt+G (#907)."
               alt="Options window Controls tab listing keybinding rows, ending with Deco Toggle Grid Snap bound to G and Deco Cycle Grid Size bound to Left Alt + G" loading="lazy">
          <span class="cap">Deco grid snap keybinds</span>
        
        
          <img src="https://catnipgames.net/blog/images/ChaosOnlinePill.png" data-full="https://catnipgames.net/blog/images/ChaosOnlinePill.png"
               data-cap="The work blog front page with the new live counter: how many players are online on the Chaos shard, refreshed every minute (#908)."
               alt="Blog front page header with a gold pill badge reading 1 player online on the Chaos shard" loading="lazy">
          <span class="cap">Live Chaos player counter</span>
        
        
          <img src="https://catnipgames.net/blog/images/frosted-lamp-unity6-harness-render.png" data-full="https://catnipgames.net/blog/images/frosted-lamp-unity6-harness-render.png"
               data-cap="The Frosted Glass Lamp in the editor render harness used for the #646 investigation: glass glow and floor light pool both present."
               alt="A table lamp with a glowing blue frosted glass shade casting a warm pool of light on a dark floor" loading="lazy">
          <span class="cap">Frosted Glass Lamp render check</span>
        
        
          <img src="https://catnipgames.net/blog/images/ObsidianChainmailCompare.png" data-full="https://catnipgames.net/blog/images/ObsidianChainmailCompare.png"
               data-cap="Regular chainmail next to the new craftable Obsidian Chainmail chest piece from the Obsidian Forge."
               alt="Regular silver chainmail chest armor beside the dark glossy obsidian version" loading="lazy">
          <span class="cap">Obsidian Chainmail</span>
        
        
          <img src="https://catnipgames.net/blog/images/ObsidianShieldCompare.png" data-full="https://catnipgames.net/blog/images/ObsidianShieldCompare.png"
               data-cap="The heavy round shield and its new obsidian version from the Obsidian Forge."
               alt="Regular bronze round shield beside the dark obsidian version" loading="lazy">
          <span class="cap">Obsidian round shield</span>
        
        
          <img src="https://catnipgames.net/blog/images/PerformanceWindow.png" data-full="https://catnipgames.net/blog/images/PerformanceWindow.png"
               data-cap="The new /fps Performance window on the title screen: average fps, the fps of the slowest 5% of frames over 30 seconds, and a 15 second frame-time graph. The red spike is a real hitch caught during capture."
               alt="Performance window showing 351 average fps, 119.9 five percent low, and a frame-time bar graph with one red spike, floating over the Shroud of the Avatar title screen" loading="lazy">
          <span class="cap">The new /fps Performance window</span>
        
        
          <img src="https://catnipgames.net/blog/images/PortalCountdown.png" data-full="https://catnipgames.net/blog/images/PortalCountdown.png"
               data-cap="The portal front page counting down to DragonCon (September 3) and the September 8 test-server opening."
               alt="Portal front page with two gold countdown tiles: 45 days until DragonCon, 50 days until the test servers open to everyone" loading="lazy">
          <span class="cap">Portal countdown tiles</span>
        
        
          <img src="https://catnipgames.net/blog/images/pot-wiki-deep-dive-chapter.png" data-full="https://catnipgames.net/blog/images/pot-wiki-deep-dive-chapter.png"
               data-cap="The new Player-Owned Towns (Deep Dive) chapter on the team wiki: overview, data model, scenes and templates, pipeline and server, and operator runbooks."
               alt="Team wiki chapter page listing the five Player-Owned Towns deep-dive pages" loading="lazy">
          <span class="cap">Player-Owned Towns wiki chapter</span>
        
        
          <img src="https://catnipgames.net/blog/images/GraffMapRecapture.png" data-full="https://catnipgames.net/blog/images/GraffMapRecapture.png"
               data-cap="The Graff Island scene map before and after the recapture: the first capture ran while terrain data was broken and baked white ground into the map."
               alt="Side by side comparison of the Graff Island map, white untextured ground on the left, grass and sand terrain on the right" loading="lazy">
          <span class="cap">Graff Island map, before and after</span>
        
        
          <img src="https://catnipgames.net/blog/images/ClockTowerOnKeepRoof.png" data-full="https://catnipgames.net/blog/images/ClockTowerOnKeepRoof.png"
               data-cap="The Darkstarr Clock Tower standing on a stone keep's gatehouse roof, staged in the editor. Structure decorations like this were limited to open ground and can now be placed on balconies, roofs, floors, and building blocks."
               alt="Darkstarr Clock Tower placed on top of a stone keep's roof" loading="lazy">
          <span class="cap">Clock tower on a keep roof</span>
        
        
          <img src="https://catnipgames.net/blog/images/character-viewer-former-names.png" data-full="https://catnipgames.net/blog/images/character-viewer-former-names.png"
               data-cap="The Character Viewer with the new server badge and the Former names rename history table, shown on a renamed test character."
               alt="Character Viewer page showing a Chaos server badge and a table of former character names" loading="lazy">
          <span class="cap">Character Viewer rename history</span>
        
        
          <img src="https://catnipgames.net/blog/images/scenes-npc-roster-kingsport.png" data-full="https://catnipgames.net/blog/images/scenes-npc-roster-kingsport.png"
               data-cap="Kingsport's new NPC roster on the scenes portal: 55 NPCs with role tags, levels, spawn counts, quest badges, and Garvin the trainer's 179 teachable skills expanded."
               alt="Scene analysis page listing Kingsport NPCs in a table with merchant, bank, and trainer tags and an expanded teachable skills list" loading="lazy">
          <span class="cap">Kingsport NPC roster</span>
        
        
          <img src="https://catnipgames.net/blog/images/scenes-quest-detail-kingsport.png" data-full="https://catnipgames.net/blog/images/scenes-quest-detail-kingsport.png"
               data-cap="Kingsport's new Quests panel: the ale shipment quest chain expanded with full journal text per step, above the scene's creature table."
               alt="Scene analysis page showing a quest card with journal steps and full quest text, and a creatures table listing rabbits, chickens, stags, and sheep" loading="lazy">
          <span class="cap">Kingsport quest detail</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-social-window-live-client.png" data-full="https://catnipgames.net/blog/images/uitk-social-window-live-client.png"
               data-cap="The rebuilt Social window open in the live chaos client during the reopen-bug investigation. Converted windows opened once per session and then refused to appear again; the fix lands in the next chaos build."
               alt="The rebuilt Social window with Friends, Party, and Guild tabs open over the Soltown camp" loading="lazy">
          <span class="cap">Rebuilt Social window in the live client</span>
        
        
          <img src="https://catnipgames.net/blog/images/scenes-list-view-291.png" data-full="https://catnipgames.net/blog/images/scenes-list-view-291.png"
               data-cap="The scenes portal's new list view: all 291 zones with sortable columns for warnings, NPCs, creatures, spawners, median level, chests, resources, stations, quest givers, and live fps and load times."
               alt="Scene analysis list view showing 291 scenes as table rows with thumbnails and a dozen sortable numeric columns" loading="lazy">
          <span class="cap">All 291 scenes in the new list view</span>
        
        
          <img src="https://catnipgames.net/blog/images/scenes-chest-drilldown-kingsport.png" data-full="https://catnipgames.net/blog/images/scenes-chest-drilldown-kingsport.png"
               data-cap="The chest drill-down for Kingsport: all 97 lootable containers with type, loot bundle, approximate gold value, world position, and source prefab, sorted by value."
               alt="Chests and containers table for Kingsport listing sacks and crates with loot bundles, gold values, and positions" loading="lazy">
          <span class="cap">Kingsport chest drill-down</span>
        
        
          <img src="https://catnipgames.net/blog/images/wind-aligned-flags.png" data-full="https://catnipgames.net/blog/images/wind-aligned-flags.png"
               data-cap="Pennants and a pirate flag placed at different rotations on the forest road, all streaming the same way with the scene wind (tracker #819)."
               alt="Forest valley with three colored pennant pole flags and a large pirate flag, every flag streaming in the same direction" loading="lazy">
          <span class="cap">Flags obeying the wind</span>
        
        
          <img src="https://catnipgames.net/blog/images/mantle-clock-shattered-before.png" data-full="https://catnipgames.net/blog/images/mantle-clock-shattered-before.png"
               data-cap="The Simple Mantle Clock before the fix: the Unity 6 importer dropped 140 of the model's 568 triangles, leaving the case sliced open and the face in fragments (tracker #817)."
               alt="A wooden mantle clock rendered with jagged missing slices through its case and a fragmented clock face" loading="lazy">
          <span class="cap">Mantle clock before the fix</span>
        
        
          <img src="https://catnipgames.net/blog/images/mantle-clock-fixed-after.png" data-full="https://catnipgames.net/blog/images/mantle-clock-fixed-after.png"
               data-cap="The same Simple Mantle Clock after the model repair: complete case and a whole face with readable numerals and hands (tracker #817)."
               alt="The same wooden mantle clock intact, with a clean white face, roman numerals, and both hands visible" loading="lazy">
          <span class="cap">Mantle clock after the fix</span>
        
        
          <img src="https://catnipgames.net/blog/images/character-viewer-towns-instance-fix.png" data-full="https://catnipgames.net/blog/images/character-viewer-towns-instance-fix.png"
               data-cap="The Character Viewer Towns tab after the town-name fix: the governor and residency rows name the actual town, with the shared scene asset shown separately. Player towns are built on shared template scenes, and the page used to label every town on a template with one example town's name."
               alt="Character Viewer Towns tab showing steward roles, derived residency, and a governor row naming Isle of Apples with its template scene listed beside it" loading="lazy">
          <span class="cap">Towns tab names the right town</span>
        
        
          <img src="https://catnipgames.net/blog/images/character-viewer-core-region.png" data-full="https://catnipgames.net/blog/images/character-viewer-core-region.png"
               data-cap="A character who logged out in Anseldale now shows Anseldale (the page previously showed a different town built on the same scene template), plus the new Region row."
               alt="Character Viewer overview panel with the Scene row reading Anseldale and a new Region row reading NoviaRegion03" loading="lazy">
          <span class="cap">Correct logout town and new Region row</span>
          <img src="https://catnipgames.net/blog/images/party-nameplate-text-restored.png" data-full="https://catnipgames.net/blog/images/party-nameplate-text-restored.png"
               data-cap="The party nameplate text material rendering a readable outlined name again after the shader regeneration; before the fix, party name tags drew as solid colored blocks (#521)."
               alt="A purple outlined character name rendered crisply on a dark background" loading="lazy">
          <span class="cap">Party nameplate text restored</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Dev Tools: Added global dev-placed deco: devs can place decorations in any scene with no lot, pick…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-217c1896f445</guid>
      <pubDate>Mon, 20 Jul 2026 17:41:49 -0500</pubDate>
      <description><![CDATA[Added global dev-placed deco: devs can place decorations in any scene with no lot, pick how long they stay (an hour up to a year, or permanent), and the props appear for every player in every copy of that scene until they expire. Placing uses the normal decorate flow and never consumes the item; <b>/gmdeco</b> toggles the mode.]]></description>
    </item>
    <item>
      <title>Dev Tools: New Global Deco page in the GM tools lists every dev placement in the game with item…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-7d26b956e06b</guid>
      <pubDate>Mon, 20 Jul 2026 17:41:49 -0500</pubDate>
      <description><![CDATA[New <b>Global Deco</b> page in the GM tools lists every dev placement in the game with item, scene, age and expiry, sortable by any column, with teleport, extend and remove actions. Removals and extensions reach live scenes within a minute.]]></description>
    </item>
    <item>
      <title>Dev Tools: Dev-placed props are real decorations: chairs can be sat on and crafting stations work…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-64acc382d331</guid>
      <pubDate>Mon, 20 Jul 2026 17:41:49 -0500</pubDate>
      <description><![CDATA[Dev-placed props are real decorations: chairs can be sat on and crafting stations work. Expiry cleans them up automatically, including scenes that were offline when the timer ran out. Container contents and saved lamp state are planned as a follow-up.]]></description>
    </item>
    <item>
      <title>GM Tools: Added GM lot eviction for NPC towns. The lot sign's Evict Resident action, previously…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-94b82d88b008</guid>
      <pubDate>Mon, 20 Jul 2026 19:30:39 -0500</pubDate>
      <description><![CDATA[Added GM lot eviction for NPC towns. The lot sign's Evict Resident action, previously limited to player-owned-town governors, now works for GM accounts in any town. The evicted player keeps everything (deed to their bank, decorations to the Property Manager) and every GM eviction is logged for review.]]></description>
    </item>
    <item>
      <title>Oracle: Removed the Oracle's daily bug report limits. Players previously hit a cap of 5 filed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-20.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-20-e69a7603a5b1</guid>
      <pubDate>Mon, 20 Jul 2026 21:20:18 -0500</pubDate>
      <description><![CDATA[Removed the Oracle's daily bug report limits. Players previously hit a cap of 5 filed reports per day and were asked to try again tomorrow; there is no daily cap now. Hourly limits stay in place to catch abuse. The change is committed and will reach the live Oracle service with its next deploy.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-19</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-headlines</guid>
      <pubDate>Sun, 19 Jul 2026 23:21:36 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Solved the native Linux client mystery: it never once connected to chaos. A 32-byte cap in the connection handshake rejected the Linux version string (Windows fit with zero bytes to spare), so every native launch stalled at login and our Linux players quietly fell back to Proton. The fix shipped on build 40 and the shard saw its first native Linux login within the hour. That player then hit a rendering crash; a Linux-only mitigation is in for the next build.</li>
        <li>Player-customizable UI themes shipped: a new Options tab, a live <b>Theme Editor</b> window, named saved themes, and clipboard codes for sharing them.</li>
        <li>The client runs on macOS. The first Mac build boots to the title screen after two startup fixes, and the tester page now offers a Mac download that refreshes with every release.</li>
        <li>Same-day catch on the <b>build 42</b> login blocker: the new loading screen could not start outside the editor and every scene load died with it. Root cause found in the logs, fixed with tests, and a new build sent to chaos within hours.</li>
        <li>The Social window is the first big window rebuilt on the new UI framework: Friends, Party, and Guild tabs converted whole, plus a new <b>Accept All</b> button for friend requests.</li>
        <li>The dev portal gained a full character admin page: a complete data viewer, working renames and sex changes with an audit trail, a fairy name generator, and an AI assistant that knows the character.</li>
        <li>The black screen had a single cause, and it was never anyone's graphics card. One launch in five was deadlocking during startup: a synchronous asset load waiting on a background bundle mount that could only finish on the thread it was blocking. Found it by reading the boot telemetry the last build added, fixed it, and closed the four dead-end theories the bug had collected.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Community: Nightly forum sweep filed four wishlist ideas from player threads: loot drop table…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d478cae548d0</guid>
      <pubDate>Sun, 19 Jul 2026 03:20:45 -0500</pubDate>
      <description><![CDATA[Nightly forum sweep filed four wishlist ideas from player threads: loot drop table rebalance for high-effort enemies, a sound/animation payoff for the Bard ability Savage Sonata, optional account MFA, and expanded store payment options (Apple Pay, Google Pay, Cash App Pay, Venmo).]]></description>
    </item>
    <item>
      <title>Infrastructure: Made the 15-minute tester-verdict sweep run invisibly. It had been opening a console…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-e4e90ef90211</guid>
      <pubDate>Sun, 19 Jul 2026 03:28:49 -0500</pubDate>
      <description><![CDATA[Made the 15-minute tester-verdict sweep run invisibly. It had been opening a console window on the dev box every tick and stealing keyboard focus; it now launches with no window at all. Also cleaned up 146 stray tracker-fetch files the sweep had scattered at the project root and taught it to keep scratch files in a temp folder.]]></description>
    </item>
    <item>
      <title>Infrastructure: Extended the no-window fix to the three nightly scheduled jobs (forum sweep, community…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-b8fc39c8fddf</guid>
      <pubDate>Sun, 19 Jul 2026 03:33:58 -0500</pubDate>
      <description><![CDATA[Extended the no-window fix to the three nightly scheduled jobs (forum sweep, community sentiment, daily summary). They now launch through the same invisible wrapper as the 15-minute sweep, so overnight runs no longer open console windows on the dev box.]]></description>
    </item>
    <item>
      <title>Infrastructure: Documented two test-runner pitfalls found today: status probes sent to the editor during…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-69edd6f78f1b</guid>
      <pubDate>Sun, 19 Jul 2026 08:04:58 -0500</pubDate>
      <description><![CDATA[Documented two test-runner pitfalls found today: status probes sent to the editor during a test run can fail unrelated tests by logging errors into the console, and long suite runs need the direct tool call rather than the command-line wrapper, which gives up after a minute.]]></description>
    </item>
    <item>
      <title>Infrastructure: Reconnected the Unity editor AI bridge after the development workstation moved to a new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-41d51b437876</guid>
      <pubDate>Sun, 19 Jul 2026 09:25:00 -0500</pubDate>
      <description><![CDATA[Reconnected the Unity editor AI bridge after the development workstation moved to a new machine. The editor connection still pointed at the old computer, so assistant sessions could not reach the editor. Fixed the connection settings, and updated the guard that keeps two assistant sessions from driving the editor at once, which still referenced the old machine's paths.]]></description>
    </item>
    <item>
      <title>Infrastructure: Reworked the shared assistant configuration so machine-specific values no longer live in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-509a6d84b2f0</guid>
      <pubDate>Sun, 19 Jul 2026 09:26:00 -0500</pubDate>
      <description><![CDATA[Reworked the shared assistant configuration so machine-specific values no longer live in the shared files: each computer now supplies its own connection values and session-guard paths, and the defaults match the current dev machine. Documented the one-time setup for any future machine, and noted one limitation of the session guard on the new platform: two sessions grabbing the editor at the same instant can both get through, while normal back-to-back use is still serialized.]]></description>
    </item>
    <item>
      <title>Infrastructure: Release job tuning: server report regeneration now runs only on its own nightly schedule…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-3fd9a1d6fe75</guid>
      <pubDate>Sun, 19 Jul 2026 09:46:06 -0500</pubDate>
      <description><![CDATA[Release job tuning: server report regeneration now runs only on its own nightly schedule. A daytime release build had been pulling a full report pass onto the build machine ahead of the Windows client build; releases now reuse the latest nightly reports unless explicitly asked otherwise.]]></description>
    </item>
    <item>
      <title>Infrastructure: Chaos moved to build 41 in a daytime release (the new one-button job, reports skipped per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-214eb052ebe6</guid>
      <pubDate>Sun, 19 Jul 2026 10:08:46 -0500</pubDate>
      <description><![CDATA[Chaos moved to build 41 in a daytime release (the new one-button job, reports skipped per the new default). It carries the full startup diagnostics for the black-screen investigation, the distant-creature bounce fix, the native Linux login fix, the theme editor work, and the tip jar recipe rework. 57 open tester tasks got the build number.]]></description>
    </item>
    <item>
      <title>Infrastructure: Tracked down why the editor refused to open the project after an interrupted session: a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-c11a621f4d0c</guid>
      <pubDate>Sun, 19 Jul 2026 13:15:00 -0500</pubDate>
      <description><![CDATA[Tracked down why the editor refused to open the project after an interrupted session: a leftover scene-backup folder makes it wait on a confirmation dialog before loading anything, which looks like a silent hang when nobody is at the screen. Cleared the leftover state, verified the editor loads and the AI bridge answers, and documented the diagnosis and fix.]]></description>
    </item>
    <item>
      <title>Crafting: The Only craftable filter at crafting stations now hides recipes you are missing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-516c20bcd48b</guid>
      <pubDate>Sun, 19 Jul 2026 14:01:58 -0500</pubDate>
      <description><![CDATA[The Only craftable filter at crafting stations now hides recipes you are missing ingredients for. It had been keeping them in the list, greyed out below the craftable ones, which a tester flagged on build 38 (tracker #826).]]></description>
    </item>
    <item>
      <title>Client: Added a boot heartbeat and a watchdog to the startup telemetry: every five seconds until…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9d69536e67aa</guid>
      <pubDate>Sun, 19 Jul 2026 03:32:27 -0500</pubDate>
      <description><![CDATA[Added a boot heartbeat and a watchdog to the startup telemetry: every five seconds until the main menu the client reports frame count, boot stage, focus, and display mode to the log server, and a background watchdog writes into the local log whenever the main thread stops responding during boot. One report is now enough to tell a frozen boot from a running game drawing a black screen.]]></description>
    </item>
    <item>
      <title>Client: Boot telemetry got sharper for the next build: a stalled startup now names the exact…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-ebc906dbe48f</guid>
      <pubDate>Sun, 19 Jul 2026 07:51:58 -0500</pubDate>
      <description><![CDATA[Boot telemetry got sharper for the next build: a stalled startup now names the exact bundle or asset it is stuck on in both the heartbeat and the watchdog lines, and engine warnings during boot (shader fallbacks, swapchain complaints) now reach the log server instead of living only in the local log file.]]></description>
    </item>
    <item>
      <title>Client: Chaos build 42 broke entering the game: the rebuilt loading screen could not start in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-89631c3e0084</guid>
      <pubDate>Sun, 19 Jul 2026 13:14:28 -0500</pubDate>
      <description><![CDATA[Chaos build 42 broke entering the game: the rebuilt loading screen could not start in real game builds (an editor-only fallback hid the problem in every editor test) and the failure crashed each scene load, so updated players hung at login. Fixed the loading screen setup and the scene-loader crash it triggered, with regression tests; the fix build went to chaos the same afternoon.]]></description>
    </item>
    <item>
      <title>Client: Tried rolling chaos back to build 41 first. The deploy guard refuses a lower build number…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8b8b59381b60</guid>
      <pubDate>Sun, 19 Jul 2026 13:14:28 -0500</pubDate>
      <description><![CDATA[Tried rolling chaos back to build 41 first. The deploy guard refuses a lower build number on a live channel, so the fix shipped forward as the next build instead.]]></description>
    </item>
    <item>
      <title>Client: Found why the new title screen burn opening never played in built clients even though it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-af9df11cd16a</guid>
      <pubDate>Sun, 19 Jul 2026 14:01:13 -0500</pubDate>
      <description><![CDATA[Found why the new title screen burn opening never played in built clients even though it worked in the editor: the UI system resolves widget shaders by name, and shaders that ship inside asset bundles are invisible to that lookup in a real build, so the burn shader was silently swapped for a plain one. The material already knows its shader, so the lookup miss now keeps it. Rides the next build.]]></description>
    </item>
    <item>
      <title>Client: Fixed the startup hang that left players on a black screen with no title screen. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-43cfaf7d9c52</guid>
      <pubDate>Sun, 19 Jul 2026 18:37:35 -0500</pubDate>
      <description><![CDATA[Fixed the startup hang that left players on a black screen with no title screen. The client was running a synchronous asset load from the main thread while a bundle was still mounting in the background, and the mount could only finish on a main thread tick, so the main thread ended up waiting on itself and never recovered. Bundle mounts now track whether they are still in flight, and any pending mount is finished before a blocking load starts.]]></description>
    </item>
    <item>
      <title>Client: Boot telemetry from the last build made the hang findable: one launch in five was not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-264aa1075440</guid>
      <pubDate>Sun, 19 Jul 2026 18:37:44 -0500</pubDate>
      <description><![CDATA[Boot telemetry from the last build made the hang findable: one launch in five was not reaching the title screen (90 boot heartbeats started against 72 that finished over 36 hours), on four different testers and three graphics vendors, which ruled out the per-machine theories the bug had collected. Stalls that recover now report to the log server, so the near misses show up before they turn into a hang.]]></description>
    </item>
    <item>
      <title>Client: Spread the spell effect prewarm across frames instead of running about 460 prefab loads…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-846f2b0bee59</guid>
      <pubDate>Sun, 19 Jul 2026 18:37:44 -0500</pubDate>
      <description><![CDATA[Spread the spell effect prewarm across frames instead of running about 460 prefab loads in a single frame. The window stays responsive while it happens, and the title screen still waits for it to finish so nothing reaches the world with missing effects.]]></description>
    </item>
    <item>
      <title>Client: Restored a loading-screen fix that a bad code sync had quietly reverted. On DirectX 12…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-b4cfb5895ee5</guid>
      <pubDate>Sun, 19 Jul 2026 20:14:06 -0500</pubDate>
      <description><![CDATA[Restored a loading-screen fix that a bad code sync had quietly reverted. On DirectX 12 machines with a cold shader cache, the loading bar no longer stalls near the end for minutes, and a slow warmup again suggests switching to DX11.]]></description>
    </item>
    <item>
      <title>Client: Fixed the Windows and Mac client builds, which had started failing to compile. A recent…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d74d9b36b746</guid>
      <pubDate>Sun, 19 Jul 2026 23:20:36 -0500</pubDate>
      <description><![CDATA[Fixed the Windows and Mac client builds, which had started failing to compile. A recent Linux mouse fix was being pulled into every platform's build, and it referenced a Linux-only system library that Windows and Mac do not have.]]></description>
    </item>
    <item>
      <title>Jenkins: Diagnosed why the nightly Windows client build ran 43 minutes against 12 for Linux: about…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-18e53ad2c7f9</guid>
      <pubDate>Sun, 19 Jul 2026 03:54:29 -0500</pubDate>
      <description><![CDATA[Diagnosed why the nightly Windows client build ran 43 minutes against 12 for Linux: about 15 minutes was the CI system itself copying the 15 GB build zip to the build server at 17 MB/s through its own encrypted, compressed transfer channel, while the same wire moves 106 MB/s raw. Windows builds now push the zip directly over the network in about 2.5 minutes and hand the deploy a pointer instead; the deploy verifies the file size before using it.]]></description>
    </item>
    <item>
      <title>UI: The four new UI themes gained ornamental corner graphics: an engraved flourish border…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8d0cc2486074</guid>
      <pubDate>Sun, 19 Jul 2026 04:03:33 -0500</pubDate>
      <description><![CDATA[The four new UI themes gained ornamental corner graphics: an engraved flourish border derived from the game's book ornament art, drawn in each theme's accent color (molten orange, copper, ink, violet). The standard look is unchanged.]]></description>
    </item>
    <item>
      <title>UI: Raised window opacity across the new themes after feedback that they read as far more…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-e72414d479f8</guid>
      <pubDate>Sun, 19 Jul 2026 04:03:33 -0500</pubDate>
      <description><![CDATA[Raised window opacity across the new themes after feedback that they read as far more translucent than the standard look, the bright Air theme especially. Panel fills now run near solid and Air's frost art was rebuilt denser.]]></description>
    </item>
    <item>
      <title>UI: Hardened theme loading against a startup edge case: a failed load now falls back to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-6937181c216d</guid>
      <pubDate>Sun, 19 Jul 2026 04:03:33 -0500</pubDate>
      <description><![CDATA[Hardened theme loading against a startup edge case: a failed load now falls back to the standard look and retries later, and can no longer break a window's update loop.]]></description>
    </item>
    <item>
      <title>UI: Built the Theme Editor : a new Options Themes tab holds the UI Theme dropdown, a Custom…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-2f8775895f5b</guid>
      <pubDate>Sun, 19 Jul 2026 05:00:28 -0500</pubDate>
      <description><![CDATA[Built the <b>Theme Editor</b>: a new Options Themes tab holds the UI Theme dropdown, a Custom Theme dropdown, and a button opening an editor window where the named themes become base values. Every color in the theme contract can be changed with sliders or hex (window opacity included), plus ambient motion, corner ornaments, and title and body fonts. Changes preview live on open windows.]]></description>
    </item>
    <item>
      <title>UI: Custom themes save locally under player-chosen names, up to 20, and apply across…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-4ba050cd067a</guid>
      <pubDate>Sun, 19 Jul 2026 05:00:28 -0500</pubDate>
      <description><![CDATA[Custom themes save locally under player-chosen names, up to 20, and apply across sessions. <b>Copy Code</b> puts a theme on the clipboard as a short text code and <b>Paste Code</b> imports one, so players can trade themes. Codes are parsed defensively: size caps, an allow list for color names, and clamped values, so a damaged code is one error message.]]></description>
    </item>
    <item>
      <title>UI: The theme editor is itself a new-style window and follows the active theme while you…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-da3c8b1771f0</guid>
      <pubDate>Sun, 19 Jul 2026 05:00:28 -0500</pubDate>
      <description><![CDATA[The theme editor is itself a new-style window and follows the active theme while you edit, which made it its own test case. Editing works because the base theme sheet is cloned in memory and its color table patched; the engine offers no way to author styles at runtime, and a test pins the internals so an engine upgrade fails loudly instead of silently.]]></description>
    </item>
    <item>
      <title>UI: Fixed the pet character sheet ignoring summon damage enchants (#830): jewelry with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-cae86ff23e9f</guid>
      <pubDate>Sun, 19 Jul 2026 08:02:16 -0500</pubDate>
      <description><![CDATA[Fixed the pet character sheet ignoring summon damage enchants (#830): jewelry with Summoned Water Creature Damage or Summoned Death Creature Damage always raised the summon's real damage, but the sheet's Damage range never moved. The sheet now evaluates the summon's actual attack formula, so the enchant, school mastery, and summon damage bonus all show in the displayed range.]]></description>
    </item>
    <item>
      <title>UI: Added an EditMode regression suite pinning the water and death summon attack formulas…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-e12e0bfccb35</guid>
      <pubDate>Sun, 19 Jul 2026 08:02:22 -0500</pubDate>
      <description><![CDATA[Added an EditMode regression suite pinning the water and death summon attack formulas: rune data must keep reading the owner's creature damage stat, and the evaluated damage must scale with it.]]></description>
    </item>
    <item>
      <title>UI: First real NGUI to UI Toolkit conversion landed: the game's generic confirmation dialogs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8f37f8c3a4e0</guid>
      <pubDate>Sun, 19 Jul 2026 09:28:02 -0500</pubDate>
      <description><![CDATA[First real NGUI to UI Toolkit conversion landed: the game's generic confirmation dialogs (Yes/No confirms, type-a-word safety confirms, and pick-an-option prompts) now render through a shared themed modal host on the new UI. The existing game code is untouched; about 70 call sites present the new dialogs automatically.]]></description>
    </item>
    <item>
      <title>UI: Settled a standing layering question while verifying: UI Toolkit panels draw above the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-f210882a2b70</guid>
      <pubDate>Sun, 19 Jul 2026 09:28:03 -0500</pubDate>
      <description><![CDATA[Settled a standing layering question while verifying: UI Toolkit panels draw above the old NGUI UI (the docs said the opposite). Converted dialogs sit correctly on top of legacy windows, and clicks on anything behind an open dialog are blocked, matching the old behavior.]]></description>
    </item>
    <item>
      <title>UI: Old-style color and bold markup in dialog text now converts to the new UI's rich text, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8087fdd0f8f2</guid>
      <pubDate>Sun, 19 Jul 2026 09:28:04 -0500</pubDate>
      <description><![CDATA[Old-style color and bold markup in dialog text now converts to the new UI's rich text, so existing messages render unchanged. 17 new editor tests cover the converter, the type-a-word match rule, and a guard that the retired dialog registrations stay gone.]]></description>
    </item>
    <item>
      <title>UI: The queued informational popups (permission errors, mail notices, and similar OK boxes)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d1a5820caa23</guid>
      <pubDate>Sun, 19 Jul 2026 10:01:50 -0500</pubDate>
      <description><![CDATA[The queued informational popups (permission errors, mail notices, and similar OK boxes) followed the confirmation dialogs onto UI Toolkit. Queue behavior is unchanged: repeated messages are dropped, messages show one after another, urgent ones jump the line, and about 110 calling files present the new popup with no code changes.]]></description>
    </item>
    <item>
      <title>UI: The zone loading screen moved to UI Toolkit as well: same artwork, loading tips, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1b3432612797</guid>
      <pubDate>Sun, 19 Jul 2026 10:01:51 -0500</pubDate>
      <description><![CDATA[The zone loading screen moved to UI Toolkit as well: same artwork, loading tips, and progress readout, rebuilt on the new stack and drawn above every other window. The scene-load flow drives it through the same calls as before, verified in the Editor with a full show, progress update, and fade-out pass.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Options Themes tab from tester feedback: the tab was labeled Interface a second…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-794a462ace5c</guid>
      <pubDate>Sun, 19 Jul 2026 10:01:52 -0500</pubDate>
      <description><![CDATA[Fixed the Options Themes tab from tester feedback: the tab was labeled Interface a second time, both of its dropdowns said Share location, and cloned multiplayer settings (matchmaking buttons, a version line) sat on the tab. It now reads Themes, the dropdowns are UI Theme and Custom Theme, and only theme content remains.]]></description>
    </item>
    <item>
      <title>UI: Deleted the five old-UI dialog prefabs and four view classes that the conversions…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1ac4ba6489b8</guid>
      <pubDate>Sun, 19 Jul 2026 10:28:13 -0500</pubDate>
      <description><![CDATA[Deleted the five old-UI dialog prefabs and four view classes that the conversions replaced (confirmations, informational popup, loading screen), after reference sweeps confirmed nothing loads them. A guard test keeps them from coming back through a sync, so the old-UI inventory genuinely shrinks with each conversion.]]></description>
    </item>
    <item>
      <title>UI: Fixed popup and confirmation windows ignoring mouse clicks on OK, Yes, and No after the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-30f1a49113b9</guid>
      <pubDate>Sun, 19 Jul 2026 14:29:43 -0500</pubDate>
      <description><![CDATA[Fixed popup and confirmation windows ignoring mouse clicks on OK, Yes, and No after the UI Toolkit dialog conversion. A player report on the mail-expiry notice caught it; keyboard Escape and Enter had been masking the bug. The same fault could also deaden clicks in tip jars, game tables, and GM windows opened later in the session. 7caa7f31e4, verify task #863.]]></description>
    </item>
    <item>
      <title>UI: Fixed the Open Theme Editor button on the Options Themes tab drawing outside the window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-fb06df0d425e</guid>
      <pubDate>Sun, 19 Jul 2026 15:01:12 -0500</pubDate>
      <description><![CDATA[Fixed the Open Theme Editor button on the Options Themes tab drawing outside the window: it kept a leftover position from the panel row it was cloned from and rendered past the right edge of the frame. It now sits under the theme dropdowns, and a new layout test keeps the tab's controls inside the window.]]></description>
    </item>
    <item>
      <title>UI: Hardened input for the new UI Toolkit windows after the build 43 report of dead mouse…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d860feee345b</guid>
      <pubDate>Sun, 19 Jul 2026 15:18:35 -0500</pubDate>
      <description><![CDATA[Hardened input for the new UI Toolkit windows after the build 43 report of dead mouse clicks. Every window now starts its input through one shared path that repairs a broken input state instead of inheriting it, so clicks keep working no matter which window or popup opened first. A guard test now fails the build if a future window skips the shared path.]]></description>
    </item>
    <item>
      <title>UI: The theme editor can now be closed with the Esc key and resized from a new bottom right…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-14631a085d2e</guid>
      <pubDate>Sun, 19 Jul 2026 15:18:35 -0500</pubDate>
      <description><![CDATA[The theme editor can now be closed with the Esc key and resized from a new bottom right corner grip with a sensible minimum size. The mouse used to be its only control, so a dead click state could leave it stuck on screen with no way out.]]></description>
    </item>
    <item>
      <title>UI: Three Tip Jar fixes: the item icons are re-rendered with transparent backgrounds so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1414558a52f1</guid>
      <pubDate>Sun, 19 Jul 2026 16:17:50 -0500</pubDate>
      <description><![CDATA[Three Tip Jar fixes: the item icons are re-rendered with transparent backgrounds so the drag icon loses its black square, the owner setting for what visitors see is now a button that cycles the three modes instead of a dropdown that spilled outside the window, and the jar window closes itself on zone change (tracker #820).]]></description>
    </item>
    <item>
      <title>UI: The Body Markings and Face Markings lists in character creation are now translatable, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-6e09ca49c466</guid>
      <pubDate>Sun, 19 Jul 2026 16:17:50 -0500</pubDate>
      <description><![CDATA[The Body Markings and Face Markings lists in character creation are now translatable, and the raw internal names are gone: BirdPerched reads Bird Perched, TribalFloral1 reads Tribal Floral 1, and so on. 65 marking names and both section labels joined the translation database (tracker #784).]]></description>
    </item>
    <item>
      <title>UI: Groundwork for moving the Social window (Friends, Party, Guild) to the new UI framework…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-94c832ad021a</guid>
      <pubDate>Sun, 19 Jul 2026 17:00:57 -0500</pubDate>
      <description><![CDATA[Groundwork for moving the Social window (Friends, Party, Guild) to the new UI framework: ported its behavior rules (list sorting, permission gated buttons, party tab flow, pending friend request handling) into a standalone module with full test coverage. The visual rebuild lands next, including a new Accept All button for friend requests.]]></description>
    </item>
    <item>
      <title>UI: Animal Trainers now appear under Trainers in the overworld town hover info for Aerie…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-39bc58b19ec7</guid>
      <pubDate>Sun, 19 Jul 2026 18:18:53 -0500</pubDate>
      <description><![CDATA[Animal Trainers now appear under Trainers in the overworld town hover info for Aerie, Brittany Fields, Castle Atos, Owls Head, and Port Harmony. Nob in Owls Head (previously titled Stableboy) and Oakley in Brittany Fields (previously untitled) now show the Animal Trainer title like their counterparts elsewhere.]]></description>
    </item>
    <item>
      <title>UI: Converted the Social window (Friends, Party, Guild) to the new UI framework, the first of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-babeb970116d</guid>
      <pubDate>Sun, 19 Jul 2026 17:38:30 -0500</pubDate>
      <description><![CDATA[Converted the Social window (Friends, Party, Guild) to the new UI framework, the first of the big windows to make the jump. Same tabs, filter, sorting, permissions, and party flows as before; the old window's 1,500-line state machine is retired and the rules now live in a tested module. The F key, window selector, Escape, and pinning all work unchanged.]]></description>
    </item>
    <item>
      <title>UI: New on the Friends tab: an Accept All button appears when you have pending friend…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-ad15977263b3</guid>
      <pubDate>Sun, 19 Jul 2026 17:38:32 -0500</pubDate>
      <description><![CDATA[New on the Friends tab: an <b>Accept All</b> button appears when you have pending friend requests and takes every request in one click.]]></description>
    </item>
    <item>
      <title>Planning: Planned the next step for UI themes: a dedicated Options tab where the named themes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-408f2ab143b1</guid>
      <pubDate>Sun, 19 Jul 2026 04:03:33 -0500</pubDate>
      <description><![CDATA[Planned the next step for UI themes: a dedicated Options tab where the named themes become base presets you can tune (colors, opacity, motion, fonts), save under your own name, and share with other players as a short text code.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Fixed the tip jar follow-ups from the overnight logs: collected tips now show as "Tips…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9e51e06bff94</guid>
      <pubDate>Sun, 19 Jul 2026 04:10:19 -0500</pubDate>
      <description><![CDATA[Fixed the tip jar follow-ups from the overnight logs: collected tips now show as "Tips collected" in the bank redemption list instead of an error placeholder, depositing a tip no longer throws a client error while updating your gold, and player-written mail opens with a proper letter body. Covered by new automated tests.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Tester accounts can now enter test scenes like the Island Challenge. The server refused…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1c6a9b1b89b1</guid>
      <pubDate>Sun, 19 Jul 2026 04:10:19 -0500</pubDate>
      <description><![CDATA[Tester accounts can now enter test scenes like the Island Challenge. The server refused them before, which made the Island Challenge verify task impossible to run.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Removed the retired Kobold Battle Camp zone from the Teleport to Zone destination list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-b43b4273e0e8</guid>
      <pubDate>Sun, 19 Jul 2026 15:09:21 -0500</pubDate>
      <description><![CDATA[Removed the retired Kobold Battle Camp zone from the Teleport to Zone destination list (tracker #821). It was an unfinished early version of the kobold camp with no arena fight and no boss, and a player teleported in expecting the wave battle. The finished fight lives in Kobold Expeditionary Camp, which is unchanged. A data test now keeps the old zone delisted.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Fixed the in-game tester verification board rejecting Claim This Task for developer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-54b6a80de534</guid>
      <pubDate>Sun, 19 Jul 2026 15:38:40 -0500</pubDate>
      <description><![CDATA[Fixed the in-game tester verification board rejecting Claim This Task for developer accounts with a tracker error. Developer accounts now get the same claim permissions testers already had; tester accounts were never affected.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Elder Bodil, the shaman elder of Tanglemire, is a male character but spoke with a woman's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-973d9eda6d4c</guid>
      <pubDate>Sun, 19 Jul 2026 17:46:56 -0500</pubDate>
      <description><![CDATA[Elder Bodil, the shaman elder of Tanglemire, is a male character but spoke with a woman's voice. Recast him to an older male voice and regenerated 519 clips covering his dialogue, his ambient lines, and one shared villager line. The new voice is live now and needs no client update.]]></description>
    </item>
    <item>
      <title>Bug Fixes: Fixed the mixed pronouns around Bodil: one villager line said "Her spirit warders" about…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-6ade3266ca2e</guid>
      <pubDate>Sun, 19 Jul 2026 17:46:56 -0500</pubDate>
      <description><![CDATA[Fixed the mixed pronouns around Bodil: one villager line said "Her spirit warders" about him, and lines in German, Spanish, French, Italian, Portuguese, Russian, and Chinese described him as a woman. All of them now refer to him as a man. The text fixes ride the next build.]]></description>
    </item>
    <item>
      <title>Server: Pulled 10 hours of chaos logs and cleaned up the noise they exposed: the per-hit PvP…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d86025a874dc</guid>
      <pubDate>Sun, 19 Jul 2026 04:10:26 -0500</pubDate>
      <description><![CDATA[Pulled 10 hours of chaos logs and cleaned up the noise they exposed: the per-hit PvP damage trace no longer floods the warning stream (one duel produced about 500 lines), routine server rejections like the tip jar rate limit no longer log as client errors, and the player-run village false alarm ("no PotInfo") at town spin-up is fixed for all 23 villages.]]></description>
    </item>
    <item>
      <title>Networking: Dug into why nobody plays the native Linux client: server logs show zero native Linux…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-2427e5f54450</guid>
      <pubDate>Sun, 19 Jul 2026 04:10:57 -0500</pubDate>
      <description><![CDATA[Dug into why nobody plays the native Linux client: server logs show zero native Linux logins since the channel launched. The two players who do play from Linux run the Windows build through Proton, and one of them keeps the native install synced daily but can never use it.]]></description>
    </item>
    <item>
      <title>Networking: Reproduced it by running the Linux build on the build machine under the test harness: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-b233ca2de2b7</guid>
      <pubDate>Sun, 19 Jul 2026 04:11:04 -0500</pubDate>
      <description><![CDATA[Reproduced it by running the Linux build on the build machine under the test harness: the client threw during the connection handshake and retried forever. The handshake capped the version identity string at 32 bytes; the Windows string is exactly 32 and the Linux one is 34. Raised the cap to 64 and made oversize strings truncate instead of aborting the connect. Windows would have hit the same wall at build 100. Fix rides the next chaos build, with handshake tests covering both strings.]]></description>
    </item>
    <item>
      <title>Networking: The handshake fix shipped on chaos build 40 and worked immediately: within the hour a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-ddef8d59db6d</guid>
      <pubDate>Sun, 19 Jul 2026 10:16:03 -0500</pubDate>
      <description><![CDATA[The handshake fix shipped on chaos build 40 and worked immediately: within the hour a player was in the world on the native Linux client, the first native Linux login the shard has ever seen. Our automated harness confirmed it too, logging in and running commands end to end.]]></description>
    </item>
    <item>
      <title>Networking: That first Linux player then crashed three times in six minutes. Server logs show clean…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-2fded270371c</guid>
      <pubDate>Sun, 19 Jul 2026 10:16:10 -0500</pubDate>
      <description><![CDATA[That first Linux player then crashed three times in six minutes. Server logs show clean play then abrupt silence, and a core dump we captured points at a rendering worker thread crash under threaded OpenGL. Shipped a Linux-only mitigation that turns graphics jobs off in the Linux build; Windows keeps its threaded rendering. Awaiting the next build and the player's verdict.]]></description>
    </item>
    <item>
      <title>Networking: Verified the Linux rendering mitigation on chaos build 43: the native client logged in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-4f6a31a1e155</guid>
      <pubDate>Sun, 19 Jul 2026 14:10:58 -0500</pubDate>
      <description><![CDATA[Verified the Linux rendering mitigation on chaos build 43: the native client logged in, entered a level, ran commands, and held a 10 minute in-world soak with a clean log. Build 40 sessions could die inside two minutes. Waiting on real player reports to call it fixed.]]></description>
    </item>
    <item>
      <title>Networking: The Linux player confirmed build 43 still drops about ninety seconds into the world, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-318114a4d021</guid>
      <pubDate>Sun, 19 Jul 2026 14:52:59 -0500</pubDate>
      <description><![CDATA[The Linux player confirmed build 43 still drops about ninety seconds into the world, so single-threaded rendering was not the cure. The crash lives in the OpenGL driver path. The shipped build also carries a Vulkan renderer, and it checked out on our test rig (correct rendering, full login to in-world), so the player now has a one-line launch option to switch drivers while we decide whether Vulkan becomes the Linux default.]]></description>
    </item>
    <item>
      <title>Networking: The Linux crash mystery is solved, courtesy of the first automatic Linux crash upload: a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-f524fe1aa5a3</guid>
      <pubDate>Sun, 19 Jul 2026 17:31:07 -0500</pubDate>
      <description><![CDATA[The Linux crash mystery is solved, courtesy of the first automatic Linux crash upload: a native mouse-cursor helper in the game only speaks the older X11 display protocol, and on a Wayland desktop the first call into it, typically closing an in-game window a few minutes in, killed the whole process at the dynamic-linker level. No graphics driver could have mattered, and our X11 test rig could never reproduce it. Rebuilt the helper with proper linkage and Wayland-safe behavior, verified both modes on the build machine; fix rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Build Farm: Moved the nightly server-reports build from 3:00 AM to 10:00 PM Central. At the old slot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-e212447ca840</guid>
      <pubDate>Sun, 19 Jul 2026 04:12:47 -0500</pubDate>
      <description><![CDATA[Moved the nightly server-reports build from 3:00 AM to 10:00 PM Central. At the old slot it queued behind the midnight chaos release and did not actually start until about 5:00 AM; now the roughly hour-long run has the Windows build machine to itself and finishes before the release window opens.]]></description>
    </item>
    <item>
      <title>Build Farm: Fixed the new fast artifact upload for Windows client builds: a path quoting bug made the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-af0c82d82b83</guid>
      <pubDate>Sun, 19 Jul 2026 06:13:36 -0500</pubDate>
      <description><![CDATA[Fixed the new fast artifact upload for Windows client builds: a path quoting bug made the direct copy fail on its first run and fall back to the old slow upload. Also fixed that failed copy wrongly marking an otherwise good build as failed, which cost this morning's release run.]]></description>
    </item>
    <item>
      <title>Build Farm: Raised the build workstation's network link from 1 Gbps to 2.5 Gbps (the adapter…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d405b7634666</guid>
      <pubDate>Sun, 19 Jul 2026 06:13:37 -0500</pubDate>
      <description><![CDATA[Raised the build workstation's network link from 1 Gbps to 2.5 Gbps (the adapter supported it but was capped in driver settings). Measured build artifact transfers at about 250 MB/s; the 15 GB Windows client package should now upload in about a minute instead of 15.]]></description>
    </item>
    <item>
      <title>Rendering: Imported the Beautify post-processing plugin and the HBAO ambient occlusion plugin into…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-f319b7c756fc</guid>
      <pubDate>Sun, 19 Jul 2026 05:51:55 -0500</pubDate>
      <description><![CDATA[Imported the <b>Beautify</b> post-processing plugin and the <b>HBAO</b> ambient occlusion plugin into the client project. First step of a post-effect overhaul that will bring per scene visual tuning and post effect trigger volumes.]]></description>
    </item>
    <item>
      <title>Scene Analysis: Scene cards on the dev portal scene browser now carry a live quick-stat line: frame rate…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-660a143750d9</guid>
      <pubDate>Sun, 19 Jul 2026 05:53:30 -0500</pubDate>
      <description><![CDATA[Scene cards on the dev portal scene browser now carry a live quick-stat line: frame rate (tinted red under 20, yellow under 30) and average zone load seconds from the last 14 days. New sort orders put the worst FPS or the slowest loads first.]]></description>
    </item>
    <item>
      <title>Scene Analysis: The scene analytics feed now reads the newer client performance telemetry: typical and 1%…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-543ead0067b4</guid>
      <pubDate>Sun, 19 Jul 2026 05:53:40 -0500</pubDate>
      <description><![CDATA[The scene analytics feed now reads the newer client performance telemetry: typical and 1% low frame rate, CPU vs GPU frame cost, stall counts, a per-phase zone load breakdown, and scene memory cost. Detail pages show all of it; the load panel names the slowest phases per scene.]]></description>
    </item>
    <item>
      <title>Audio: Bloodbone Skeletons now speak with a gravelly, hoarse undead voice instead of a normal…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-166f62b6ce69</guid>
      <pubDate>Sun, 19 Jul 2026 06:02:19 -0500</pubDate>
      <description><![CDATA[Bloodbone Skeletons now speak with a gravelly, hoarse undead voice instead of a normal human voice, fixing a player report. Covers the Footman, Archer, Mage, and Ichor Witch; shipped as a voice data update, so it reaches players on the next game start with no new build.]]></description>
    </item>
    <item>
      <title>Audio: Fixed Captive The Boy in Ardoris speaking with a child's voice despite his grown-man…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-4c24ea456879</guid>
      <pubDate>Sun, 19 Jul 2026 06:26:03 -0500</pubDate>
      <description><![CDATA[Fixed Captive The Boy in Ardoris speaking with a child's voice despite his grown-man model (tracker #831). The voice casting had read the name "The Boy" as a child and picked a kid's voice; he is recast to a proper adult male voice. Live already, no build needed.]]></description>
    </item>
    <item>
      <title>Audio: Tomas Cucu, the Aerie shrine caretaker, gets his voice: his conversation prefab still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1f7fcf14d9ad</guid>
      <pubDate>Sun, 19 Jul 2026 14:28:13 -0500</pubDate>
      <description><![CDATA[Tomas Cucu, the Aerie shrine caretaker, gets his voice: his conversation prefab still carried stale data from an Etceter pilgrim, so the voice pipeline had him filed under the wrong name and never generated his lines (tracker #851).]]></description>
    </item>
    <item>
      <title>Audio: Shrine caretakers now speak their shared lore aloud. The voice generator resolved shared…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-27fc1caf1a1d</guid>
      <pubDate>Sun, 19 Jul 2026 14:28:13 -0500</pubDate>
      <description><![CDATA[Shrine caretakers now speak their shared lore aloud. The voice generator resolved shared dialogue includes by name only and dropped the Global copy, so lines like the Ardoris shrine responses of Chen and Yen displayed as text but never played. The fix closes the same gap for every NPC with shared dialogue, about 7,000 lines game-wide (tracker #851).]]></description>
    </item>
    <item>
      <title>Audio: NPC voices stop reading stage directions aloud. Natasha in Aerie was saying the word…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-5a16d3841e5d</guid>
      <pubDate>Sun, 19 Jul 2026 14:28:13 -0500</pubDate>
      <description><![CDATA[NPC voices stop reading stage directions aloud. Natasha in Aerie was saying the word "sniff" in her farewell; sniff, sigh, cough, chuckle and similar asterisk-wrapped directions are now skipped by the voice while the text keeps them (tracker #850).]]></description>
    </item>
    <item>
      <title>Audio: Fixed two wrong-gender NPC voices: Isabel Spalding in Aerie (record marked male, now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-0aa62f440e40</guid>
      <pubDate>Sun, 19 Jul 2026 14:28:13 -0500</pubDate>
      <description><![CDATA[Fixed two wrong-gender NPC voices: Isabel Spalding in Aerie (record marked male, now voiced by a female voice, tracker #848) and the Orator in Soltown Catacombs (record had no gender and fell to a female-sounding voice, now male, tracker #823).]]></description>
    </item>
    <item>
      <title>Audio: The Visitor by the Castle Atos entrance had a male model paired with a female voice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-ea8d3d77d611</guid>
      <pubDate>Sun, 19 Jul 2026 14:28:13 -0500</pubDate>
      <description><![CDATA[The Visitor by the Castle Atos entrance had a male model paired with a female voice record; the spawner now uses a female model to match (tracker #824).]]></description>
    </item>
    <item>
      <title>Audio: Muting one NPC no longer silences the speaking voice of every NPC of the same type…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-93eb3843d4ae</guid>
      <pubDate>Sun, 19 Jul 2026 14:28:13 -0500</pubDate>
      <description><![CDATA[Muting one NPC no longer silences the speaking voice of every NPC of the same type. Generic NPCs share a record behind the scenes, so muting a single guard muted face-to-face replies from every guard like him, which is the likely story behind the silent Castle Atos guard (tracker #806). Mute now covers ambient chatter and death cries only.]]></description>
    </item>
    <item>
      <title>Audio: Generated and published the voice update carrying all of the above: 7,571 new spoken…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-c56a484ea1bb</guid>
      <pubDate>Sun, 19 Jul 2026 15:39:40 -0500</pubDate>
      <description><![CDATA[Generated and published the voice update carrying all of the above: 7,571 new spoken lines (about 920k characters of speech) covering Tomas Cucu, the shared shrine-caretaker lore game-wide, the stage-direction fixes, and the recast voices. Live on chaos; clients pick it up on next login with no new build.]]></description>
    </item>
    <item>
      <title>Audio: Ebon Cultists, siege engineers, and the Ravenswood bandits swap their calm narrator voice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-baa1d93a4cd7</guid>
      <pubDate>Sun, 19 Jul 2026 15:39:40 -0500</pubDate>
      <description><![CDATA[Ebon Cultists, siege engineers, and the Ravenswood bandits swap their calm narrator voice for a gravelly aggressive one after tester feedback that their combat threats sounded flat (tracker #815).]]></description>
    </item>
    <item>
      <title>Audio: Swapped the overworld ambience at Tanglemire's map marker from the generic cheerful town…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-95b23380825e</guid>
      <pubDate>Sun, 19 Jul 2026 15:59:12 -0500</pubDate>
      <description><![CDATA[Swapped the overworld ambience at Tanglemire's map marker from the generic cheerful town loop to the bog ambience heard inside the town. Other towns on the travel map keep the standard town sounds.]]></description>
    </item>
    <item>
      <title>Mac Client: Fixed two startup black screens in the macOS client. Game asset bundles were being…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8ea13c2a4fcf</guid>
      <pubDate>Sun, 19 Jul 2026 06:33:40 -0500</pubDate>
      <description><![CDATA[Fixed two startup black screens in the macOS client. Game asset bundles were being packaged into the wrong folder inside the app bundle, and a missing audio library crashed the loading sequence instead of just muting sound. The Mac client now boots to the title screen.]]></description>
    </item>
    <item>
      <title>Mac Client: First hands-on test of the Mac client, built by the new Mac build agent and verified on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-d83c19048ed0</guid>
      <pubDate>Sun, 19 Jul 2026 06:33:40 -0500</pubDate>
      <description><![CDATA[First hands-on test of the Mac client, built by the new Mac build agent and verified on an Apple Silicon laptop against the chaos shard. Audio and Steam stay disabled on Mac until updated native libraries land.]]></description>
    </item>
    <item>
      <title>Mac Client: The tester page now has a direct download for the Mac client. The file refreshes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-4eec1d1ab0ec</guid>
      <pubDate>Sun, 19 Jul 2026 09:15:08 -0500</pubDate>
      <description><![CDATA[The tester page now has a direct download for the Mac client. The file refreshes automatically after every release so it always matches the shard. First release through the new pipeline shipped Windows, Linux, and Mac together.]]></description>
    </item>
    <item>
      <title>Build Pipeline: Nightly releases now also build a Mac client with the matching version number, so a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-3c0b08b4dea4</guid>
      <pubDate>Sun, 19 Jul 2026 06:33:50 -0500</pubDate>
      <description><![CDATA[Nightly releases now also build a Mac client with the matching version number, so a side-loaded Mac client can log into the chaos shard. The Mac step is best-effort and never blocks a release if the Mac build machine is unavailable.]]></description>
    </item>
    <item>
      <title>Build Pipeline: After each release deploys, the pipeline now refreshes the Mac client download that the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-c131de219701</guid>
      <pubDate>Sun, 19 Jul 2026 07:02:53 -0500</pubDate>
      <description><![CDATA[After each release deploys, the pipeline now refreshes the Mac client download that the tester page links, so the download always matches the shard version.]]></description>
    </item>
    <item>
      <title>Build Pipeline: Fixed the Mac build artifact shipping at twice its size. The app bundle kept obsolete…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-bf8815d6a9f7</guid>
      <pubDate>Sun, 19 Jul 2026 09:15:09 -0500</pubDate>
      <description><![CDATA[Fixed the Mac build artifact shipping at twice its size. The app bundle kept obsolete asset copies from older builds inside itself; the packaging step now removes them, cutting the download roughly in half.]]></description>
    </item>
    <item>
      <title>Launcher: Launcher build 17: fixed a gap in the new bad-exit detection found by watching a live…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8607b5b61a68</guid>
      <pubDate>Sun, 19 Jul 2026 07:34:34 -0500</pubDate>
      <description><![CDATA[Launcher build 17: fixed a gap in the new bad-exit detection found by watching a live case. The rule only armed once the game had written its clean-shutdown stamp at least once, but a player whose every session freezes never writes it at all. The launcher now decides from the installed game version instead, so the very first stuck session after updating uploads its log.]]></description>
    </item>
    <item>
      <title>Launcher: Two more remedies for the startup black screen, ready for the next launcher build: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-a86183d52cd1</guid>
      <pubDate>Sun, 19 Jul 2026 07:51:58 -0500</pubDate>
      <description><![CDATA[Two more remedies for the startup black screen, ready for the next launcher build: the launcher now sets the Windows per-app GPU preference for the game (the setting a player would otherwise dig out of Windows display options; an explicit player choice is never overwritten), and the debug panel gains a Clear GPU cache button that wipes the NVIDIA driver shader caches, which rebuild on the next start.]]></description>
    </item>
    <item>
      <title>Launcher: Launcher build 18 published: the GPU preference write and the Clear GPU cache button are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9a42318fab34</guid>
      <pubDate>Sun, 19 Jul 2026 08:01:00 -0500</pubDate>
      <description><![CDATA[Launcher build 18 published: the GPU preference write and the Clear GPU cache button are live, and installed launchers update themselves on next start.]]></description>
    </item>
    <item>
      <title>Launcher: Added a Graphics picker to the Linux launcher, matching the one Windows players have…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9ced28f5f5f2</guid>
      <pubDate>Sun, 19 Jul 2026 15:05:19 -0500</pubDate>
      <description><![CDATA[Added a Graphics picker to the Linux launcher, matching the one Windows players have: OpenGL or Vulkan, remembered between sessions, applied at game start. Vulkan is the recommended setting for the players hitting the OpenGL crash while we decide on the long-term default. Shipped as launcher version 19; installed launchers update themselves on next start.]]></description>
    </item>
    <item>
      <title>Launcher: Vulkan did not save the Linux player either: both graphics drivers crash the same way a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-5fa7270b4d6b</guid>
      <pubDate>Sun, 19 Jul 2026 16:19:10 -0500</pubDate>
      <description><![CDATA[Vulkan did not save the Linux player either: both graphics drivers crash the same way a couple of minutes into the world, while the same machine plays for hours through the Windows compatibility layer. That moves the suspect from graphics to the native client itself, and the missing piece is the log file the crash leaves on the player machine. The launcher crash reporter, previously Windows-only, now runs on Linux too: launcher version 20 detects an unclean exit and uploads the session log automatically, including retroactively for the last crash. Shipped and self-updating.]]></description>
    </item>
    <item>
      <title>Investigations: The startup telemetry paid off on its first day: the black-screen tester ran chaos build…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-7cd8b28f10f3</guid>
      <pubDate>Sun, 19 Jul 2026 07:34:34 -0500</pubDate>
      <description><![CDATA[The startup telemetry paid off on its first day: the black-screen tester ran chaos build 39 three times and every session reported its boot stage before going quiet. The freeze is during the login scene load itself, before the title screen, shader warmup, or menu are ever reached, and it happens on both DirectX 11 and DirectX 12. Waiting on the automatic log upload for the exact stopping line.]]></description>
    </item>
    <item>
      <title>Investigations: The first automatic startup-failure reports arrived within minutes of launcher build 17…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-151a94ca7318</guid>
      <pubDate>Sun, 19 Jul 2026 07:39:09 -0500</pubDate>
      <description><![CDATA[The first automatic startup-failure reports arrived within minutes of launcher build 17 going out: the stuck player retried twice and both session logs uploaded themselves. The freeze point is now pinned to the early shader loading pass, his log always ends at the same shader, and a second player with near identical laptop hardware hit the same stall exactly once and recovered. Filed with full detail on the tracker; cache clearing steps are on their way to the player while the next build adds the frame heartbeat that settles frozen versus black.]]></description>
    </item>
    <item>
      <title>Creatures: Fixed distant creatures bouncing and freezing (#827). Past the visibility range the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8f7e0fe6a04b</guid>
      <pubDate>Sun, 19 Jul 2026 07:47:28 -0500</pubDate>
      <description><![CDATA[Fixed distant creatures bouncing and freezing (#827). Past the visibility range the client only gets occasional position updates, and playback snapped creatures back to their last known spot every frame. Starved creatures now hold in place, then glide to their next reported position, with a speed cap so the catch-up reads as walking.]]></description>
    </item>
    <item>
      <title>Creatures: Distant creatures also stay planted on the terrain now (a low-rate ground clamp runs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-7782cecbe3f7</guid>
      <pubDate>Sun, 19 Jul 2026 07:47:28 -0500</pubDate>
      <description><![CDATA[Distant creatures also stay planted on the terrain now (a low-rate ground clamp runs while their normal ground snap is off), and the range check gained an enter/exit band so creatures at the boundary no longer flicker between moving and frozen every second.]]></description>
    </item>
    <item>
      <title>Creatures: Moving creatures send a reliable position keyframe every 3 seconds instead of 10, so…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-39174a557601</guid>
      <pubDate>Sun, 19 Jul 2026 07:47:29 -0500</pubDate>
      <description><![CDATA[Moving creatures send a reliable position keyframe every 3 seconds instead of 10, so far-off observers see them wander rather than stand still. Added 20 EditMode tests over the new playback and range-band logic.]]></description>
    </item>
    <item>
      <title>GM Tools: Fixed the GM player window's Send CS Message action, which always failed with a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-a5cf99557a80</guid>
      <pubDate>Sun, 19 Jul 2026 14:29:43 -0500</pubDate>
      <description><![CDATA[Fixed the GM player window's Send CS Message action, which always failed with a character-not-found error even when the player was online. The window sends the target by name while the server only looked it up by internal id; the server now resolves names directly, the same way devoice requests already work.]]></description>
    </item>
    <item>
      <title>GM Tools: Fixed the GM prize mail window's item and recipient pickers: clicking a suggestion never…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9b4de363fe59</guid>
      <pubDate>Sun, 19 Jul 2026 14:29:43 -0500</pubDate>
      <description><![CDATA[Fixed the GM prize mail window's item and recipient pickers: clicking a suggestion never registered it, so the Add button refused to stage anything. Clicks now land before the popup closes, and the same fix covers every autocomplete field in the GM and tester tools.]]></description>
    </item>
    <item>
      <title>World: Flattened the uneven terrain under a town lot in Kingsport that rejected planting beds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-e35769a85ef0</guid>
      <pubDate>Sun, 19 Jul 2026 14:40:47 -0500</pubDate>
      <description><![CDATA[Flattened the uneven terrain under a town lot in Kingsport that rejected planting beds and other deco in its back corner (placement preview showed red). Reported on the forum. The fix rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Tester Tools: Added fly mode to the /tester tools window: a new Movement section with a FLY MODE toggle…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-bab9d4795d73</guid>
      <pubDate>Sun, 19 Jul 2026 14:42:16 -0500</pubDate>
      <description><![CDATA[Added fly mode to the /tester tools window: a new Movement section with a FLY MODE toggle and speed field (1 to 100). Flying detaches the camera from the character; leaving fly mode drops the character at the camera position, same behavior as the GM fly button. Window layout and button parameters are pinned by new EditMode tests. a9ef36092a, verify task #870.]]></description>
    </item>
    <item>
      <title>Tester Tools: The in-game verification board (/verify) can now be filtered: a toolbar box narrows the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-ae656735f15f</guid>
      <pubDate>Sun, 19 Jul 2026 17:02:02 -0500</pubDate>
      <description><![CDATA[The in-game verification board (/verify) can now be filtered: a toolbar box narrows the task list to tasks matching every typed word against number, title, build, and zone. The list also gained a column header row with new Zone and Age columns showing where each task's saved bug location is and how many days it has been open, and the list pane widened so titles stay readable. 13991b9dcc, verify task #892.]]></description>
    </item>
    <item>
      <title>Tester Tools: A This zone checkbox on the verification board shows only tasks whose saved bug location…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-3a41bfe1e2ec</guid>
      <pubDate>Sun, 19 Jul 2026 17:02:03 -0500</pubDate>
      <description><![CDATA[A This zone checkbox on the verification board shows only tasks whose saved bug location is the zone you are standing in, and re-filters when you change zones. Player-owned towns are told apart even when they share a template map.]]></description>
    </item>
    <item>
      <title>Tester Tools: Fixed the tester verdict automation flagging one of its own processing notes as new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-48b743946dee</guid>
      <pubDate>Sun, 19 Jul 2026 17:02:04 -0500</pubDate>
      <description><![CDATA[Fixed the tester verdict automation flagging one of its own processing notes as new tester work: every 15-minute check since last night launched a full review pass that found nothing. Checks now skip the automation account's own notes, so idle ticks finish immediately. 2f377e772c.]]></description>
    </item>
    <item>
      <title>Tester Tools: A Live only checkbox on the verification board, checked by default, hides tasks whose…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-436be4699f07</guid>
      <pubDate>Sun, 19 Jul 2026 17:10:32 -0500</pubDate>
      <description><![CDATA[A Live only checkbox on the verification board, checked by default, hides tasks whose change has not reached chaos yet. The build-deploy pass now also updates a task's Build line when it comments the build number, so carried tasks appear on the board the moment they go live. f0dc9f3355, verify task #892.]]></description>
    </item>
    <item>
      <title>Tester Tools: Marked 62 tester tasks as live on the tracker: their bodies still said the change was not…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-3d459c22f934</guid>
      <pubDate>Sun, 19 Jul 2026 17:26:29 -0500</pubDate>
      <description><![CDATA[Marked 62 tester tasks as live on the tracker: their bodies still said the change was not on chaos even though the carrying build had shipped and been confirmed in a comment, which would have hidden them from the new Live only view. The Build section on each now names the build. Tasks genuinely waiting on the next build keep their marker.]]></description>
    </item>
    <item>
      <title>Tester Tools: The 15-minute verdict automation now fixes those Build lines itself: once a deploy…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-c8d1c51daf32</guid>
      <pubDate>Sun, 19 Jul 2026 17:26:30 -0500</pubDate>
      <description><![CDATA[The 15-minute verdict automation now fixes those Build lines itself: once a deploy confirmation comment exists, the next pass rewrites the body line, with a guard so a task deliberately set back to waiting after a reverted fix stays waiting. Its first run caught 11 tasks the one-time pass had missed. a09f96d5ab.]]></description>
    </item>
    <item>
      <title>Tester Tools: Found and fixed a scheduling bug in the same automation: a time-zone slip in how it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1586a835d3bb</guid>
      <pubDate>Sun, 19 Jul 2026 17:26:31 -0500</pubDate>
      <description><![CDATA[Found and fixed a scheduling bug in the same automation: a time-zone slip in how it reloaded its progress marker meant that every evening after 7 PM Central it asked the tracker for tomorrow's updates, scanned nothing, and went blind until midnight. Verdicts posted in that window sat unprocessed until the next morning.]]></description>
    </item>
    <item>
      <title>Gameplay: Summoning a mount while holding the coconut halves now puts the coconuts away…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9f29d5c0a169</guid>
      <pubDate>Sun, 19 Jul 2026 15:03:53 -0500</pubDate>
      <description><![CDATA[Summoning a mount while holding the coconut halves now puts the coconuts away automatically and mounts up. Before, the summon was refused with a mounted error until both halves were manually unequipped.]]></description>
    </item>
    <item>
      <title>Gameplay: Mailboxes placed as decorations on player lots now open the mail window for any visitor…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-9a9757ef3cd9</guid>
      <pubDate>Sun, 19 Jul 2026 16:17:50 -0500</pubDate>
      <description><![CDATA[Mailboxes placed as decorations on player lots now open the mail window for any visitor. They had been silently refusing anyone without Guest access to the lot, even though a mailbox only ever shows your own mail (tracker #569).]]></description>
    </item>
    <item>
      <title>Gameplay: Characters no longer sink into the ground during emotes and looping animations such as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-852d307bb674</guid>
      <pubDate>Sun, 19 Jul 2026 16:17:50 -0500</pubDate>
      <description><![CDATA[Characters no longer sink into the ground during emotes and looping animations such as mining. The ground snap that keeps movement smooth over small bumps also ran while standing still on slopes and pulled the feet under the surface; it now applies only while moving, with a small cap (tracker #529).]]></description>
    </item>
    <item>
      <title>Gameplay: Player dungeons gain Dragon Totems : six tiers crafted at the smelting station from a new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-c404ccb57b41</guid>
      <pubDate>Sun, 19 Jul 2026 16:17:50 -0500</pubDate>
      <description><![CDATA[Player dungeons gain <b>Dragon Totems</b>: six tiers crafted at the smelting station from a new Dragon Essence field-dressing drop, hosted by the Rise Shaft room, which now accepts dragon totems and spawns a dragon scaled to the totem, from a red drake up to an elite clockwork dragon (tracker #625, from the forum wishlist).]]></description>
    </item>
    <item>
      <title>Oracle: The Oracle can now explain the harvesting swing meter: the Gathering Resources guide…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-1399d4d22f2e</guid>
      <pubDate>Sun, 19 Jul 2026 16:22:05 -0500</pubDate>
      <description><![CDATA[The Oracle can now explain the harvesting swing meter: the Gathering Resources guide covers the timing ring, the 12-hit chain cap, why missing never costs anything, and how gathering skill, Meticulous Collection, and Swift Gathering change the zone and sweep. Every number traced to the shipped values, added a What's New entry, deployed live and verified with live questions.]]></description>
    </item>
    <item>
      <title>Dev Portal: Built a character viewer for the internal dev portal: search any character and see stats…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8e26d041b8fa</guid>
      <pubDate>Sun, 19 Jul 2026 17:41:29 -0500</pubDate>
      <description><![CDATA[Built a character viewer for the internal dev portal: search any character and see stats, skills, gold, every item across bags, bank, mail and lot storage, owned lots, lot access, town roles, guild membership, and vendor listings on one page.]]></description>
    </item>
    <item>
      <title>Dev Portal: Added a fairy style name generator that suggests valid, unused names, wired into the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-97ea355c07bf</guid>
      <pubDate>Sun, 19 Jul 2026 17:41:30 -0500</pubDate>
      <description><![CDATA[Added a fairy style name generator that suggests valid, unused names, wired into the character page's rename form. The rename and sex change admin actions run through the game server's own rename operation with every attempt recorded in an audit log. Verified live end to end with a test character: renames apply in about 3 seconds, duplicate names are rejected, and a sex change updates both database records.]]></description>
    </item>
    <item>
      <title>Dev Portal: Added an AI assistant panel to the character page that answers questions about the loaded…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8a971cf1ac06</guid>
      <pubDate>Sun, 19 Jul 2026 17:41:30 -0500</pubDate>
      <description><![CDATA[Added an AI assistant panel to the character page that answers questions about the loaded character's data.]]></description>
    </item>
    <item>
      <title>Localization: Translated the rebuilt Social window and the Theme Editor into all seven supported…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-898bfbd7928a</guid>
      <pubDate>Sun, 19 Jul 2026 18:35:55 -0500</pubDate>
      <description><![CDATA[Translated the rebuilt Social window and the Theme Editor into all seven supported languages (German, Spanish, French, Italian, Portuguese, Russian, Chinese), including the new Accept All button. 53 new interface strings went through the standing translation pipeline with its validation gate; every language passed with nothing quarantined.]]></description>
    </item>
    <item>
      <title>Tracker: Gave four team members the ability to close items on the player wishlist board. The board…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-88e27d54bce6</guid>
      <pubDate>Sun, 19 Jul 2026 18:57:24 -0500</pubDate>
      <description><![CDATA[Gave four team members the ability to close items on the player wishlist board. The board had no project members, so everyone landed on the default role, which allows posting, commenting and voting but not changing the status of someone else's suggestion. Added an idempotent setup script that grants the curator role, and applied it.]]></description>
    </item>
    <item>
      <title>Tools: The Tester Companion puts the /tester tools on a browser page: load zone, skill setting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-2738aefc68a4</guid>
      <pubDate>Sun, 19 Jul 2026 18:19:01 -0500</pubDate>
      <description><![CDATA[The <b>Tester Companion</b> puts the /tester tools on a browser page: load zone, skill setting, item duplication, and fly mode from a second monitor while the game runs fullscreen. Opened from a button in the /tester window or with /tester web; the page talks only to the testers own client on their own machine.]]></description>
    </item>
    <item>
      <title>Tools: The per-scene scene-contents updater in the editor build menu no longer fails on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-487be1a5210e</guid>
      <pubDate>Sun, 19 Jul 2026 18:19:01 -0500</pubDate>
      <description><![CDATA[The per-scene scene-contents updater in the editor build menu no longer fails on checkouts without the knowledge debug data file.]]></description>
    </item>
    <item>
      <title>Tester tools: Fixed the Hours on Chaos column on the tester leaderboard, which showed nine testers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-8fb44a59c4e3</guid>
      <pubDate>Sun, 19 Jul 2026 21:18:05 -0500</pubDate>
      <description><![CDATA[Fixed the Hours on Chaos column on the tester leaderboard, which showed nine testers their entire play history from the main game instead of time on the test shard. The worst row read 28,529 hours under a column headed Week, which holds 168. Those accounts carry playtime from long before the test shard existed, and a gap in how the collector picked its starting point credited all of it. Hours are now counted as time actually accrued between samples, and the stored history was recomputed, so the board reads 4 to 33 hours. Testers whose numbers were already right are untouched.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-19</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-19-images</guid>
      <pubDate>Sun, 19 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/native-linux-first-login.png" data-full="https://catnipgames.net/blog/images/native-linux-first-login.png"
               data-cap="The first native Linux client session the chaos shard has ever accepted: in the world at the Battle of Solace Bridge on build 40, driven by the automated test harness."
               alt="The game running on the native Linux client at the Battle of Solace Bridge, showing the in-world UI and the build 40 label in the corner" loading="lazy">
          <span class="cap">Native Linux client in the world on build 40</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-edges-obsidian.png" data-full="https://catnipgames.net/blog/images/uitk-skin-edges-obsidian.png"
               data-cap="Obsidian with the new corner ornaments and denser panel: molten flourishes on near-solid black glass."
               alt="A demo window in the Obsidian theme with engraved molten-orange flourish ornaments in all four corners" loading="lazy">
          <span class="cap">Obsidian with corner ornaments</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-edges-fire.png" data-full="https://catnipgames.net/blog/images/uitk-skin-edges-fire.png"
               data-cap="Fire with copper corner ornaments and the raised panel opacity."
               alt="A demo window in the Fire theme with copper flourish ornaments in the corners on a dark red panel" loading="lazy">
          <span class="cap">Fire with corner ornaments</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-edges-air.png" data-full="https://catnipgames.net/blog/images/uitk-skin-edges-air.png"
               data-cap="Air rebuilt near solid: ink corner ornaments on the frost panel, denser fills throughout."
               alt="A demo window in the light Air theme with ink flourish ornaments in the corners on a near-opaque frost panel" loading="lazy">
          <span class="cap">Air, solid frost with ink ornaments</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-edges-arcane.png" data-full="https://catnipgames.net/blog/images/uitk-skin-edges-arcane.png"
               data-cap="Arcane with glowing violet corner ornaments on the void panel."
               alt="A demo window in the Arcane theme with violet flourish ornaments in the corners on a violet-black panel" loading="lazy">
          <span class="cap">Arcane with corner ornaments</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-theme-editor.png" data-full="https://catnipgames.net/blog/images/uitk-theme-editor.png"
               data-cap="The Theme Editor with a saved custom theme active: the window title color changed to cyan applies live to the editor itself and the preview window beside it."
               alt="The Theme Editor window with base theme, name, share code buttons, motion and font controls, a grouped color list, and RGBA sliders, next to a preview window with a cyan title" loading="lazy">
          <span class="cap">The Theme Editor, editing itself live</span>
        
        
          <img src="https://catnipgames.net/blog/images/scenes-live-stats-sort.png" data-full="https://catnipgames.net/blog/images/scenes-live-stats-sort.png"
               data-cap="The scene browser sorted worst FPS first: every card carries a live frame rate (color coded) and average zone load time from the last 14 days."
               alt="A grid of scene cards each showing a color-coded frame rate and load time line, with a sort dropdown set to worst FPS first" loading="lazy">
          <span class="cap">Scene cards with live FPS and load stats</span>
        
        
          <img src="https://catnipgames.net/blog/images/UitkConfirmationOverOptions.png" data-full="https://catnipgames.net/blog/images/UitkConfirmationOverOptions.png"
               data-cap="The first converted dialog in place: a confirmation on the new UI sitting above the old Options window, with the screen behind it dimmed and click-blocked."
               alt="A themed confirmation popup asking to reset all settings, with Yes and No buttons, drawn on top of the legacy Options window over a dimmed title screen" loading="lazy">
          <span class="cap">New-UI confirmation over the old Options window</span>
        
        
          <img src="https://catnipgames.net/blog/images/UitkLoadingScreen.png" data-full="https://catnipgames.net/blog/images/UitkLoadingScreen.png"
               data-cap="The zone loading screen rebuilt on the new UI: loading art, zone message, tip strip, and the progress readout in the corner."
               alt="A loading screen showing a skeletal throne room artwork, the text Entering Soltown, a loading tip in a dark strip, and a percentage in the bottom left corner" loading="lazy">
          <span class="cap">The loading screen on the new UI</span>
        
        
          <img src="https://catnipgames.net/blog/images/TesterFlyModePanel.png" data-full="https://catnipgames.net/blog/images/TesterFlyModePanel.png"
               data-cap="The tester tools window with its new Movement section: a FLY MODE toggle and a speed field, next to the existing zone, skill, and item helpers."
               alt="The Tester Tools window showing Load zone, Skills, and Items sections, and a new Movement section with a FLY MODE: OFF button and a speed field set to 10" loading="lazy">
          <span class="cap">Fly mode in the tester tools window</span>
        
        
          <img src="https://catnipgames.net/blog/images/verify-board-filter-zone.png" data-full="https://catnipgames.net/blog/images/verify-board-filter-zone.png"
               data-cap="The tester verification board with its new filter box, This zone checkbox, and the Zone and Age columns under a header row (preview data)."
               alt="The Tester Verification window showing a task list with Task, Zone, Age, Status, and Build columns, a filter box, and a This zone checkbox" loading="lazy">
          <span class="cap">Verification board filter and zone columns</span>
        
        
          <img src="https://catnipgames.net/blog/images/tester-companion-page.png" data-full="https://catnipgames.net/blog/images/tester-companion-page.png"
               data-cap="The Tester Companion: the /tester tools as a browser page for a second monitor, with zone loading, skills, item duplication, fly mode, and a link to the verification board."
               alt="The Tester Companion browser page in a dark theme with cards for Load zone, Skills, Items, Movement, and Testing" loading="lazy">
          <span class="cap">The tester tools as a browser page</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-18</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-headlines</guid>
      <pubDate>Sun, 19 Jul 2026 13:56:00 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>White ground in random encounters fixed, and the trail led much further.</b> A player report of white ground in a forest road encounter uncovered 1,382 terrain paint layer files lost in the project's version control move, plus 44 terrains whose layer data the new engine no longer reads. All restored or rebuilt; every terrain in the game now has its ground textures again, including the Solace Bridge starter area and Hidden Vale. Rides the next chaos build.</li>
        <li>The tester workflow moved into the game: a new <b>/verify</b> window lists verification tasks, takes claims and verdicts, and can teleport you straight to a bug's saved location. Verdict processing is automatic, closing verified tasks and routing failed ones back to the bug tracker with the tester's notes.</li>
        <li>Tracked down and fixed a client freeze at 98% on the loading screen that could strand players entering certain towns. The fix is live on chaos build 38.</li>
        <li><b>Black-screen crashes at startup now report themselves.</b> A tester could not get past a black screen and nothing ever reached us, because crash reporting only armed once you were in the world. The launcher now expects proof of a clean shutdown from every session it starts; a session that never shuts down cleanly uploads its log automatically, tagged with how far startup got. Launcher build 16 is live; the game half rides the next chaos build.</li>
        <li>The game speaks <b>Italian</b> and <b>Spanish</b>: both full translations landed today, each with every line of NPC dialog covered, and with them all seven supported languages are now complete</li>
        <li>Chaos now gets a <b>nightly automated release</b>: build and deploy of the latest code at midnight, gated by fast preflight checks.</li>
        <li>The new UI windows are now <b>skinnable</b>: five visual themes (Classic, Obsidian, Fire, Air, Arcane), selectable in game options, applied live.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Combat: Lowered the Dash skill sound effect volume to match other skill sounds, after tester…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-d1b289231b9a</guid>
      <pubDate>Sun, 19 Jul 2026 13:55:00 -0500</pubDate>
      <description><![CDATA[Lowered the Dash skill sound effect volume to match other skill sounds, after tester feedback that the new whoosh was too loud (tracker #679).]]></description>
    </item>
    <item>
      <title>Combat: Fixed cover reducing every tick of a damage over time effect. Cover was meant to reduce…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-a2e4004cab30</guid>
      <pubDate>Sat, 18 Jul 2026 05:07:44 -0500</pubDate>
      <description><![CDATA[Fixed cover reducing every tick of a damage over time effect. Cover was meant to reduce only the hit that applies the effect, but a broken check made the reduction repeat on every tick, so ducking behind a wall weakened a bleed already on you. Bleeds, burns, and poisons now deal full damage on ticks after the first; multi-shot volley skills keep cover reduction on every shot. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Combat: Weapon on-hit effects (poison enchants, skill on-hit runes) no longer trigger on swings…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-039ad3799fe3</guid>
      <pubDate>Sat, 18 Jul 2026 10:05:07 -0500</pubDate>
      <description><![CDATA[Weapon on-hit effects (poison enchants, skill on-hit runes) no longer trigger on swings that miss or get dodged, blocked, or parried. Glancing, normal, and critical hits still trigger them; crystal swords keep their special behavior. Follow-up to the avoided-swing rider fix.]]></description>
    </item>
    <item>
      <title>Combat: Fixed area effects rolling one chance for everything: spells, songs, and traps with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-aae2e33dbe7d</guid>
      <pubDate>Sat, 18 Jul 2026 10:10:52 -0500</pubDate>
      <description><![CDATA[Fixed area effects rolling one chance for everything: spells, songs, and traps with several effects gated them all on the first effect's roll, so mastery-gated bonuses applied without the mastery and secondary procs fired at the wrong rates. Each effect now rolls its own chance. Tracker #731, verify task #803.]]></description>
    </item>
    <item>
      <title>Combat: Chased the forum report that Shadow Form, Shadow Shield, Cat's Grace, and Stalking Cat…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-c5a00ed65195</guid>
      <pubDate>Sat, 18 Jul 2026 11:19:23 -0500</pubDate>
      <description><![CDATA[Chased the forum report that Shadow Form, Shadow Shield, Cat&#39;s Grace, and Stalking Cat potions refuse to slot on the combat bar (tracker #700). Could not reproduce it on the new build: checked the consumable whitelist, rune flags, deck rules, and the deck save round trip, then verified in a live session that all four lock onto combat bar slots like any other buff potion.]]></description>
    </item>
    <item>
      <title>Combat: Added an editor test suite that pins every rule a buff potion needs to be slottable, so a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-86cf7950d243</guid>
      <pubDate>Sat, 18 Jul 2026 11:19:23 -0500</pubDate>
      <description><![CDATA[Added an editor test suite that pins every rule a buff potion needs to be slottable, so a future potion cannot ship with a missing whitelist entry again (Cat&#39;s Grace shipped that way once). Filed tester task #807 to confirm on chaos.]]></description>
    </item>
    <item>
      <title>Tracker: Issues on the bug tracker now record where they came from: a player report through the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-4e3bebcc23ce</guid>
      <pubDate>Sat, 18 Jul 2026 04:48:02 -0500</pubDate>
      <description><![CDATA[Issues on the bug tracker now record where they came from: a player report through the in-game Oracle, a forum thread picked up by the nightly sweep, or internal development tooling. Previously only Oracle reports carried that marker and everything else showed a bare automation account, which made an internally filed issue easy to mistake for a player report. Backfilled the marker on 119 existing issues.]]></description>
    </item>
    <item>
      <title>Tracker: Bug reports imported from the forum now also credit the player who raised the thread in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-bbe268f9e685</guid>
      <pubDate>Sat, 18 Jul 2026 04:48:03 -0500</pubDate>
      <description><![CDATA[Bug reports imported from the forum now also credit the player who raised the thread in the tracker's reporter field, the same field Oracle reports already use.]]></description>
    </item>
    <item>
      <title>Engine: Advanced the project itself to the engine's newest maintenance release, matching the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-eaf72f48748a</guid>
      <pubDate>Sat, 18 Jul 2026 04:00:14 -0500</pubDate>
      <description><![CDATA[Advanced the project itself to the engine's newest maintenance release, matching the build machines updated earlier this week, so editors and builds now run on the same engine version. Picked up the material and font files the newer editor re-saved on open.]]></description>
    </item>
    <item>
      <title>Client: Added an on-screen message during the first-time shader preparation on DirectX 12. When a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-eee37d47a8ae</guid>
      <pubDate>Sat, 18 Jul 2026 04:23:07 -0500</pubDate>
      <description><![CDATA[Added an on-screen message during the first-time shader preparation on DirectX 12. When a graphics driver update clears the shader cache, that step can take several minutes, and the loading bar looks stuck near the end while it works. The game now tells the player it is a one-time compile and that choosing DirectX 11 in the launcher makes loads fast. The message shows only on DirectX 12 when the wait runs long, and not on DirectX 11 or on later loads once shaders are cached. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Client: Fixed fountain fireworks only working once per scene. The first fountain you set off…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-42716db3c5eb</guid>
      <pubDate>Sat, 18 Jul 2026 05:19:35 -0500</pubDate>
      <description><![CDATA[Fixed fountain fireworks only working once per scene. The first fountain you set off played fine, but every later one just placed the cone with no sparks or sound until you zoned or relogged, for every color. The effect recycling system was handing back a gutted copy after the first use; it now returns the whole firework intact. Verified against the original 2022 player report. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Client: Added logging that records when a player hits the long first-time shader wait on DirectX…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-987b70e7a308</guid>
      <pubDate>Sat, 18 Jul 2026 05:33:29 -0500</pubDate>
      <description><![CDATA[Added logging that records when a player hits the long first-time shader wait on DirectX 12, including how far it got and whether it finished. A player who closed the game during that wait used to leave no trace at all, so this lets us measure how often it happens and confirm the DirectX 11 guidance is reaching the people who need it. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Client: Fixed a bug that could freeze the client at 98% on the loading screen when entering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-6fb86dbc8002</guid>
      <pubDate>Sat, 18 Jul 2026 12:28:15 -0500</pubDate>
      <description><![CDATA[Fixed a bug that could freeze the client at 98% on the loading screen when entering certain towns. The freeze came from a recent change to how mimics and trapped chests wake up on first interaction, and loading now completes normally.]]></description>
    </item>
    <item>
      <title>Client: Chaos build 38 went live on Windows and Linux, carrying the 98% loading-screen freeze fix.</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-3276adfec6a7</guid>
      <pubDate>Sat, 18 Jul 2026 13:43:47 -0500</pubDate>
      <description><![CDATA[Chaos build 38 went live on Windows and Linux, carrying the 98% loading-screen freeze fix.]]></description>
    </item>
    <item>
      <title>Client: New title screen opening: the game now boots to the old forest title art alone, holds one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-7f4797d43831</guid>
      <pubDate>Sat, 18 Jul 2026 19:37:45 -0500</pubDate>
      <description><![CDATA[New title screen opening: the game now boots to the old forest title art alone, holds one second, then a burn effect eats it away over 2.5 seconds with a glowing ember edge, revealing the new <b>Rebirth of Chaos</b> title art. The new art sits clean for a second before the menu fades in. Plays once per launch; logging back out to the title skips straight to the menu.]]></description>
    </item>
    <item>
      <title>Client: Built a new soft-edge burn shader for the old NGUI front end to drive it, with a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-26dd8d295784</guid>
      <pubDate>Sat, 18 Jul 2026 19:37:45 -0500</pubDate>
      <description><![CDATA[Built a new soft-edge burn shader for the old NGUI front end to drive it, with a generated noise mask (the stock masks read nearly black in the linear-color pipeline and collapsed the effect ramp). Wide monitors get black side bars beside the old 16:9 art that burn away in sync. The old logo overlay is gone; the new art carries its own title. Import settings on the new 3440x1440 background were also fixed so it no longer shipped downscaled and squashed.]]></description>
    </item>
    <item>
      <title>Client: Startup now stamps progress milestones (engine up, login scene, shader warmup, main menu…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-8dc040550240</guid>
      <pubDate>Sat, 18 Jul 2026 20:19:45 -0500</pubDate>
      <description><![CDATA[Startup now stamps progress milestones (engine up, login scene, shader warmup, main menu, in world) that also stream to the log server before login, so a client stuck during boot shows exactly where it stopped.]]></description>
    </item>
    <item>
      <title>Audio: Fixed drunk NPC voice lines reading their hiccup markers out loud. Dialogue writes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-cf8f06bfcd80</guid>
      <pubDate>Sat, 18 Jul 2026 04:54:37 -0500</pubDate>
      <description><![CDATA[Fixed drunk NPC voice lines reading their hiccup markers out loud. Dialogue writes hiccups as asides like *hic!* and *urrp!*, and the voice system spoke them as literal words. Those markers are now dropped from the spoken audio while the text on screen keeps them, and a line that is nothing but a hiccup plays silently. Seven characters across the game were affected, including the Drunken Ritualist in Tenebris Harbor from the player report. Live now for all players; a machine that already heard the old lines may keep the old audio in its local cache for a while.]]></description>
    </item>
    <item>
      <title>Audio: Fixed the same character shouting "MY" as the letters M and Y. The voice system read the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-8e7d3feef906</guid>
      <pubDate>Sat, 18 Jul 2026 04:54:38 -0500</pubDate>
      <description><![CDATA[Fixed the same character shouting "MY" as the letters M and Y. The voice system read the all-caps word as an acronym because it has no standard vowel; it is now spoken as the word wherever it appears in dialogue.]]></description>
    </item>
    <item>
      <title>Audio: Scoped voice regeneration tooling: refreshing clips after a pronunciation rule change now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-a923e97b8a67</guid>
      <pubDate>Sat, 18 Jul 2026 04:54:39 -0500</pubDate>
      <description><![CDATA[Scoped voice regeneration tooling: refreshing clips after a pronunciation rule change now targets only the lines the new rule touches, 210 clips this time instead of the 1,686 a full refresh would have redone. Filed a follow-up for the wider family of written stage directions (snorts, whinnies, singing) the voice system still reads literally.]]></description>
    </item>
    <item>
      <title>Community: Logged a forum suggestion for active magic mechanics (skills, gear, consumables, bard…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-6d8ef246132b</guid>
      <pubDate>Sat, 18 Jul 2026 03:20:30 -0500</pubDate>
      <description><![CDATA[Logged a forum suggestion for active magic mechanics (skills, gear, consumables, bard, pet support) to help mages counter monster magic resistance onto the suggestion tracker.]]></description>
    </item>
    <item>
      <title>Website: Added a view toggle to this work log. By category keeps the grouped layout; Newest first…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-c23aa3d9b096</guid>
      <pubDate>Sat, 18 Jul 2026 05:10:58 -0500</pubDate>
      <description><![CDATA[Added a view toggle to this work log. By category keeps the grouped layout; Newest first lists each day's entries in the order they were added, each with its time of day and a category tag. Existing entries were stamped with their original add times from the project history.]]></description>
    </item>
    <item>
      <title>Website: Entries added since your last visit now show a small NEW marker in both views. The marker…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-cc8595feca3b</guid>
      <pubDate>Sat, 18 Jul 2026 05:10:59 -0500</pubDate>
      <description><![CDATA[Entries added since your last visit now show a small NEW marker in both views. The marker is per browser and resets each visit; the first visit from a new browser shows none.]]></description>
    </item>
    <item>
      <title>Website: Reworked how entries are posted behind the scenes: two people adding to the log at the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-4b6dd51438d5</guid>
      <pubDate>Sat, 18 Jul 2026 05:11:00 -0500</pubDate>
      <description><![CDATA[Reworked how entries are posted behind the scenes: two people adding to the log at the same time could overwrite each other's lines, and the daily item count could drift. Additions now queue instead of colliding, the count recomputes itself, and publishing refuses to remove lines that are already on the live page unless told so.]]></description>
    </item>
    <item>
      <title>Gameplay: Fishing now reads out water depth: a label by the aiming cursor shows the depth in feet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-2a63704a0028</guid>
      <pubDate>Sat, 18 Jul 2026 05:23:54 -0500</pubDate>
      <description><![CDATA[Fishing now reads out water depth: a label by the aiming cursor shows the depth in feet at the lure spot, and a chat line repeats it when the cast lands.]]></description>
    </item>
    <item>
      <title>Gameplay: Trophy fish size and quality now scale with water depth. Casts near the minimum fishable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-3feaa1c3c6c5</guid>
      <pubDate>Sat, 18 Jul 2026 05:23:55 -0500</pubDate>
      <description><![CDATA[Trophy fish size and quality now scale with water depth. Casts near the minimum fishable depth give small fish and full-size trophies need roughly 16 feet of water. Decorative fishing ponds on player lots are unchanged. Came from a player report of fishing working in the shallows at a stone dock in Ardoris.]]></description>
    </item>
    <item>
      <title>Gameplay: Trophy fish now remember where they were caught. The catch location was looked up from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-cf458555a432</guid>
      <pubDate>Sat, 18 Jul 2026 06:05:00 -0500</pubDate>
      <description><![CDATA[Trophy fish now remember where they were caught. The catch location was looked up from the world's town list every time a tooltip was drawn, so a fish caught in a player-owned town that was later removed showed a generic template name instead of the town, on loose and mounted fish alike. The town name is now written onto the fish at the moment of the catch, and the tooltip only falls back to the old lookup for fish that predate the change. Came from a forum thread about fish caught in a town the player knew was about to disappear. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Gameplay: Built the companion data repair that writes the saved catch location onto existing fish…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-3e674f4db346</guid>
      <pubDate>Sat, 18 Jul 2026 06:05:01 -0500</pubDate>
      <description><![CDATA[Built the companion data repair that writes the saved catch location onto existing fish and other looted items whose town still exists, covering inventories, banks, mail, vendor listings, and fish mounted on walls. Fish that already lost their town name before the change cannot be repaired and keep the template name. The repair is part of the standing checklist that runs whenever a copy of live data is brought over, so refreshed test data stays fixed. Verified locally: town and city items stamped, removed-town items correctly left alone, second run changes nothing.]]></description>
    </item>
    <item>
      <title>Gameplay: Fixed the long-standing bug where patrol pets and conversationalist NPCs on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-ad2a63bc572a</guid>
      <pubDate>Sat, 18 Jul 2026 09:39:15 -0500</pubDate>
      <description><![CDATA[Fixed the long-standing bug where patrol pets and conversationalist NPCs on water-adjacent lots walked off docks into the water, snapped back to land, and repeated forever (reported since 2021). Wander destinations are now checked against walkable ground before the pet moves, covering deco pets, patrol pets, NPC wander, and flocking. Tracker #644, verify task #799.]]></description>
    </item>
    <item>
      <title>Gameplay: Fixed the rest of the interactables that could get permanently stuck "in use by another…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-301ee910cf28</guid>
      <pubDate>Sat, 18 Jul 2026 09:53:58 -0500</pubDate>
      <description><![CDATA[Fixed the rest of the interactables that could get permanently stuck "in use by another player" after an interrupted interaction: corpse and container looting, breakables, music boxes, jukeboxes, phonographs, water sources, fishtanks, doll cabinets, mannequins, and resource nodes. Same guaranteed-release pattern that fixed treasure chests, now shared by all of them.]]></description>
    </item>
    <item>
      <title>Gameplay: Read-only viewers closing a mannequin or doll cabinet window can no longer clear the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-c168f7d442aa</guid>
      <pubDate>Sat, 18 Jul 2026 09:53:59 -0500</pubDate>
      <description><![CDATA[Read-only viewers closing a mannequin or doll cabinet window can no longer clear the ownership of the player actually using it. New editor test suite pins the release-on-every-teardown-path contract.]]></description>
    </item>
    <item>
      <title>World: Fixed the white ground in random encounter areas, from a player report of a forest road…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-91b7036e914d</guid>
      <pubDate>Sat, 18 Jul 2026 06:25:00 -0500</pubDate>
      <description><![CDATA[Fixed the white ground in random encounter areas, from a player report of a forest road encounter that also named dragon and elf encounters on the plains. The project's move to new version control had silently dropped a folder of 1,382 terrain paint layer files whose file names contain parentheses and commas, so every terrain that used them had no ground textures to draw and rendered plain white in the game while the editor showed a gray checker pattern. Restored the folder from the old source control copy and the affected terrains reconnected to their layers with no further changes. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>World: Rebuilt the ground paint layers on 44 more terrains that stored their layer data in a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-bf98ac2ac094</guid>
      <pubDate>Sat, 18 Jul 2026 06:25:01 -0500</pubDate>
      <description><![CDATA[Rebuilt the ground paint layers on 44 more terrains that stored their layer data in a format the new engine no longer converts, using the layer definitions recovered from the original files. This covers the Solace Bridge starter area, Hidden Vale encounters, the Graff Gem Mines surface, Vertas Pass, the biome terrains, and several island and player town templates. A scan of all 371 terrains in the game now finds zero with missing layers.]]></description>
    </item>
    <item>
      <title>World: As insurance against a related packaging issue, terrains that still use the engine's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-41bc78bd9f69</guid>
      <pubDate>Sat, 18 Jul 2026 06:25:02 -0500</pubDate>
      <description><![CDATA[As insurance against a related packaging issue, terrains that still use the engine's built-in default ground material now switch at scene load to a project copy of the same material, one the build pipeline can protect from having its shader variants stripped out of packaged scenes. Covered by new editor tests, including the instanced and deferred rendering combinations these terrains need.]]></description>
    </item>
    <item>
      <title>Decorations: Added a Tip Jar decoration for player housing. Visitors can drop gold in, with a checkbox…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-673e5fa612d3</guid>
      <pubDate>Sat, 18 Jul 2026 05:59:21 -0500</pubDate>
      <description><![CDATA[Added a <b>Tip Jar</b> decoration for player housing. Visitors can drop gold in, with a checkbox to tip anonymously; the owner opens the jar to a donor list showing who gave what and when, and a Collect button that takes it all. Owners choose what visitors see: the deposit prompt only, the running total, or the full donor list.]]></description>
    </item>
    <item>
      <title>Decorations: Two versions: a craftable clay jar (carpentry level 30, recipe sold by carpentry supply…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-13843291bd4f</guid>
      <pubDate>Sat, 18 Jul 2026 05:59:22 -0500</pubDate>
      <description><![CDATA[Two versions: a craftable clay jar (carpentry level 30, recipe sold by carpentry supply merchants) and an ornate jar staged for the Crown store pending its price and picture pass.]]></description>
    </item>
    <item>
      <title>Decorations: Gold safety shaped the design: every deposit and collection is a single server-side step…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-bb117af31669</guid>
      <pubDate>Sat, 18 Jul 2026 05:59:23 -0500</pubDate>
      <description><![CDATA[Gold safety shaped the design: every deposit and collection is a single server-side step that cannot pay twice on a retry, and a jar removed from a lot mails its balance to its owner instead of carrying gold on the item. A review pass before commit caught and fixed two payout edge cases.]]></description>
    </item>
    <item>
      <title>Decorations: Reworked the clay tip jar recipe after review: firing clay belongs to the smelting skill…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-dd2f831c95dd</guid>
      <pubDate>Sat, 18 Jul 2026 18:40:10 -0500</pubDate>
      <description><![CDATA[Reworked the clay tip jar recipe after review: firing clay belongs to the smelting skill. The recipe now requires smelting level 30 with smelting tongs and six raw clay, and is sold by the decoration recipe merchant that carries the antique clay pot recipe rather than the carpentry supply merchants. Takes effect with the next chaos build.]]></description>
    </item>
    <item>
      <title>Housing: Laying a decoration flat (like a book on its side) no longer shares a key with the combat…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-17a126b99823</guid>
      <pubDate>Sat, 18 Jul 2026 06:03:26 -0500</pubDate>
      <description><![CDATA[Laying a decoration flat (like a book on its side) no longer shares a key with the combat glyph combo binding. It is now its own control, <b>Deco Rotate Extra Axis</b>, default R, listed under Options &gt; Controls. Rebinding Set Glyph Combo used to silently move the deco rotate with it.]]></description>
    </item>
    <item>
      <title>Infrastructure: Concurrent work sessions kept tripping over the repo's single git staging area: one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-b83ebc78afd2</guid>
      <pubDate>Sat, 18 Jul 2026 06:20:05 -0500</pubDate>
      <description><![CDATA[Concurrent work sessions kept tripping over the repo's single git staging area: one session's commit could sweep in thousands of files another session had staged, twice in one day under the wrong message. Commits from tools now build in a private staging area and land atomically, retrying if someone else commits first, and a guard refuses any plain commit over 150 files unless it is deliberately confirmed.]]></description>
    </item>
    <item>
      <title>Infrastructure: Fixed the commit helper used by concurrent work sessions: every commit it made left ghost…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-b9d68e1bd9a4</guid>
      <pubDate>Sat, 18 Jul 2026 09:26:22 -0500</pubDate>
      <description><![CDATA[Fixed the commit helper used by concurrent work sessions: every commit it made left ghost staged entries in source control for the files it touched, and a later plain commit could quietly sweep those in and undo the work. The helper now clears its own entries, and a stray push-guard script from yesterday's batch is checked in.]]></description>
    </item>
    <item>
      <title>Build: Mac client build broke this morning: the build agent was still pointed at the old Unity…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-248bd7bb2b68</guid>
      <pubDate>Sat, 18 Jul 2026 07:32:30 -0500</pubDate>
      <description><![CDATA[Mac client build broke this morning: the build agent was still pointed at the old Unity editor install after the project moved to the newer editor build, so it failed before Unity even launched. Repointed the agent config and kicked off a fresh Mac build to confirm.]]></description>
    </item>
    <item>
      <title>Build: Added a one-button chaos release job to the build farm. It pins the whole release to one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-6431e2780a49</guid>
      <pubDate>Sat, 18 Jul 2026 19:11:29 -0500</pubDate>
      <description><![CDATA[Added a one-button chaos release job to the build farm. It pins the whole release to one commit, runs cheap server compile checks first, then builds both client platforms and the server reports from that commit and hands the deploy the exact build numbers.]]></description>
    </item>
    <item>
      <title>Build: The mirror-drift check that would have caught yesterday's failed release now gives a real…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-1db81a9733aa</guid>
      <pubDate>Sat, 18 Jul 2026 19:11:30 -0500</pubDate>
      <description><![CDATA[The mirror-drift check that would have caught yesterday's failed release now gives a real verdict on the deploy machine (it used to skip there and report success), and it also runs inside the deploy before the large archive extractions. A doomed release now stops in about ten minutes instead of after two four-hour client builds.]]></description>
    </item>
    <item>
      <title>Build: Full client builds now schedule only on build machines with a working graphics device. A…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-2973b1e502b7</guid>
      <pubDate>Sat, 18 Jul 2026 19:11:30 -0500</pubDate>
      <description><![CDATA[Full client builds now schedule only on build machines with a working graphics device. A full build that landed on the second Linux agent used to fail in under a second because that agent has no display.]]></description>
    </item>
    <item>
      <title>Build: Server hotfixes gained a supported deploy path: a release can carry a server-only fix…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-8113452bcc1c</guid>
      <pubDate>Sat, 18 Jul 2026 19:11:30 -0500</pubDate>
      <description><![CDATA[Server hotfixes gained a supported deploy path: a release can carry a server-only fix stacked on top of the release commit, checked by commit ancestry, replacing hand-edited pipeline recovery.]]></description>
    </item>
    <item>
      <title>Testing: Added an in-game Tester Verification board: type /verify to open a window that lists the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-57e4f3354e3b</guid>
      <pubDate>Sat, 18 Jul 2026 09:00:56 -0500</pubDate>
      <description><![CDATA[Added an in-game Tester Verification board: type /verify to open a window that lists the open verification tasks, shows each task's full text, and takes claims. Signing in uses your game account, so claims and verdicts appear on the task tracker under your own name.]]></description>
    </item>
    <item>
      <title>Testing: Verdicts drive the tracker by themselves now. Marking a task Verified Fixed closes it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-1faca6ae2d1e</guid>
      <pubDate>Sat, 18 Jul 2026 09:01:05 -0500</pubDate>
      <description><![CDATA[Verdicts drive the tracker by themselves now. Marking a task Verified Fixed closes it with a reply; Not Fixed or Partial Fix files or reopens the matching bug with the tester's notes attached, then closes the verification task with a pointer. A checker runs every 15 minutes.]]></description>
    </item>
    <item>
      <title>Testing: Bug locations travel with reports: a verdict can attach where the tester is standing, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-60aecfda60dc</guid>
      <pubDate>Sat, 18 Jul 2026 09:01:06 -0500</pubDate>
      <description><![CDATA[Bug locations travel with reports: a verdict can attach where the tester is standing, and any task that carries a location gets a <b>Teleport to Bug Location</b> button that drops you at the exact spot.]]></description>
    </item>
    <item>
      <title>Testing: Task titles in the new verification window were getting cut off mid letter; they now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-4b0d50d25841</guid>
      <pubDate>Sat, 18 Jul 2026 09:10:22 -0500</pubDate>
      <description><![CDATA[Task titles in the new verification window were getting cut off mid letter; they now shorten with a proper ellipsis, rows are tall enough for the game font, and the task list takes more of the window.]]></description>
    </item>
    <item>
      <title>Testing: The verdict checker is installed and running: it looks for new tester verdicts every 15…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-b6b9521e0120</guid>
      <pubDate>Sat, 18 Jul 2026 09:18:27 -0500</pubDate>
      <description><![CDATA[The verdict checker is installed and running: it looks for new tester verdicts every 15 minutes, and the task tracker now carries a location field so bug spots can ride along with reports.]]></description>
    </item>
    <item>
      <title>Content: Rebuilt the Island Challenge navigation data. The scene's pathfinding bake was from 2024…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-61652f6464c8</guid>
      <pubDate>Sat, 18 Jul 2026 09:47:56 -0500</pubDate>
      <description><![CDATA[Rebuilt the Island Challenge navigation data. The scene's pathfinding bake was from 2024 and no longer matched the islands, so all 30 creature spawners (skeletons, trolls, crocodiles, satyrs) failed to place at scene load and monsters could appear stuck or missing. After the rebake every spawner lands on walkable ground.]]></description>
    </item>
    <item>
      <title>NPCs: Fixed Shock Monkey Mongo in Kobold Camp barking raw template labels ( boast_human: MONGO…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-913d57de555b</guid>
      <pubDate>Sat, 18 Jul 2026 10:19:11 -0500</pubDate>
      <description><![CDATA[Fixed Shock Monkey Mongo in Kobold Camp barking raw template labels (<code>boast_human: MONGO STRONG!</code>) in chat and in the spoken line; cleaned the English source data and the seven translation databases, and redeployed the client language payloads.]]></description>
    </item>
    <item>
      <title>NPCs: Gave Mongo a robot voice. New FX-voice mechanism in the voice pipeline: a synthetic voice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-9d9a6e99dfb0</guid>
      <pubDate>Sat, 18 Jul 2026 10:19:12 -0500</pubDate>
      <description><![CDATA[Gave Mongo a robot voice. New FX-voice mechanism in the voice pipeline: a synthetic voice id maps to a catalog base voice plus a fixed filter chain (pitch down 4 semitones, 70 Hz ring-mod buzz, band limit, light bitcrush) baked into the clips at generation time. 23 clips regenerated and published.]]></description>
    </item>
    <item>
      <title>Telemetry: Expanded the once-a-minute client frame rate sample: it now also reports median, 1…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-412b2864d512</guid>
      <pubDate>Sat, 18 Jul 2026 10:21:07 -0500</pubDate>
      <description><![CDATA[Expanded the once-a-minute client frame rate sample: it now also reports median, 1 percent low, and standard deviation for the minute, plus OS, CPU and GPU frame times, and draw call counts. Values the hardware cannot supply are left out instead of logged as zero.]]></description>
    </item>
    <item>
      <title>Telemetry: Clients now flag draw call spikes per scene with the player position attached, limited to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-12b4a28a0a6a</guid>
      <pubDate>Sat, 18 Jul 2026 10:21:07 -0500</pubDate>
      <description><![CDATA[Clients now flag draw call spikes per scene with the player position attached, limited to real new peaks so the log stays quiet.]]></description>
    </item>
    <item>
      <title>Telemetry: Built a Client Frame Rate dashboard for the internal log stack: per-scene fps table…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-9b4396e64699</guid>
      <pubDate>Sat, 18 Jul 2026 10:21:07 -0500</pubDate>
      <description><![CDATA[Built a <b>Client Frame Rate</b> dashboard for the internal log stack: per-scene fps table (average, median, stdev, 1 percent low), fps by GPU, by OS, and by build, CPU vs GPU frame time, draw call peaks with locations, worst scenes, and hitch counts. New fields start flowing with the next chaos build.]]></description>
    </item>
    <item>
      <title>Telemetry: Ran the new frame rate test suite for the first time: 30 checks on the stats math, OS…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-7777675f62c3</guid>
      <pubDate>Sat, 18 Jul 2026 11:09:36 -0500</pubDate>
      <description><![CDATA[Ran the new frame rate test suite for the first time: 30 checks on the stats math, OS labeling, peak rate limiting, and log line format, all passing.]]></description>
    </item>
    <item>
      <title>Build and Deploy: Chaos build 37 is live on Windows and Linux: frozen trophy fish catch locations plus the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-55512db8d800</guid>
      <pubDate>Sat, 18 Jul 2026 11:41:52 -0500</pubDate>
      <description><![CDATA[Chaos build 37 is live on Windows and Linux: frozen trophy fish catch locations plus the backfill tool, the craftable tip jar, the deco rotate keybind split, the restored terrain paint layers, and a slightly higher mount jump.]]></description>
    </item>
    <item>
      <title>Build and Deploy: First deploy attempt failed after both client builds: two new server files were on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-2513bc5d08d4</guid>
      <pubDate>Sat, 18 Jul 2026 11:41:53 -0500</pubDate>
      <description><![CDATA[First deploy attempt failed after both client builds: two new server files were on the classic build's file list but not the ported server's, so the server would not compile. Added the missing entries and redeployed without rebuilding the clients. A pre-deploy check for this gap is queued as pipeline work.]]></description>
    </item>
    <item>
      <title>Build and Deploy: Ran the catch-location backfill on the chaos database after the deploy: 16,043 existing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-47da1b5fcf4e</guid>
      <pubDate>Sat, 18 Jul 2026 12:25:14 -0500</pubDate>
      <description><![CDATA[Ran the catch-location backfill on the chaos database after the deploy: 16,043 existing fish and quality items now carry their frozen catch-location text, and a second pass confirmed zero records left to update.]]></description>
    </item>
    <item>
      <title>Localization: Italian translation complete: coverage went from 27.2% to 99.5%, NPC dialog from 8.3% to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-a12e1fed7e4c</guid>
      <pubDate>Sat, 18 Jul 2026 14:53:21 -0500</pubDate>
      <description><![CDATA[Italian translation complete: coverage went from 27.2% to 99.5%, NPC dialog from 8.3% to 100%. 86,421 lines were machine translated through the LLM pipeline (Sonnet bulk pass, Opus repair round, 13 hand-balanced markup records), and an Opus audit then fixed 310 of 1,187 flagged lines. Client payloads were regenerated: 144 files, with 77 conversation scenes getting their first Italian file. Books stay English for now (separate ship path); Spanish is the last partial language.]]></description>
    </item>
    <item>
      <title>Localization: Retired the 2026-07-09 warning that regenerating the Spanish and Italian payloads would…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-1a0b12e3a0f3</guid>
      <pubDate>Sat, 18 Jul 2026 14:53:21 -0500</pubDate>
      <description><![CDATA[Retired the 2026-07-09 warning that regenerating the Spanish and Italian payloads would drop old translations: re-verified before deploying, the translation db is now a superset of both shipped payloads, so the regen was safe. Docs and runbook updated; the launcher language picker now shows Italian at 99%.]]></description>
    </item>
    <item>
      <title>Localization: Spanish translation complete: filled the last partial language from 29.4% to 99.6%…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-c4440539c8f3</guid>
      <pubDate>Sat, 18 Jul 2026 20:53:30 -0500</pubDate>
      <description><![CDATA[Spanish translation complete: filled the last partial language from 29.4% to 99.6% coverage, with all 66,792 lines of NPC dialog now translated. 83,876 lines were machine translated, gated by the markup validator, and a review pass corrected 261 of 1,137 flagged lines. Books stay English for now, same as the other languages.]]></description>
    </item>
    <item>
      <title>Localization: With Spanish done, all seven supported languages sit at 99%+ coverage and the translation…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-46dc9b1b36c3</guid>
      <pubDate>Sat, 18 Jul 2026 20:53:31 -0500</pubDate>
      <description><![CDATA[With Spanish done, all seven supported languages sit at 99%+ coverage and the translation fill program is finished. The client payloads were regenerated (80 conversation scenes got their first Spanish files) and the launcher language picker now shows Spanish at 99%. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Launcher: Crash reporting now covers sessions that never reach the title screen. The launcher…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-f2ca6153e64a</guid>
      <pubDate>Sat, 18 Jul 2026 20:19:45 -0500</pubDate>
      <description><![CDATA[Crash reporting now covers sessions that never reach the title screen. The launcher records each game launch and the client writes a clean-shutdown stamp on quit; a session with no stamp (black screen, freeze, Task Manager kill) uploads its log on the next launcher start with a tag for how far boot got. Launcher build 16 is out and self-updates; the game half rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Investigations: Chased a tester report of a black screen at startup on Windows. Server logs show the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-f055cbae8ad2</guid>
      <pubDate>Sat, 18 Jul 2026 20:19:45 -0500</pubDate>
      <description><![CDATA[Chased a tester report of a black screen at startup on Windows. Server logs show the client boots, connects logging, loads early assets fast, then goes quiet before the title screen on five attempts across three builds; nothing uploads because crash detection needed an in-world marker. The new clean-exit reporting exists to catch exactly this case.]]></description>
    </item>
    <item>
      <title>UI: Fixed unreadable highlights in the new UI windows: selected and hovered list rows drew a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-986e682585a4</guid>
      <pubDate>Sat, 18 Jul 2026 21:05:43 -0500</pubDate>
      <description><![CDATA[Fixed unreadable highlights in the new UI windows: selected and hovered list rows drew a light gray fill that nearly matched the text color, and the disabled claim button on the tester board sat on a light gray fill too. Rows now highlight with a dark blue tint and brighter text, and the claim button stays on the dark panel.]]></description>
    </item>
    <item>
      <title>UI: New UI Theme option in Options &gt; Interface: the new-style windows (Oracle helper, tavern…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-8ca95c12d9be</guid>
      <pubDate>Sat, 18 Jul 2026 21:50:42 -0500</pubDate>
      <description><![CDATA[New <b>UI Theme</b> option in Options &gt; Interface: the new-style windows (Oracle helper, tavern game boards, tip jar, tester board) can be reskinned with five looks: Classic, Obsidian, Fire, Air, and Arcane. Changes apply to open windows immediately and persist across sessions.]]></description>
    </item>
    <item>
      <title>UI: Every color in the shared UI Toolkit theme now routes through a semantic token contract…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-e3f932f1ff61</guid>
      <pubDate>Sat, 18 Jul 2026 21:50:42 -0500</pubDate>
      <description><![CDATA[Every color in the shared UI Toolkit theme now routes through a semantic token contract, with a test that fails any skin missing a token. Windows ported to the new UI later pick up all five themes with no extra styling work.]]></description>
    </item>
    <item>
      <title>UI: Air is a full light theme with dark ink text and its own frost window art; the dark…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-4f1c068894ee</guid>
      <pubDate>Sat, 18 Jul 2026 21:50:42 -0500</pubDate>
      <description><![CDATA[Air is a full light theme with dark ink text and its own frost window art; the dark themes retint the stock art. Air and Arcane bring new title fonts (Cinzel and Grenze Gotisch, both openly licensed), and each theme has a slow ambient glow on window backgrounds.]]></description>
    </item>
    <item>
      <title>Jenkins: Fixed the build-all farm job, which failed on its first run before starting any builds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-c7e4ddf19f5f</guid>
      <pubDate>Sat, 18 Jul 2026 21:06:57 -0500</pubDate>
      <description><![CDATA[Fixed the build-all farm job, which failed on its first run before starting any builds. The job generator wrote the six client job names into the script without quotes, so the pipeline crashed parsing its own job list. One-line fix in the seed; takes effect at the next re-seed.]]></description>
    </item>
    <item>
      <title>Jenkins: Scheduled a nightly automated chaos release: the one-button release job now runs at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-9a3af4f8a17f</guid>
      <pubDate>Sat, 18 Jul 2026 21:13:14 -0500</pubDate>
      <description><![CDATA[Scheduled a nightly automated chaos release: the one-button release job now runs at midnight Central, builds the latest code, and deploys it to the chaos server unattended. Preflight checks run first, so a broken tip fails in minutes and nothing deploys.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-18</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-18-images</guid>
      <pubDate>Sat, 18 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/deck-builder-buff-potions.png" data-full="https://catnipgames.net/blog/images/deck-builder-buff-potions.png"
               data-cap="Checking the forum report about buff potions refusing to slot: Shadow Form, Shadow Shield, Cat's Grace, and Stalking Cat potions listed as available in the deck builder and locked onto combat bar slots."
               alt="Deck builder window listing the four reported buff potions as available, with all four locked onto combat bar slots below" loading="lazy">
          <span class="cap">Buff potions slotting on the combat bar</span>
        
        <img src="https://catnipgames.net/blog/images/tipjar-clay-deco.png" data-full="https://catnipgames.net/blog/images/tipjar-clay-deco.png" alt="The craftable clay tip jar: a dark rounded earthen jar with engraved flowers, rendered on a plain backdrop">
        <img src="https://catnipgames.net/blog/images/tipjar-ornate-deco.png" data-full="https://catnipgames.net/blog/images/tipjar-ornate-deco.png" alt="The ornate tip jar: a tall two-handled amphora painted with figures and border patterns, rendered on a plain backdrop">
        
          <img src="https://catnipgames.net/blog/images/blog-newest-first-view.png" data-full="https://catnipgames.net/blog/images/blog-newest-first-view.png"
               data-cap="The work log's Newest first view: one list per day ordered by add time, with NEW markers for entries since your last visit."
               alt="Work log page showing the Newest first view with NEW markers, times, and category tags" loading="lazy">
          <span class="cap">Newest first view with NEW markers</span>
        
        
          <img src="https://catnipgames.net/blog/images/terrain-layers-before-checker.png" data-full="https://catnipgames.net/blog/images/terrain-layers-before-checker.png"
               data-cap="Before: the forest road encounter ground drawn as a gray checker pattern in the editor, plain white in the game, because its terrain paint layers were missing."
               alt="Forest road encounter in the editor with the ground rendered as a gray checkerboard between the trees" loading="lazy">
          <span class="cap">Before: encounter ground with missing layers</span>
        
        
          <img src="https://catnipgames.net/blog/images/terrain-layers-after-fixed.png" data-full="https://catnipgames.net/blog/images/terrain-layers-after-fixed.png"
               data-cap="After: the same forest road encounter with its restored terrain layers, cobblestone road and forest floor back."
               alt="The same forest road encounter with a cobblestone road and grassy forest floor rendering correctly" loading="lazy">
          <span class="cap">After: restored road and forest floor</span>
        
        
          <img src="https://catnipgames.net/blog/images/tester-verify-window-2.png" data-full="https://catnipgames.net/blog/images/tester-verify-window-2.png"
               data-cap="The new in-game Tester Verification board: open tasks on the left, the selected task's full text on the right, with claim, verdict, and teleport controls."
               alt="The in-game Tester Verification window over a lakeside scene, showing a task list, a task description, claim and verdict buttons, and a teleport button" loading="lazy">
          <span class="cap">The /verify board in game</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-dark-selection-fix.png" data-full="https://catnipgames.net/blog/images/uitk-dark-selection-fix.png"
               data-cap="Checking the highlight fix in the new UI windows: the selected list row draws a dark blue tint with bright readable text, and the grayed claim button stays on the dark panel."
               alt="A themed test window with a task list where one row is highlighted in dark blue with bright readable text, above a grayed-out claim button on the dark panel" loading="lazy">
          <span class="cap">Readable row highlight in the new UI windows</span>
        
        
          <img src="https://catnipgames.net/blog/images/FrameRateOverTimePanel.png" data-full="https://catnipgames.net/blog/images/FrameRateOverTimePanel.png"
               data-cap="The new Client Frame Rate dashboard: average and median fps across all clients over the last week."
               alt="Line chart of average and median client fps over seven days, ranging roughly 30 to 110 fps" loading="lazy">
          <span class="cap">Client fps over time</span>
        
        
          <img src="https://catnipgames.net/blog/images/FrameRateByGpuPanel.png" data-full="https://catnipgames.net/blog/images/FrameRateByGpuPanel.png"
               data-cap="Frame rate broken down by graphics card: average and median fps with sample and player counts per GPU model."
               alt="Table of fps by GPU model showing average fps, median fps, samples, and players per card" loading="lazy">
          <span class="cap">FPS by graphics card</span>
        
        
          <img src="https://catnipgames.net/blog/images/FrameRateWorstScenesPanel.png" data-full="https://catnipgames.net/blog/images/FrameRateWorstScenesPanel.png"
               data-cap="Worst performing scenes ranked by their 10th percentile fps, the view that points optimization work at the right places."
               alt="Table of the worst scenes by 10th percentile fps, listing scenes with their p10 fps, average fps, and sample counts" loading="lazy">
          <span class="cap">Worst scenes by p10 fps</span>
        
        
          <img src="https://catnipgames.net/blog/images/title-burn-midway.jpg" data-full="https://catnipgames.net/blog/images/title-burn-midway.jpg"
               data-cap="The new title screen opening midway through: the old forest art burns away with a glowing edge, revealing the Rebirth of Chaos artwork underneath."
               alt="The old forest title screen partly burned away with glowing orange edges, the Rebirth of Chaos phoenix artwork showing through the holes" loading="lazy">
          <span class="cap">Old title screen burning away</span>
        
        
          <img src="https://catnipgames.net/blog/images/title-rebirth-menu.jpg" data-full="https://catnipgames.net/blog/images/title-rebirth-menu.jpg"
               data-cap="After the burn: the new Rebirth of Chaos title art with the main menu over it."
               alt="The new Rebirth of Chaos title screen, a fiery phoenix over a ruined city, with the game menu centered on top" loading="lazy">
          <span class="cap">The new title screen</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-classic.png" data-full="https://catnipgames.net/blog/images/uitk-skin-classic.png"
               data-cap="The UI Theme demo window on Classic: the standard look, unchanged by the new skin system."
               alt="A demo window in the standard game style: dark panel, cream title, lavender button text" loading="lazy">
          <span class="cap">UI Theme: Classic</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-obsidian.png" data-full="https://catnipgames.net/blog/images/uitk-skin-obsidian.png"
               data-cap="The Obsidian theme: cold black glass with molten orange titles, section rules, progress fill, and checkbox."
               alt="The same demo window in Obsidian: near-black panel, silver text, molten orange title and progress bar" loading="lazy">
          <span class="cap">UI Theme: Obsidian</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-fire.png" data-full="https://catnipgames.net/blog/images/uitk-skin-fire.png"
               data-cap="The Fire theme: charcoal red panels, copper window chrome, ember gold titles, warm ivory text."
               alt="The same demo window in Fire: dark red panel with copper frames and ember gold title" loading="lazy">
          <span class="cap">UI Theme: Fire</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-air.png" data-full="https://catnipgames.net/blog/images/uitk-skin-air.png"
               data-cap="The Air theme: the light option, pale frost panels with dark ink text, its own window art, and a new title font."
               alt="The same demo window in Air: pale frost panel, dark ink text, inscriptional capitals title font" loading="lazy">
          <span class="cap">UI Theme: Air</span>
        
        
          <img src="https://catnipgames.net/blog/images/uitk-skin-arcane.png" data-full="https://catnipgames.net/blog/images/uitk-skin-arcane.png"
               data-cap="The Arcane theme: violet void panels, lilac text, a violet glow on focus and progress, and a blackletter title font."
               alt="The same demo window in Arcane: violet-black panel, lilac text, violet progress bar and title" loading="lazy">
          <span class="cap">UI Theme: Arcane</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-17</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-headlines</guid>
      <pubDate>Fri, 17 Jul 2026 21:11:16 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Fixed a black screen some players hit after launching.</b> The game would run with sound but show nothing. It traces to the NVIDIA overlay conflicting with the game running in DirectX 12 full screen. The launcher now defaults to DirectX 11 and windowed, which avoids it; players who set their own graphics or display option keep it. Launcher build 14 carries the change and installs itself on next start.</li>
        <li><b>Chaos is now on build 36, and Episode 2 is open to every chaos account.</b> Windows and Linux clients and the server shipped together from one version, with the login probe passing before go-live. Build 36 adds the separate Voice volume slider, the white-terrain fix for outdoor ground, the client-side shader-preparation fix that stops a cold-cache black screen on first load, and the entry-field text-clipping fix, on top of the week's combat, dungeon, housing, vendor, and audio work. Launcher build 15 went out with it, carrying the durable self-update fix for the last machines stuck re-downloading updates. The server grants Episode 2 access to every account at login, no per-account setup.</li>
        <li><b>A dodged attack no longer leaves you bleeding.</b> Attack skills that carry an extra effect, such as Rend's bleed and defense debuff, applied those extras even when the whole swing was dodged, because each part of the skill rolled its own outcome and the debuff never rolled at all. One swing now rolls once: dodge or miss it and nothing sticks; block, parry, or glance it and the reduced hit still carries its riders. Verified in a live session: a dodged Rend leaves no bleed and no debuff, a landed one keeps both for their full run. Rides the next chaos build.</li>
        <li><b>The Linux launcher was downloading the Windows game, and now it downloads the Linux one.</b> A Linux install pointed at the Windows downloads by mistake, so it could not start the game, and an update could replace the launcher with a Windows program that will not run on Linux. That is the report of the Linux version being an .exe and not really a launcher. Fresh Linux launchers now use the Linux downloads, and a launcher already set wrong corrects itself on its next start. This is live in launcher build 14 on the Linux channel. A launcher that was already broken cannot repair itself through an update, so anyone still stuck should download the Linux launcher fresh from the tester downloads page.</li>
        <li><b>The game's entire legacy UI is now inventoried for a future move to Unity's modern UI framework, and the windows already on that framework now look like the game.</b> Every window, HUD element, tooltip, list row, and world-space sign, 181 elements plus the 12 shared subsystems under them, now has a written migration-difficulty rating and its specific challenges catalogued, backed by a scripted component count that can be re-run after any UI change; the pass also found three dead windows that can be deleted instead of ported. Meanwhile the tavern game board, the Oracle question window, and the GM and tester tool panels traded their plain gray boxes for the classic bracket frames, lettering, buttons, and scrollbars, driven by one shared theme any future window inherits. Rides the next chaos build.</li>
        <li><b>Found why several players could not get into the game, and fixed the launcher's part in it.</b> Reports came in of Play doing nothing. The server checked out healthy end to end, and the trail led to the machines themselves: if a copy of the game from an earlier session was still alive in the background, usually after a shutdown hang, clicking Play started a new copy that exited a tenth of a second later with no window and no error, every time, until a reboot. Daily logins had fallen from 11 to 3 across four days. Reproduced locally and fixed: the launcher now detects the stuck copy, says so, and offers a Close game and play button, and a game that exits right after starting now shows an error instead of counting as a launch. Ships as launcher build 13; until then, ending the stuck game process in Task Manager or rebooting restores play.</li>
        <li><b>The loading bar frozen at 94% was the other half of the lockouts, and it is fixed too.</b> Players reported the loading screen sticking near 94% for a very long time. The game was compiling every shader for the graphics card in one blocking step at the end of the load; this week's shader repair restored the full shader set that step compiles, and any graphics driver update wipes the card's cache and forces the whole compile again. One measured start took 75 minutes to reach the login screen, and July 16 saw 86 game launches against 5 successful logins as players gave up and retried. Killing the frozen game is also what left behind the stuck copies that broke the Play button. The loading screen now compiles shaders in small slices with a visible counter, stays responsive, and lets players in after about 20 seconds while the rest finishes in the background. Rides the next chaos build; until then, letting the 94% screen finish once unblocks a machine for good.</li>
        <li><b>Some machines never applied launcher updates; build 14 broke the loop for nearly all of them, and a follow-up handles the last stuck case.</b> After today's launcher release, patch traffic showed several players' launchers downloading the new version over and over without ever applying it, and one machine had pulled the previous release nine times across two days; those players never reached the login server. When the update could not be written into place, the launcher restarted its old self, which immediately re-detected the update and downloaded it again, with no error shown anywhere. Build 14 cleared this for the whole fleet except one machine that kept looping, so a follow-up now confirms an update actually landed before calling it done, keeps both launcher program files on the same version, and stops re-downloading a build that will not install, asking for a one-time reinstall instead. Awaiting release.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Launcher: Added a Display setting to the launcher (Windowed or Full screen) next to the Graphics…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-47c5342c7216</guid>
      <pubDate>Fri, 17 Jul 2026 13:57:39 -0500</pubDate>
      <description><![CDATA[Added a Display setting to the launcher (Windowed or Full screen) next to the Graphics setting, and changed the defaults to DirectX 11 and Windowed. This fixes a black screen with audio some players reported: the NVIDIA overlay blanks the presented frame when the game runs in DirectX 12 full screen. DirectX 11 and windowed both sidestep it. An explicit Graphics or Display pick is always kept. Shipped as launcher build 14 (Windows and Linux); the windowed default fully applies to the game on the next chaos build, the DirectX 11 default applies immediately. Immediate workaround for anyone stuck: pick DirectX 11 in the launcher, or close the NVIDIA overlay app.]]></description>
    </item>
    <item>
      <title>Launcher: Client side of the same black screen fix: the game now finishes preparing its shaders…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-41efa8cabd50</guid>
      <pubDate>Fri, 17 Jul 2026 14:28:51 -0500</pubDate>
      <description><![CDATA[Client side of the same black screen fix: the game now finishes preparing its shaders behind the loading screen before showing the world, instead of revealing the scene while shaders were still compiling. On a machine with a cold graphics cache that early reveal could show a black screen or trip a graphics-driver reset that ended the session. The loading screen shows a "Preparing shaders" count that keeps advancing; a first load on a cold cache can take longer but it completes instead of freezing or crashing. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Launcher: Launcher build 14 also delivers the self-update repair for machines that were…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-d0c5173e96fc</guid>
      <pubDate>Fri, 17 Jul 2026 13:57:40 -0500</pubDate>
      <description><![CDATA[Launcher build 14 also delivers the self-update repair for machines that were re-downloading the launcher every start, and points Linux and macOS launchers at their own patch files instead of the Windows ones.]]></description>
    </item>
    <item>
      <title>Launcher: Hardened the self-update for the one machine build 14 could not rescue. It was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-505edc8dbce4</guid>
      <pubDate>Fri, 17 Jul 2026 15:33:35 -0500</pubDate>
      <description><![CDATA[Hardened the self-update for the one machine build 14 could not rescue. It was reinstalling the update into memory but never onto disk, so it looped forever with no error. The launcher now verifies an update actually wrote itself into place before treating it as installed, updates both of its program files together so the shortcut and the game's own launch path can never disagree on the version, and after an update fails to install a few times it stops re-downloading it and asks the player to reinstall once instead. Reinstalling over a stuck copy now waits for the old one to close so it reliably replaces it, and the launcher records its own version in its settings file for easier diagnosis. Awaiting release.]]></description>
    </item>
    <item>
      <title>Launcher: Confirmed the Linux launcher fix is live on the Linux channel (build 14) and notified the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-5a531e94e6fe</guid>
      <pubDate>Fri, 17 Jul 2026 19:03:05 -0500</pubDate>
      <description><![CDATA[Confirmed the Linux launcher fix is live on the Linux channel (build 14) and notified the waiting testers to re-download, since an install already pulling the Windows files cannot repair itself through an update. Its verification task had been filed a few minutes before the release and never got the "it shipped" note, so testers kept reading "not on chaos yet" while the fix was already out. Added a release step that lists any verification task not yet told a build shipped, so a launcher release can no longer leave one stale.]]></description>
    </item>
    <item>
      <title>Release: Deployed chaos build 35: Windows and Linux clients and the server, all built from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-0280ab348450</guid>
      <pubDate>Fri, 17 Jul 2026 11:48:39 -0500</pubDate>
      <description><![CDATA[Deployed chaos build 35: Windows and Linux clients and the server, all built from the same version and verified by the automated login probe before going live. This build carries the week's fixes: Riposte and Opportunity Strike, Lightning Storm damage and sound, dodged attacks no longer applying poison effects, mimic and treasure chest interactions, treasure map ambush recovery, dungeon monsters in walls, mega-farm responsiveness, vendor listings window, the shader repair for dark and washed-out surfaces, and more.]]></description>
    </item>
    <item>
      <title>Release: Opened Episode 2 to every chaos account: the server now grants access at login, so any…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-c4b553ccd20b</guid>
      <pubDate>Fri, 17 Jul 2026 11:48:40 -0500</pubDate>
      <description><![CDATA[Opened Episode 2 to every chaos account: the server now grants access at login, so any account can play the full content without per-account setup. Verified active on the running server.]]></description>
    </item>
    <item>
      <title>Release: Released launcher build 13 for Windows and Linux. A lingering game copy that made Play…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-e0dbc3201eb4</guid>
      <pubDate>Fri, 17 Jul 2026 11:48:41 -0500</pubDate>
      <description><![CDATA[Released launcher build 13 for Windows and Linux. A lingering game copy that made Play appear to do nothing is now surfaced with a clear message, and fresh installs running under WINE or Proton default to DirectX 11 to avoid a ground-rendering issue. Installed launchers update themselves on next start.]]></description>
    </item>
    <item>
      <title>Release: Deployed chaos build 36: Windows and Linux clients and the server, all from one version…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-8cc90455efed</guid>
      <pubDate>Fri, 17 Jul 2026 21:10:15 -0500</pubDate>
      <description><![CDATA[Deployed chaos build 36: Windows and Linux clients and the server, all from one version, with the automated login probe passing before go-live. Over build 35 it adds the separate Voice volume slider, the white-terrain fix for outdoor ground (including the Solace Bridge Outskirts start area), the client-side shader-preparation fix that stops a cold-cache black screen on first load after a graphics driver update, and the entry-field text-clipping fix.]]></description>
    </item>
    <item>
      <title>Release: Released launcher build 15 for Windows and Linux. It adds the durable self-update fix for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-002bba63fcc6</guid>
      <pubDate>Fri, 17 Jul 2026 21:10:16 -0500</pubDate>
      <description><![CDATA[Released launcher build 15 for Windows and Linux. It adds the durable self-update fix for the last machines that kept re-downloading an update without applying it: the launcher now confirms an update actually reached disk before treating it as done, keeps both of its program files on the same version, and after a few failed installs stops re-downloading and asks for a one-time reinstall instead. Installed launchers self-update on next start.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed outdoor ground rendering as a flat white surface in some scenes, including the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-81376652f3d9</guid>
      <pubDate>Fri, 17 Jul 2026 14:50:17 -0500</pubDate>
      <description><![CDATA[Fixed outdoor ground rendering as a flat white surface in some scenes, including the Solace Bridge Outskirts starting area (reported as "Kingsroad has white terrain"), while the grass, rocks, and props on top of it stayed correct. Same family as this week's washed-out decorations: the build's content-packing step trimmed a shader feature the terrain needs, so the ground fell back to an untextured surface. The packing step now keeps the terrain's lit shader variant with each ground shader, using the real values captured from the scenes that already worked. The code compiles clean; an editor test run and a sample build to confirm the ground textures are pending the shared editor coming back online. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed the failed Linux client build. The compiler toolchain it needs had only ever been…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-3b4acc03ef12</guid>
      <pubDate>Fri, 17 Jul 2026 02:53:37 -0500</pubDate>
      <description><![CDATA[Fixed the failed Linux client build. The compiler toolchain it needs had only ever been installed by hand on the build machine, so the build survived on cached state until an unrelated package list change forced a refresh and dropped it. The toolchain packages are now committed with the project, so every build machine resolves them on its own.]]></description>
    </item>
    <item>
      <title>Build pipeline: Traced this week's 4-hour Windows build times to two one-time full content-pack rebuilds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-20fb42fa750f</guid>
      <pubDate>Fri, 17 Jul 2026 02:53:38 -0500</pubDate>
      <description><![CDATA[Traced this week's 4-hour Windows build times to two one-time full content-pack rebuilds: the shader repair earlier this week deliberately forced one, and removing the occlusion plugin touched 323 scenes and forced another. Confirmed the new fast packaging step is working as intended (a 16 GB build packaged in minutes instead of most of an hour), and rebuilds now log exactly which changed files caused them.]]></description>
    </item>
    <item>
      <title>Build pipeline: Pointed the Windows build machine at the shared asset cache it was never configured to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-dab70d14277c</guid>
      <pubDate>Fri, 17 Jul 2026 02:53:39 -0500</pubDate>
      <description><![CDATA[Pointed the Windows build machine at the shared asset cache it was never configured to use; every build had been re-importing assets it could have fetched from the cache.]]></description>
    </item>
    <item>
      <title>Build pipeline: Measured the end of the Windows build minute by minute: compressing the 17 GB package…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-869b60d717bf</guid>
      <pubDate>Fri, 17 Jul 2026 03:11:19 -0500</pubDate>
      <description><![CDATA[Measured the end of the Windows build minute by minute: compressing the 17 GB package took under 5 minutes; most of the remaining tail was copying the finished package between machines.]]></description>
    </item>
    <item>
      <title>Build pipeline: Debug data that players never receive (over 3 GB per build) no longer rides inside the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-4bb7b92cae37</guid>
      <pubDate>Fri, 17 Jul 2026 03:11:20 -0500</pubDate>
      <description><![CDATA[Debug data that players never receive (over 3 GB per build) no longer rides inside the main build package. It now ships as its own small archive kept for crash analysis, so every build's copy and deploy steps move less data.]]></description>
    </item>
    <item>
      <title>Build pipeline: Added counters to the slowest part of the build, the engine's content-pack step, which…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-f882c3e58f55</guid>
      <pubDate>Fri, 17 Jul 2026 03:23:37 -0500</pubDate>
      <description><![CDATA[Added counters to the slowest part of the build, the engine's content-pack step, which was measured at 3 of the 4.4 hours. Each build now reports how many packs that step actually rewrote versus skipped, so the next build tells us whether it is rebuilding packs it did not need to.]]></description>
    </item>
    <item>
      <title>Build pipeline: Verified the content-pack fix with two forced rebuilds on an unchanged project: the scene…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-b64a14937198</guid>
      <pubDate>Fri, 17 Jul 2026 08:50:21 -0500</pubDate>
      <description><![CDATA[Verified the content-pack fix with two forced rebuilds on an unchanged project: the scene pack step went from 1 hour 53 minutes to 9 minutes, and the resource pack step from 1 hour 10 minutes to 16 minutes, each rewriting only the packs that really changed. A routine build with no content changes now takes about 31 minutes end to end.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed a false build failure: when a build's inputs are completely unchanged, the engine…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-5d78c15a4cf6</guid>
      <pubDate>Fri, 17 Jul 2026 07:15:05 -0500</pubDate>
      <description><![CDATA[Fixed a false build failure: when a build's inputs are completely unchanged, the engine takes a fast path that rebuilds only the game code and reports no build summary, which our final verification treated as a failed build. Verification now accepts that case when the rebuilt files are provably fresh, and still fails on genuinely broken or canceled builds.]]></description>
    </item>
    <item>
      <title>Build pipeline: Added a diagnostic switch to the build jobs that forces the content-pack step to run even…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-84cc036f4959</guid>
      <pubDate>Fri, 17 Jul 2026 05:11:31 -0500</pubDate>
      <description><![CDATA[Added a diagnostic switch to the build jobs that forces the content-pack step to run even when nothing changed, for measuring rebuild costs on demand. Verified the build farm's asset cache and the new split packaging on a quiet build: the whole build ran in 31 minutes of actual work.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed a hidden cost of this week's shader repair: the helper file it attaches to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-d9b283d5a09c</guid>
      <pubDate>Fri, 17 Jul 2026 03:36:07 -0500</pubDate>
      <description><![CDATA[Fixed a hidden cost of this week's shader repair: the helper file it attaches to shader-carrying content packs was generated fresh on every build, which made those packs look changed every time and blocked the engine from skipping them. The helper files are now stable between builds and only rewritten when their content really changes.]]></description>
    </item>
    <item>
      <title>Build pipeline: Updated the Linux and Windows build machines to the engine's newest maintenance release…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-84c590e95c41</guid>
      <pubDate>Fri, 17 Jul 2026 14:41:19 -0500</pubDate>
      <description><![CDATA[Updated the Linux and Windows build machines to the engine's newest maintenance release, installed alongside the previous version so a machine can be switched back with one setting. The build license carried over without reactivation. The Mac build machine is next; the project itself keeps recording the older version until it catches up.]]></description>
    </item>
    <item>
      <title>Build pipeline: Verified the engine update with a real Linux client build: a one-time re-import of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-b91b437e8c85</guid>
      <pubDate>Fri, 17 Jul 2026 14:41:20 -0500</pubDate>
      <description><![CDATA[Verified the engine update with a real Linux client build: a one-time re-import of the game's content, then a clean pass. The first attempt was stopped by the build's own freshness check because new work landed mid-import; the retry passed in under two minutes on the warmed cache.]]></description>
    </item>
    <item>
      <title>Combat: Fixed attack skills with damage-over-time or debuff riders, such as Rend, still applying…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-f48761eae84d</guid>
      <pubDate>Fri, 17 Jul 2026 04:58:59 -0500</pubDate>
      <description><![CDATA[Fixed attack skills with damage-over-time or debuff riders, such as Rend, still applying those riders when the target fully dodged or the attack missed. Each part of a skill rolled its own hit outcome, and pure debuff parts never rolled at all, so a dodged swing still left its bleed and its defense reduction on the target.]]></description>
    </item>
    <item>
      <title>Combat: A skill use now rolls one outcome shared by all of its parts: dodged or missed means the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-13a5bbaac2ad</guid>
      <pubDate>Fri, 17 Jul 2026 04:59:00 -0500</pubDate>
      <description><![CDATA[A skill use now rolls one outcome shared by all of its parts: dodged or missed means the direct damage, the damage over time, and the debuff all fail together, and a bleed that was already queued ends after its first zero tick. Blocked, parried, and glancing hits still take reduced damage, so their riders still apply. The change covers player and creature attacks alike, including the bleeds, poisons, and stuns attached to weapon skills.]]></description>
    </item>
    <item>
      <title>Combat: Damaging ground fields still roll every pulse separately, so dodging one pulse of a fire…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-452f69369424</guid>
      <pubDate>Fri, 17 Jul 2026 04:59:01 -0500</pubDate>
      <description><![CDATA[Damaging ground fields still roll every pulse separately, so dodging one pulse of a fire field does not protect against the next, and Rapid Fire keeps its arrow-by-arrow rolls.]]></description>
    </item>
    <item>
      <title>Combat: Closed a combined-outcome gap in the on-hit check for nested skill effects, where a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-2cc6b50d5809</guid>
      <pubDate>Fri, 17 Jul 2026 04:59:02 -0500</pubDate>
      <description><![CDATA[Closed a combined-outcome gap in the on-hit check for nested skill effects, where a blocked-and-dodged swing counted as landed, and dodge messages from one swing no longer print twice.]]></description>
    </item>
    <item>
      <title>Combat: Verified in a live session against a local server: a landed Rend applies its bleed and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-8dcfff781beb</guid>
      <pubDate>Fri, 17 Jul 2026 04:59:03 -0500</pubDate>
      <description><![CDATA[Verified in a live session against a local server: a landed Rend applies its bleed and debuff for their full duration, a dodged Rend applies neither, and creature attacks flow through the same rules. 16 new automated tests cover the shared-roll rules, and the existing combat balance tests stay green.]]></description>
    </item>
    <item>
      <title>Combat: Filed follow-ups for two adjacent finds: weapon enchant procs still fire on dodged swings…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-47e61c38f470</guid>
      <pubDate>Fri, 17 Jul 2026 04:59:04 -0500</pubDate>
      <description><![CDATA[Filed follow-ups for two adjacent finds: weapon enchant procs still fire on dodged swings (#748), and ten skills apply their riders before their damage rolls, so they escape the new check (#750).]]></description>
    </item>
    <item>
      <title>Audio: Added a Voice volume slider to Settings &gt; Audio, below the SFX slider, so players can set…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-76709d2ff23d</guid>
      <pubDate>Fri, 17 Jul 2026 15:14:08 -0500</pubDate>
      <description><![CDATA[Added a <b>Voice</b> volume slider to Settings &gt; Audio, below the SFX slider, so players can set character voices apart from other sound effects. It controls NPC spoken dialogue and character combat vocal sounds such as grunts, pain, and death. Those previously followed the SFX slider, or for spoken dialogue only the master volume, with no way to turn voices down on their own. The slider position is remembered between sessions. Rides the next chaos build; tester task #767.]]></description>
    </item>
    <item>
      <title>Audio: The re-route keys off the combat and dialogue sound names, so creature roars and emotes…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-1d34dd1469f5</guid>
      <pubDate>Fri, 17 Jul 2026 15:14:09 -0500</pubDate>
      <description><![CDATA[The re-route keys off the combat and dialogue sound names, so creature roars and emotes that use custom per-sound names still follow SFX for now, pending a later per-sound tagging pass. Added automated tests covering which sound events count as voice.]]></description>
    </item>
    <item>
      <title>Audio: Localized the new "Voice" label in all seven translated languages (German, Spanish…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-5bd72e9c18af</guid>
      <pubDate>Fri, 17 Jul 2026 15:28:43 -0500</pubDate>
      <description><![CDATA[Localized the new "Voice" label in all seven translated languages (German, Spanish, French, Italian, Portuguese, Russian, Simplified Chinese), so it reads in each player's language instead of falling back to English.]]></description>
    </item>
    <item>
      <title>Community: Logged two long-standing Lua scripting requests from the forum (conversation-variable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-2bbcfca4d33f</guid>
      <pubDate>Fri, 17 Jul 2026 03:24:16 -0500</pubDate>
      <description><![CDATA[Logged two long-standing Lua scripting requests from the forum (conversation-variable access, and reading a target's buffs/debuffs/stats) onto the suggestion tracker.]]></description>
    </item>
    <item>
      <title>Launcher: Investigated this week's player reports of being unable to get into the game. Every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-a710a2376676</guid>
      <pubDate>Fri, 17 Jul 2026 07:04:40 -0500</pubDate>
      <description><![CDATA[Investigated this week's player reports of being unable to get into the game. Every server-side check was green and a scripted end-to-end login from outside the server passed, while the affected players' game clients never produced any network traffic at all. Distinct daily logins had fallen from 11 to 3 across four days.]]></description>
    </item>
    <item>
      <title>Launcher: Root cause, reproduced locally: the launcher starts the game in single-instance mode, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-05308b80049b</guid>
      <pubDate>Fri, 17 Jul 2026 07:04:41 -0500</pubDate>
      <description><![CDATA[Root cause, reproduced locally: the launcher starts the game in single-instance mode, and a leftover game process from an earlier session (typically a hung shutdown) made every new launch exit in about 150 ms with no window and no error. The exit counted as normal by the game's own accounting, so no crash report was generated and nothing reached the server, which kept the failure out of every telemetry channel. A reboot was the only recovery.]]></description>
    </item>
    <item>
      <title>Launcher: Fixed in launcher build 13: clicking Play now detects a game copy already running and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-026a590807e3</guid>
      <pubDate>Fri, 17 Jul 2026 07:04:42 -0500</pubDate>
      <description><![CDATA[Fixed in launcher build 13: clicking Play now detects a game copy already running and offers a Close game and play button; the launcher also waits a moment after starting the game and reports an error with the exit code if the game closes immediately, instead of treating it as a successful launch. Launch attempts and outcomes are now written to the launcher log. Not released yet.]]></description>
    </item>
    <item>
      <title>Launcher: Found in the same trace: builds were shipping two runtime bookkeeping files the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-608f0a5ae27e</guid>
      <pubDate>Fri, 17 Jul 2026 07:04:43 -0500</pubDate>
      <description><![CDATA[Found in the same trace: builds were shipping two runtime bookkeeping files the game rewrites on every run, which forced the launcher to re-download that pair on every check. The build publisher now drops them unconditionally, with tests covering it.]]></description>
    </item>
    <item>
      <title>Launcher: Wrote the whole diagnosis into the operations runbook: how to tell a healthy-server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-e3f40e735b30</guid>
      <pubDate>Fri, 17 Jul 2026 07:11:19 -0500</pubDate>
      <description><![CDATA[Wrote the whole diagnosis into the operations runbook: how to tell a healthy-server lockout from a real outage, which launcher request patterns identify a player failing before any server contact, and the recovery steps. The launcher-side fix is documented with the patcher internals.]]></description>
    </item>
    <item>
      <title>Launcher: Fixed the Linux launcher pulling the Windows game files instead of the Linux ones. Every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-60ae904d394e</guid>
      <pubDate>Fri, 17 Jul 2026 13:54:46 -0500</pubDate>
      <description><![CDATA[Fixed the Linux launcher pulling the Windows game files instead of the Linux ones. Every install, on any operating system, was pointed at the Windows downloads, so a Linux launcher patched a game it could not run, and an update could overwrite the launcher itself with the Windows program. Fresh installs now use each platform's own downloads, and a launcher already set to the wrong ones repairs itself the next time it starts. An install already broken this way needs a one-time re-download, since it cannot repair through an update. Verified on the build machine with the real Linux launcher. Not released yet.]]></description>
    </item>
    <item>
      <title>Client: Root-caused the second lockout symptom, the loading bar freezing near 94%: the end of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-04122917bdfe</guid>
      <pubDate>Fri, 17 Jul 2026 08:13:07 -0500</pubDate>
      <description><![CDATA[Root-caused the second lockout symptom, the loading bar freezing near 94%: the end of every load compiled all shaders for the graphics card in one blocking step on the main thread. The shader repair in this week's build restored the full shader set that step works through, so a machine with a cold graphics driver cache (fresh install or any driver update) froze for minutes to over an hour. Server records put one player's start at 75 minutes from launch to login screen, with 86 launches and 5 successful logins fleet-wide on July 16.]]></description>
    </item>
    <item>
      <title>Client: Replaced the blocking compile with progressive warmup: shaders compile in small per-frame…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-81a09ee20531</guid>
      <pubDate>Fri, 17 Jul 2026 08:13:08 -0500</pubDate>
      <description><![CDATA[Replaced the blocking compile with progressive warmup: shaders compile in small per-frame batches sized by measured cost, the loading screen shows a live Preparing shaders counter, and after 20 seconds the load completes while the remaining shaders finish in the background at a few milliseconds a frame. A new load takes over cleanly from any background work still running.]]></description>
    </item>
    <item>
      <title>Client: Covered the batch-pacing math with 6 automated tests and compile-verified both game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-875b294c3b4f</guid>
      <pubDate>Fri, 17 Jul 2026 08:13:09 -0500</pubDate>
      <description><![CDATA[Covered the batch-pacing math with 6 automated tests and compile-verified both game assemblies headless. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Client: Posted interim guidance for stuck players on the tester tracker: let the 94% screen…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-1627bf3375da</guid>
      <pubDate>Fri, 17 Jul 2026 08:13:10 -0500</pubDate>
      <description><![CDATA[Posted interim guidance for stuck players on the tester tracker: let the 94% screen finish once, progress is kept across attempts, and later starts are normal speed.]]></description>
    </item>
    <item>
      <title>Client: Cleared three stale compiler warnings in the client and its editor tools: a networking…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-a4154871a892</guid>
      <pubDate>Fri, 17 Jul 2026 14:50:18 -0500</pubDate>
      <description><![CDATA[Cleared three stale compiler warnings in the client and its editor tools: a networking field that was set but never read, two connection helpers that lacked their optional-argument markers, and a one-time asset-migration tool that intentionally checks an option the engine has since retired. No gameplay change; both game code sets still compile clean.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Catalogued the game's entire legacy NGUI interface ahead of a future move to Unity's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-9666a8a65b9d</guid>
      <pubDate>Fri, 17 Jul 2026 06:09:20 -0500</pubDate>
      <description><![CDATA[Catalogued the game's entire legacy NGUI interface ahead of a future move to Unity's modern UI Toolkit: 181 elements covering every window, HUD piece, tooltip, reusable list row, and world-space nameplate, plus the 12 shared subsystems they all sit on, each rated for migration difficulty with its specific challenges written down. A new scripted scan counts the UI components inside every window so the ratings rest on measured numbers and can be regenerated after UI changes.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: The inventory surfaced quick wins and hard walls: three obsolete windows can be deleted…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-f14e8ad0ea03</guid>
      <pubDate>Fri, 17 Jul 2026 06:09:21 -0500</pubDate>
      <description><![CDATA[The inventory surfaced quick wins and hard walls: three obsolete windows can be deleted instead of ported, two windows already run on the new framework, and the hardest work concentrates in the shared foundations (drag-and-drop, the input layer, chat's rich text with clickable item links) rather than in any single window. The whole like-for-like port measures in the hundreds of person-days, so it is written down as a roadmap epic before it is decided.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Built a shared visual theme for the windows that already run on Unity's modern UI…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-de5184f38ffa</guid>
      <pubDate>Fri, 17 Jul 2026 06:12:59 -0500</pubDate>
      <description><![CDATA[Built a shared visual theme for the windows that already run on Unity's modern UI framework (the tavern game board, the Oracle question window, and the GM and tester tool panels). They used to draw as plain dark gray panels; they now use the classic UI's bracket frames, entry-field insets, buttons, checkboxes, scrollbars, and dropdowns, the game's body and title fonts, and its standard text palette, all sourced from the same art the classic windows use.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: The theme is one stylesheet applied game-wide on the new framework, so a future window…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-c011b13ddaee</guid>
      <pubDate>Fri, 17 Jul 2026 06:13:00 -0500</pubDate>
      <description><![CDATA[The theme is one stylesheet applied game-wide on the new framework, so a future window built from plain building blocks comes out looking native with no per-window styling. Button behavior matches the classic UI in detail: the label brightens on hover, and the frame tints blue while held down.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Fixed window sizing on the new framework: those windows used to follow the operating…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-faafb9918a47</guid>
      <pubDate>Fri, 17 Jul 2026 06:13:01 -0500</pubDate>
      <description><![CDATA[Fixed window sizing on the new framework: those windows used to follow the operating system's display scale, so on high-resolution screens they rendered a different size than every other game window. They now follow the same sizing rules as the classic UI at every resolution.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Added automated checks that guard the theme's art, fonts, stylesheet wiring, and sizing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-e9b538ed7d53</guid>
      <pubDate>Fri, 17 Jul 2026 06:13:02 -0500</pubDate>
      <description><![CDATA[Added automated checks that guard the theme's art, fonts, stylesheet wiring, and sizing setup, so a future asset or settings change that would quietly break the look fails the test run instead.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Fixed typed text getting clipped in the Oracle window's question box after the theme…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-e42b3d250449</guid>
      <pubDate>Fri, 17 Jul 2026 13:10:31 -0500</pubDate>
      <description><![CDATA[Fixed typed text getting clipped in the Oracle window's question box after the theme landed. The game's body font is taller than the framework's default font, so fixed-height entry fields cut the letters off; entry text is now centered vertically in every field.]]></description>
    </item>
    <item>
      <title>Oracle: Added a What's New section to the in-game Oracle. Players can now ask the Oracle what…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-c48e2cfc3c67</guid>
      <pubDate>Fri, 17 Jul 2026 14:50:19 -0500</pubDate>
      <description><![CDATA[Added a What's New section to the in-game Oracle. Players can now ask the Oracle what changed recently and get a grouped summary of the week's new features, bug fixes, and balance changes, each with a short explanation the Oracle can expand on when asked about a specific item. Live now on the Oracle service; the list is curated to player-facing changes.]]></description>
    </item>
    <item>
      <title>Oracle: Players can now revise a report the Oracle just filed. Before, once the Oracle logged a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-90fdd4fdcb10</guid>
      <pubDate>Fri, 17 Jul 2026 15:39:57 -0500</pubDate>
      <description><![CDATA[Players can now revise a report the Oracle just filed. Before, once the Oracle logged a bug it had no way to change it, so asking it to reword or add a detail hit a dead end and the Oracle came across as curt. It now adds the player's correction or extra detail as a follow-up note on the same report, only for a report filed earlier in the same conversation. Live now on the Oracle service.]]></description>
    </item>
    <item>
      <title>Oracle: Made the Oracle warmer and less quick to argue. It now assumes good faith and stays kind…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-ba19438da71b</guid>
      <pubDate>Fri, 17 Jul 2026 15:39:58 -0500</pubDate>
      <description><![CDATA[Made the Oracle warmer and less quick to argue. It now assumes good faith and stays kind even when it has to decline something, treats a request to reword a real report as help rather than as an attempt to bend its rules, and files a report the moment a player disputes an explanation instead of arguing the point. Live now on the Oracle service.]]></description>
    </item>
    <item>
      <title>Oracle: Also rolled out the Oracle's wider bug-area list, so reports now sort into 20…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-71721eb28ac6</guid>
      <pubDate>Fri, 17 Jul 2026 15:39:59 -0500</pubDate>
      <description><![CDATA[Also rolled out the Oracle's wider bug-area list, so reports now sort into 20 player-facing areas instead of 13, adding decorations, stability, graphics, audio, social, localization, and Oracle itself. Live now on the Oracle service.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-17</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-17-images</guid>
      <pubDate>Fri, 17 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/uitk-sota-theme-gm-panels.png" data-full="https://catnipgames.net/blog/images/uitk-sota-theme-gm-panels.png" alt="The GM Tools and GM Event Panel windows restyled by the shared theme: classic bracket frames and title lettering, framed buttons and entry fields, and the standard red close button on a dark backing">
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-16</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-headlines</guid>
      <pubDate>Fri, 17 Jul 2026 15:58:12 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Six vendor window bugs fixed in one pass.</b> The Vendor Listings in Zone window collected six player reports: it could not be widened, opened too narrow for its own columns, hid its scroll bar behind the item rows, shrank prices over 2,000,000 gold to unreadable size, dropped the frame rate the whole time it was open, and could freeze the game while scrolling. All six had one root: the window never grew when new columns were added, and the tooltip under the cursor was being rebuilt every single frame. The window now opens wider, resizes from every edge and corner, keeps its scroll bar on top, shows eight-digit prices at full size, and idles quietly. Rides the next chaos build.</li>
        <li><b>25 scenes got maps today.</b> The new capture pipeline ran its first full batch: every Novia adventure scene that was missing a map now has one, including Graff Island, Vauban Pass, the Midras and Rhun ruins, Grunvald Shardfall, the Oracle Temple, and the Manor of Mystery. Each map was rendered top down in the editor with its world alignment computed exactly instead of hand-tuned, and every image was reviewed before shipping. They ride the next chaos build.</li>
        <li><b>Lightning Storm did no damage and made no sound; the silence led to an engine bug muting pooled effects game-wide.</b> A tester reported the storm raining bolts that never hurt anything and never made a sound (report #561). The damage half was an ownership standoff: ground effects apply damage on the victim's side, the damage code demanded the attacker's side, and with two players in the scene nobody won, for every ground-effect spell in the game. The audio half traced past the spell entirely: the engine upgrade's background spawning delivers pooled effect copies with their sound clips missing, which had quietly muted every effect that plays sound from a plain source. Both are fixed, with automated tests on the clip repair, and ride the next chaos build.</li>
        <li><b>Dark lantern glass on chaos is fixed, and the washed-out white decorations share the cause.</b> A tester compared chaos and production side by side and reported that the orange glass on galleon lanterns never lights up on chaos (report #661). Players separately reported wooden clocks, mounted wyvern-head trophies, and porcelain vases rendering washed-out white (report #559). Both trace to the Unity 6 build step that packs game content: it trims shader features pack by pack, so features used by materials in other packs were stripped with no error anywhere. Glowing surfaces rendered dark, and the fine detail layer that gives decorations their wood grain and color was erased. The packing step now keeps the needed features with each shared shader, automated tests render packed materials and fail the build on a regression, and the repairs ride the next chaos build. The spider web trap that covered players as a solid white sheet instead of a translucent web (report #651) turned out to be the same bug eating the web's transparency, verified fixed by the same repair. So did the pale albino crocodiles reported from the wetlands (report #680): the packed shader lost the crocodile skin's specular feature, and the same repair restores their colors.</li>
        <li><b>Monsters no longer lurk inside the walls of player dungeons.</b> In player-built dungeons, fire elementals in the lava grotto room spawned and fought from inside the cave walls, and a summoned elemental could slip out of the room entirely (report #641). Rooms with breakable walls have creature paths baked straight through the wall so that breaking it opens a real shortcut, and the runtime seal that is supposed to block that path until then never engaged in player dungeons. It engages now, in every room of the dungeon kit. Four spawn points authored inside rock piles and furniture were also moved into the open, stale room navigation data was rebuilt, and a new automated test checks every spawn point in all 16 spawn-capable rooms. Rides the next chaos build.</li>
        <li><b>Bloodstained treasure maps no longer eat the map.</b> The Libris Ruins dig ambush could wedge: skeletons chased unrelated wildlife across the map or fled onto unwalkable ground, the battle never finished, and after 30 minutes the event reset without the chest, with the map already consumed at dig time (report #640, player reports going back to 2023). Runaway ambush creatures are now pulled back to the fight after 20 seconds and removed if they bolt again, overlapping spawn points spread apart, and if an ambush still cannot be finished the chest spawns anyway when the timer runs out. Watched live during verification: two skeletons ran off on their own seconds after spawning and both were recovered. Rides the next chaos build.</li>
        <li><b>Riposte and Opportunity Strike now pay off reliably.</b> Riposte is meant to deal triple damage right after a successful parry, and Opportunity Strike a heavy bonus hit right after a dodge, but the bonus rarely triggered, and whether it worked depended on who else was in the scene. The game now registers your parries, dodges, and received critical hits the moment their combat text appears, for every player in the scene, so the follow-up bonus lands every time it should; Fortify Defenses' bonus after a crit is fixed by the same change. Riposte's skill data also dealt both its normal and tripled hits together in a narrow band; a cast within 5 seconds of the parry now deals exactly the tripled hit. Rides the next chaos build.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Agriculture: Fixed planting, watering, and harvesting appearing to do nothing on very large farms…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-271032019f5e</guid>
      <pubDate>Thu, 16 Jul 2026 11:16:33 -0500</pubDate>
      <description><![CDATA[Fixed planting, watering, and harvesting appearing to do nothing on very large farms (report #630, from a forum thread on 30,000 to 41,000 planting-spot farms). The action always counted on the server, but the on-screen update waited behind a lot-content queue that on farms that size could lag by the better part of an hour, so players restarted the client to see each result. The plant now updates on screen the moment the server confirms the action, on any size of farm, and the server remains the authority on the real state.]]></description>
    </item>
    <item>
      <title>Agriculture: Sped up how a farm's plant data loads when entering a lot. Planters loaded strictly one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-c78db37f384b</guid>
      <pubDate>Thu, 16 Jul 2026 11:16:34 -0500</pubDate>
      <description><![CDATA[Sped up how a farm's plant data loads when entering a lot. Planters loaded strictly one server request at a time with a full rescan of the pending list between each; four requests now run at once, nearest planters first, and a request whose answer never arrives is retried after 30 seconds instead of stopping all plant loading until a client restart.]]></description>
    </item>
    <item>
      <title>Agriculture: Stopped very large lots from tearing the whole lot down and rebuilding it (teleporting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-a54b5cb9a713</guid>
      <pubDate>Thu, 16 Jul 2026 11:16:35 -0500</pubDate>
      <description><![CDATA[Stopped very large lots from tearing the whole lot down and rebuilding it (teleporting the owner to the front of the plot in the process) when a routine lot update arrived while the lot was still working through its own backlog. The rebuild only happens now when something actually changed that requires it.]]></description>
    </item>
    <item>
      <title>Agriculture: Cut the constant background cost of large farms: the periodic plant growth refresh now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-f70e9b3d32fd</guid>
      <pubDate>Thu, 16 Jul 2026 11:16:36 -0500</pubDate>
      <description><![CDATA[Cut the constant background cost of large farms: the periodic plant growth refresh now only runs for planters near the player instead of every planter on the lot, and 20 new automated tests cover the new farm logic.]]></description>
    </item>
    <item>
      <title>Client cleanup: Removed the abandoned GPU occlusion culling plugin from the client. Its user-facing video…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-e29d13d920ab</guid>
      <pubDate>Thu, 16 Jul 2026 08:53:31 -0500</pubDate>
      <description><![CDATA[Removed the abandoned GPU occlusion culling plugin from the client. Its user-facing video option was already gone, but the plugin component still rode the main game camera with no remaining off switch, and the native library it depends on did not survive the source migration, so it could never work again.]]></description>
    </item>
    <item>
      <title>Client cleanup: Stripped the 1,736,551 leftover culling marker components the plugin's editor bake had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-4e1d62804e2e</guid>
      <pubDate>Thu, 16 Jul 2026 08:53:32 -0500</pubDate>
      <description><![CDATA[Stripped the 1,736,551 leftover culling marker components the plugin's editor bake had attached to nearly every visible object over the years, across 326 scenes and 134 prefabs. The removal was scripted outside the editor, each result was verified byte for byte against a reconstruction from the original file, and the biggest affected scenes were loaded in the editor afterward to confirm they come up clean.]]></description>
    </item>
    <item>
      <title>Client cleanup: Retired the plugin's editor bake menu and its last code references. The game's normal…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-d72c7f463787</guid>
      <pubDate>Thu, 16 Jul 2026 08:53:33 -0500</pubDate>
      <description><![CDATA[Retired the plugin's editor bake menu and its last code references. The game's normal distance culling and built-in occlusion culling are unchanged.]]></description>
    </item>
    <item>
      <title>Vendor listings window: Fixed the Vendor Listings in Zone window not resizing horizontally (reports #518 and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-659a8f998174</guid>
      <pubDate>Thu, 16 Jul 2026 05:46:22 -0500</pubDate>
      <description><![CDATA[Fixed the Vendor Listings in Zone window not resizing horizontally (reports #518 and #467). The window only had top and bottom resize grips; it now has all eight edges and corners, and widening it gives the extra room to the Item Name column. The default width went from 810 to 1090 pixels so every column fits without one being cut off.]]></description>
    </item>
    <item>
      <title>Vendor listings window: Fixed the scroll bar being hidden behind the item rows (reports #465 and #367). Two…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-1bea2903a303</guid>
      <pubDate>Thu, 16 Jul 2026 05:46:23 -0500</pubDate>
      <description><![CDATA[Fixed the scroll bar being hidden behind the item rows (reports #465 and #367). Two columns added for the vendor search earlier this month made the rows wider than the window, and the rows drew over the scroll bar; the list area now ends before the scroll bar and the window is wide enough for all its columns. A new automated test fails the build if a future column addition outgrows the window again.]]></description>
    </item>
    <item>
      <title>Vendor listings window: Fixed prices over 2,000,000 gold rendering tiny and misaligned (report #466). The Price…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-a4033254882c</guid>
      <pubDate>Thu, 16 Jul 2026 05:46:24 -0500</pubDate>
      <description><![CDATA[Fixed prices over 2,000,000 gold rendering tiny and misaligned (report #466). The Price and Per Unit columns were too narrow for eight-digit numbers, so the text was being shrunk to fit; both columns are wider and 99,999,999 now shows at full size.]]></description>
    </item>
    <item>
      <title>Vendor listings window: Fixed the frame-rate drop while the window was open (report #472) and the freeze while…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-13434e95d14a</guid>
      <pubDate>Thu, 16 Jul 2026 05:46:25 -0500</pubDate>
      <description><![CDATA[Fixed the frame-rate drop while the window was open (report #472) and the freeze while scrolling (report #367). The item tooltip under the cursor was being rebuilt from scratch every frame, and each search result the cursor passed over triggered a re-sort of the entire list of up to 15,000 items. The tooltip is now built once and reused, a hovered result updates only its own row, and a failed detail lookup waits 30 seconds before retrying. Verified in a live session: a thousand tooltip polls now cost nothing measurable.]]></description>
    </item>
    <item>
      <title>Nearby Players window: Fixed the Nearby Players window showing a player's old PvP status for minutes after it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-968f0d22128f</guid>
      <pubDate>Thu, 16 Jul 2026 06:34:47 -0500</pubDate>
      <description><![CDATA[Fixed the Nearby Players window showing a player's old PvP status for minutes after it changed (report #655). When someone flagged or unflagged for PvP at the Oracle, everyone else's list kept the stale name color and the anonymous "?" entry until an unrelated refresh happened to rebuild it. The list now updates the row the moment the change arrives, in both directions. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Lightning Storm dealing no damage with other players in the scene (report #561)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-d45c3d098389</guid>
      <pubDate>Thu, 16 Jul 2026 16:29:13 -0500</pubDate>
      <description><![CDATA[Fixed <b>Lightning Storm</b> dealing no damage with other players in the scene (report #561). Ground-effect spells apply their damage on the computer that controls the victim, but the damage code also required the attacker to be on that same computer, so with two or more players present no one ever applied it. The same flaw affected every player-cast ground effect (Ring of Fire, Meteor Shower, Ice Field) and monster ground attacks against players. Damage from a ground effect now applies on the victim's side as intended. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Lightning Storm playing no sound (report #561). The engine upgrade broke sound on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-ac214b14e8c5</guid>
      <pubDate>Thu, 16 Jul 2026 16:29:14 -0500</pubDate>
      <description><![CDATA[Fixed <b>Lightning Storm</b> playing no sound (report #561). The engine upgrade broke sound on pooled effect copies: copies made by the new background spawning arrive with their sound clip reference missing, which silenced any effect whose audio sits on a plain sound source, and a reused effect never restarted its sound. Pool copies now get their clips restored from the original, and looping effect audio restarts on every use. Verified in a play session: the storm's 13-second rumble plays on the first cast and on recasts, and storm strikes on a hostile target take real health off. Two new automated tests keep the clip repair honest.]]></description>
    </item>
    <item>
      <title>Combat: Filed a follow-up on a related find (report #731): a ground effect's secondary effects…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-adb774daa84f</guid>
      <pubDate>Thu, 16 Jul 2026 16:29:15 -0500</pubDate>
      <description><![CDATA[Filed a follow-up on a related find (report #731): a ground effect's secondary effects never roll their own trigger chance and instead ride the main damage roll. Fixing that changes balance across 36 skills, so it gets its own reviewed pass.]]></description>
    </item>
    <item>
      <title>Combat: Fixed the Dash skill making no sound when used (player report #679). Dash was the one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-5e77cb11f417</guid>
      <pubDate>Thu, 16 Jul 2026 03:40:18 -0500</pubDate>
      <description><![CDATA[Fixed the Dash skill making no sound when used (player report #679). Dash was the one combat skill whose activation effect carried no audio setup; it now plays a whoosh through the same sound path every other skill uses. Verified in a play session by casting Dash and confirming the sound fires.]]></description>
    </item>
    <item>
      <title>Combat: Damage-over-time effects that deal 0 damage per tick no longer print a 0 over the target…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-8b78748b7962</guid>
      <pubDate>Thu, 16 Jul 2026 15:48:04 -0500</pubDate>
      <description><![CDATA[Damage-over-time effects that deal 0 damage per tick no longer print a 0 over the target on every tick. The first zero tick shows the standard Immune combat text once, and later zero ticks show nothing, in both the floating text and the combat log. This also stops poison effects on immune creatures such as elementals and undead from repeating Immune on every tick. Ticks that deal real damage are unchanged. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Riposte almost never dealing its tripled damage after a successful parry, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-28881c8f11d8</guid>
      <pubDate>Thu, 16 Jul 2026 16:27:23 -0500</pubDate>
      <description><![CDATA[Fixed Riposte almost never dealing its tripled damage after a successful parry, and Opportunity Strike its bonus hit after a dodge. The game recorded parries and dodges under narrow conditions that depended on who else was in the scene, so the follow-up skill usually found no recent parry or dodge to reward. The reaction is now recorded the moment the Parried or Dodged text appears over your character, for every player in the scene. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Combat: Fixed Fortify Defenses' bonus after being critically hit the same way; it shared the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-7a70ca8c16a9</guid>
      <pubDate>Thu, 16 Jul 2026 16:27:24 -0500</pubDate>
      <description><![CDATA[Fixed Fortify Defenses' bonus after being critically hit the same way; it shared the recording gap. Combined results such as a parried critical hit now also count for both reactions instead of neither.]]></description>
    </item>
    <item>
      <title>Combat: Aligned Riposte's two damage windows in the skill data. Casting 3 to 5 seconds after a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-61149356eb86</guid>
      <pubDate>Thu, 16 Jul 2026 16:27:25 -0500</pubDate>
      <description><![CDATA[Aligned Riposte's two damage windows in the skill data. Casting 3 to 5 seconds after a parry dealt the normal hit and the tripled hit together, about 3.75x in total; the tripled hit now applies alone for a full 5 seconds after the parry (longer with Blades Mastery), and later casts deal the reduced hit as designed.]]></description>
    </item>
    <item>
      <title>Combat: Added automated tests covering the parry, dodge, block, and critical-hit reaction…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-c3593433f654</guid>
      <pubDate>Thu, 16 Jul 2026 16:40:11 -0500</pubDate>
      <description><![CDATA[Added automated tests covering the parry, dodge, block, and critical-hit reaction recording and the Riposte window data. All 19 pass in the editor; a test-runner filter pitfall that initially hid the new tests is documented in the team docs.]]></description>
    </item>
    <item>
      <title>Mounts: Fixed jump-height buffs such as the Ring of Frogkin also boosting a mount's jump while…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-b891798bdd5b</guid>
      <pubDate>Thu, 16 Jul 2026 12:54:20 -0500</pubDate>
      <description><![CDATA[Fixed jump-height buffs such as the Ring of Frogkin also boosting a mount's jump while riding (report #551). A mount now always jumps at its own fixed strength, equal to an unbuffed player's jump; buffs still work on foot as before. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Mounts: Raised the mount jump height by about half a meter. With buffs no longer topping it up…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-747f4d38aab4</guid>
      <pubDate>Fri, 17 Jul 2026 15:57:12 -0500</pubDate>
      <description><![CDATA[Raised the mount jump height by about half a meter. With buffs no longer topping it up, the base mount jump was reading a touch low, so it now clears a bit more. On-foot jumping is unchanged. Rides the next chaos build; tester task #776.]]></description>
    </item>
    <item>
      <title>Launcher: Diagnosed the black ground in Mistrendur (report #565): it only happens when the Windows…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-644da9fad05e</guid>
      <pubDate>Thu, 16 Jul 2026 15:12:06 -0500</pubDate>
      <description><![CDATA[Diagnosed the black ground in Mistrendur (report #565): it only happens when the Windows client runs on Linux through WINE with DirectX 12, where WINE's translation layer misrenders the terrain's near-ground pass. Ground within roughly 1000 meters turns black while distant terrain, water, and buildings stay normal. Native Windows DirectX 12, the default for all Windows players since early July, is unaffected. Posted the diagnosis and two immediate workarounds (DirectX 11 in the launcher, or the native Linux client) on the report.]]></description>
    </item>
    <item>
      <title>Launcher: Changed the launcher to default WINE and Proton installs to DirectX 11. Detection reads a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-c17b61f3808a</guid>
      <pubDate>Thu, 16 Jul 2026 15:12:07 -0500</pubDate>
      <description><![CDATA[Changed the launcher to default WINE and Proton installs to DirectX 11. Detection reads a WINE marker in the system libraries; a player who picks an API in the Graphics dropdown themselves keeps that choice, including DirectX 12 under WINE. Existing settings files from before the change count as "not chosen" and pick up the safer default. 15 new automated tests cover the selection logic. The change ships with the next launcher release.]]></description>
    </item>
    <item>
      <title>Launcher: Added a launch-argument passthrough and a screen-capture diagnostic to the automated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-d890e864e2bf</guid>
      <pubDate>Thu, 16 Jul 2026 15:12:08 -0500</pubDate>
      <description><![CDATA[Added a launch-argument passthrough and a screen-capture diagnostic to the automated client test runner, used here to drive DirectX 12 and DirectX 11 test clients side by side.]]></description>
    </item>
    <item>
      <title>Issue tracker: Fixed the Previous/Next links on tracker issue pages disappearing when an issue was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-451c1a08dc97</guid>
      <pubDate>Thu, 16 Jul 2026 03:32:43 -0500</pubDate>
      <description><![CDATA[Fixed the Previous/Next links on tracker issue pages disappearing when an issue was opened from a direct link, a notification, or after viewing a list the issue was filtered out of (a closed issue after browsing open ones). A small tracker extension now falls back to the neighboring issues in the same project whenever no list context exists; navigation from a list keeps its order and the "N of M" position as before. Deployed and verified on the live tracker.]]></description>
    </item>
    <item>
      <title>Issue tracker: Closed bug #669 (using a glyph while missing a required component gave an error instead…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-cfdda0c39146</guid>
      <pubDate>Thu, 16 Jul 2026 03:49:29 -0500</pubDate>
      <description><![CDATA[Closed bug #669 (using a glyph while missing a required component gave an error instead of a message). The fix landed two days ago but the issue was left open with only a comment, so the workflow docs now require finished tracker work to be closed with a proper resolution note in the same session.]]></description>
    </item>
    <item>
      <title>Scene maps: Audited the in-game area map system end to end: how map images and their world-alignment…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-336e1d4bdd95</guid>
      <pubDate>Thu, 16 Jul 2026 03:01:15 -0500</pubDate>
      <description><![CDATA[Audited the in-game area map system end to end: how map images and their world-alignment data are stored, how maps were historically captured and calibrated by hand, and which scenes have one. Of 445 scenes, about 234 have real maps, 79 dungeons and interiors deliberately show a "map missing" card, and 33 scenes that should have maps have none. Findings written up in the team docs.]]></description>
    </item>
    <item>
      <title>Scene maps: Planned the follow-on project and added it to the roadmap and the public roadmap page: an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-2336297bf813</guid>
      <pubDate>Thu, 16 Jul 2026 03:01:16 -0500</pubDate>
      <description><![CDATA[Planned the follow-on project and added it to the roadmap and the public roadmap page: an automated capture pipeline for the missing surface maps, real schematic maps for dungeons, and fog of war on dungeon maps with explored areas saved per account on the server.]]></description>
    </item>
    <item>
      <title>Scene maps: Built the fog of war system end to end. Server: exploration is stored per account in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-a74e89434f2b</guid>
      <pubDate>Thu, 16 Jul 2026 03:35:48 -0500</pubDate>
      <description><![CDATA[Built the fog of war system end to end. Server: exploration is stored per account in the game database, and updates from two characters online at once merge without losing either one's progress. Client: a background tracker reveals the map around the player as they move (30 meter radius by default, tunable per map), the map window darkens unexplored areas with soft edges, and map pins stay hidden until their spot is revealed. It activates only on maps that carry a new per-map flag, so nothing changes anywhere until dungeon maps are flagged; 14 automated tests cover the grid and reveal math, and both server builds and the client compile clean.]]></description>
    </item>
    <item>
      <title>Scene maps: Built the batch map capture tool: it opens a scene in the editor, frames it top down…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-de0f4810593a</guid>
      <pubDate>Thu, 16 Jul 2026 03:35:49 -0500</pubDate>
      <description><![CDATA[Built the batch map capture tool: it opens a scene in the editor, frames it top down automatically, renders the map image, and computes the world alignment exactly instead of the old hand-tuned calibration. Dungeons get a schematic drawing style with per-floor slicing. Every generated map goes onto a review contact sheet and only ships after human approval; pilot captures on a handful of scenes are the next step.]]></description>
    </item>
    <item>
      <title>Scene maps: Ran the pilot captures and fixed what they exposed: broken tree billboards drew magenta…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-81014efaefa3</guid>
      <pubDate>Thu, 16 Jul 2026 05:08:56 -0500</pubDate>
      <description><![CDATA[Ran the pilot captures and fixed what they exposed: broken tree billboards drew magenta forests over one scene, the camera rig's depth of field defocused another from 500 meters up, and distant terrain rendered as a blurry composite. All three are now suppressed for the captured frame and restored afterward. The hand-made Brittany Sewers map's alignment numbers agree with the pipeline's computed formula to about a meter and a half, which confirms the calibration convention.]]></description>
    </item>
    <item>
      <title>Scene maps: Shipped the first fleet run: 25 new scene maps accepted after image review, covering…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-fd930ff303d3</guid>
      <pubDate>Thu, 16 Jul 2026 05:08:57 -0500</pubDate>
      <description><![CDATA[Shipped the first fleet run: 25 new scene maps accepted after image review, covering every missing Novia surface scene plus Graff Island, the Oracle Temple, and the Manor of Mystery. Four Mistrendur interiors turned out to be mislisted as surface scenes and move to the dungeon workstream; fully automatic dungeon floor plans proved unworkable for scenes built from large floor plates, so dungeon maps will go one at a time with per-scene setup and review.]]></description>
    </item>
    <item>
      <title>Scene maps: Exercised fog of war against a real local server and caught a wire bug none of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-a26cbeadf3a3</guid>
      <pubDate>Thu, 16 Jul 2026 05:08:58 -0500</pubDate>
      <description><![CDATA[Exercised fog of war against a real local server and caught a wire bug none of the automated tests could: the response message could not carry a scene identifier over the network layer. Responses now correlate by transaction number, the standard pattern elsewhere in the protocol. The reveal tracking itself was watched working in a live session (cells revealing around the character as it moved); the fix compiles clean on the server, the new network stack, and the client.]]></description>
    </item>
    <item>
      <title>NPC audio: Fixed the per-NPC mute option not fully silencing creatures (tester report #691). Muting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-a9e9e39567fb</guid>
      <pubDate>Thu, 16 Jul 2026 03:00:17 -0500</pubDate>
      <description><![CDATA[Fixed the per-NPC mute option not fully silencing creatures (tester report #691). Muting suppressed ambient barks but death lines and all voice-over audio still played; both now respect the mute, and the older ambient-barker path used by some NPCs honors it too. Conversation text is untouched so muted merchants and quest givers still work.]]></description>
    </item>
    <item>
      <title>NPC audio: Verified the fix end to end in a play session against the skeleton camp in Ulfheim from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-579068d0a923</guid>
      <pubDate>Thu, 16 Jul 2026 03:00:18 -0500</pubDate>
      <description><![CDATA[Verified the fix end to end in a play session against the skeleton camp in Ulfheim from the report, and added automated tests covering the mute list storage.]]></description>
    </item>
    <item>
      <title>NPC audio: Recast every kobold speaker to rough, growly voices (player report #682). All 58 kobold…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-780b2ec5deb9</guid>
      <pubDate>Thu, 16 Jul 2026 08:38:29 -0500</pubDate>
      <description><![CDATA[Recast every kobold speaker to rough, growly voices (player report #682). All 58 kobold conversation roles, from The Breach war parties to the Grusk city merchants, were on ordinary human voices, several with distinctly human accents; they now draw from a pool of twelve hoarse and gravelly character voices, with the Kobold Fighter on a goblin voice.]]></description>
    </item>
    <item>
      <title>NPC audio: Fixed kobold war cries being read letter by letter (player report #682). Written…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-781277bbc129</guid>
      <pubDate>Thu, 16 Jul 2026 08:38:30 -0500</pubDate>
      <description><![CDATA[Fixed kobold war cries being read letter by letter (player report #682). Written screeches like "SKRRR'K!" and "YRKSRKK!" look like acronyms to the voice synthesizer, so it spelled them out. A pronunciation layer now converts all 80 spellings of these screeches to spoken forms like "skreek" before synthesis, while the on-screen text stays exactly as written. Automaton serial names that should be spelled out are unaffected, guarded by automated tests.]]></description>
    </item>
    <item>
      <title>NPC audio: Regenerated 2,180 kobold voice lines and published them to the voice server; the change…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-48a09e568668</guid>
      <pubDate>Thu, 16 Jul 2026 08:38:31 -0500</pubDate>
      <description><![CDATA[Regenerated 2,180 kobold voice lines and published them to the voice server; the change is data only and reaches players at their next login, no game build needed. City kobolds that share a voice role with human townsfolk elsewhere keep their voice but had their screech lines re-recorded with the new pronunciations.]]></description>
    </item>
    <item>
      <title>Server: Fixed a scene-server error line that fired when an empty scene's delayed shutdown timer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-fc1c73941d8e</guid>
      <pubDate>Thu, 16 Jul 2026 03:55:40 -0500</pubDate>
      <description><![CDATA[Fixed a scene-server error line that fired when an empty scene's delayed shutdown timer came due while the previous batch was still being processed (tracker #673, seen once on the test shard). The condition was harmless and already handled by a retry; the reschedule now also picks the earliest pending shutdown instead of a heuristic that could hold an empty scene open longer than intended.]]></description>
    </item>
    <item>
      <title>Server: Sped up the server operation that sweeps loot and crafting results into a player's bag…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-b91499c04078</guid>
      <pubDate>Thu, 16 Jul 2026 05:03:05 -0500</pubDate>
      <description><![CDATA[Sped up the server operation that sweeps loot and crafting results into a player's bag (tracker #670). The performance watchdog caught it taking 220 to 260 milliseconds on the test shard: it deleted each temporary loot container with two database calls, after first saving the container it was about to delete, and ran three crafting lookups on every call even when empty. The wasted save is gone, the deletions are one batched call, and the three lookups are one, cutting up to 35 serial round trips to 14. Covered by new automated tests, a full test-suite pass, and a bot run against a local server exercising loot, bags, and crafting.]]></description>
    </item>
    <item>
      <title>Server: Item audit logging no longer forces its own disk write for every single item moved. All…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-7cb180f5a51f</guid>
      <pubDate>Thu, 16 Jul 2026 05:03:06 -0500</pubDate>
      <description><![CDATA[Item audit logging no longer forces its own disk write for every single item moved. All game rooms share one audit log, and each entry used to flush to disk before the next room could log; entries now buffer and flush together within a quarter second, with every entry still recorded and order preserved.]]></description>
    </item>
    <item>
      <title>Zoning: Root-caused tracker #671 (join refused, player left waiting after zoning) from test-shard…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-e1ae88c37bd3</guid>
      <pubDate>Thu, 16 Jul 2026 04:05:41 -0500</pubDate>
      <description><![CDATA[Root-caused tracker #671 (join refused, player left waiting after zoning) from test-shard logs. A player zoning into a player-owned town was the last person keeping that instance alive; the empty instance's shutdown timer expired during their seven-second scene load and the instance closed one second before the join request arrived. The server's instance bookkeeping cleaned up correctly, and it happened once in 14 days of logs, so this is a timing race rather than a server bug.]]></description>
    </item>
    <item>
      <title>Zoning: The client now retries once when the destination instance closed while the scene was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-4f9995651f10</guid>
      <pubDate>Thu, 16 Jul 2026 04:05:42 -0500</pubDate>
      <description><![CDATA[The client now retries once when the destination instance closed while the scene was loading: it drops the stale instance id and re-runs matchmaking, joining another live instance or starting a fresh one, so the player arrives where they were headed. A second failure still falls back to yesterday's quick return to the overworld. Closed #671 and updated the tester verification task with the new expected behavior.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed the Unity licensing failure that hit essentially every automated build on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-84aa6076978e</guid>
      <pubDate>Thu, 16 Jul 2026 06:49:48 -0500</pubDate>
      <description><![CDATA[Fixed the Unity licensing failure that hit essentially every automated build on the Windows build agent (tracker #356). A stale licensing helper left behind by the Unity launcher spoke an older protocol than the editor, so each build's first launch failed and burned a retry, and one bad day could turn a good build red. Builds now clear the stale helper before launching, and the agent's launcher was updated to carry the same helper the editor uses. Two consecutive clean launches confirmed on the agent.]]></description>
    </item>
    <item>
      <title>Build pipeline: Updated the build-machine troubleshooting docs with the fix and its rollback steps; the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-eb04b462f3f6</guid>
      <pubDate>Thu, 16 Jul 2026 06:49:49 -0500</pubDate>
      <description><![CDATA[Updated the build-machine troubleshooting docs with the fix and its rollback steps; the old one-retry safety net stays in place as a backstop.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed the nightly automated test job that had reported failure on every run since it was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-f3ef7f03ec49</guid>
      <pubDate>Thu, 16 Jul 2026 07:53:50 -0500</pubDate>
      <description><![CDATA[Fixed the nightly automated test job that had reported failure on every run since it was created (tracker #718). Two problems stacked: the results reader never understood the test runner's report format, so even a fully passing night counted as failed and the report files were thrown away, and two build-system tests failed whenever the build machine's copy of the project was behind the latest changes. The results are now translated into a format the reader accepts, report files are kept on every run, and the two tests no longer depend on how current the build machine's checkout is.]]></description>
    </item>
    <item>
      <title>Build pipeline: All 616 automated tests pass after the fix; the two that had been failing were confirmed…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-60388404cdc8</guid>
      <pubDate>Thu, 16 Jul 2026 07:53:51 -0500</pubDate>
      <description><![CDATA[All 616 automated tests pass after the fix; the two that had been failing were confirmed green in the editor before shipping.]]></description>
    </item>
    <item>
      <title>Build pipeline: Moved the Mac build agent's data onto a large external drive after the laptop's internal…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-7ef1bf2e0d3d</guid>
      <pubDate>Thu, 16 Jul 2026 08:26:48 -0500</pubDate>
      <description><![CDATA[Moved the Mac build agent's data onto a large external drive after the laptop's internal disk ran out of room. Unity cannot build reliably from the drive's native format, so the build tree lives inside a disk image on the drive that the agent mounts automatically every time it connects. The agent is now addressed by machine name instead of a network address that had quietly changed and taken the agent offline. Verified end to end: a Mac client build came out green from the new location, and the agent reconnects and remounts the image on its own after a disconnect.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed an escaping bug in today's licensing change to the shared build pipeline script…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-382fa7b567b0</guid>
      <pubDate>Thu, 16 Jul 2026 08:26:49 -0500</pubDate>
      <description><![CDATA[Fixed an escaping bug in today's licensing change to the shared build pipeline script that made every client build job fail before it could start; two path strings needed their backslashes doubled. Also installed the faster archive packer on the Mac agent, which had missed it when build packaging switched over last week.]]></description>
    </item>
    <item>
      <title>Lighting and glow: Fixed the orange glass on player galleon lanterns rendering dark on chaos (report #661)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-7aec0aa84a27</guid>
      <pubDate>Thu, 16 Jul 2026 07:26:40 -0500</pubDate>
      <description><![CDATA[Fixed the orange glass on player galleon lanterns rendering dark on chaos (report #661). The Unity 6 content packing step keeps only the shader features used inside each content pack, and the shared shaders sit in one pack while the glowing materials that need them ship in others, so the glow feature was stripped and those surfaces rendered dark with no error anywhere. House window glow uses the same material family and was equally affected. The packing step now bundles the needed feature list alongside each shared shader; verified by rendering the current chaos content directly (the lantern glass comes out black) against the same layout rebuilt with the fix (the glass glows orange).]]></description>
    </item>
    <item>
      <title>Lighting and glow: Added an automated build test that packs a glowing material the same way the game ships…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-b3a1d01c4505</guid>
      <pubDate>Thu, 16 Jul 2026 07:26:41 -0500</pubDate>
      <description><![CDATA[Added an automated build test that packs a glowing material the same way the game ships it and fails if it renders dark, so this cannot regress silently. The open report of placed lamps giving almost no light (report #646) most likely shares this cause; a note was left on it to verify on the next build.]]></description>
    </item>
    <item>
      <title>Decorations: Investigated windows and doors on a default row lot not drawing while the player stood at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-c44e84913db8</guid>
      <pubDate>Thu, 16 Jul 2026 13:54:42 -0500</pubDate>
      <description><![CDATA[Investigated windows and doors on a default row lot not drawing while the player stood at the lot edge, leaving the doorway a dark hole (report #555, New Crafters Town). Same cause as the invisible attached decorations fixed yesterday: items attached to a house or another decoration had their visibility tracked at the wrong spot on the lot. The report predates that fix, which covers this case and rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Decorations: Closed the one remaining path with the same defect: a decoration rebuilt in place (for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-6923d03b854b</guid>
      <pubDate>Thu, 16 Jul 2026 13:54:43 -0500</pubDate>
      <description><![CDATA[Closed the one remaining path with the same defect: a decoration rebuilt in place (for example after a variant swap) was left at the wrong position with its visibility tracked there too. It now gets the same position and visibility correction as a normal placement.]]></description>
    </item>
    <item>
      <title>Decorations: Root-caused the washed-out white decorations on chaos (report #559): wooden clocks of all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-eaf6457640b5</guid>
      <pubDate>Thu, 16 Jul 2026 10:00:36 -0500</pubDate>
      <description><![CDATA[Root-caused the washed-out white decorations on chaos (report #559): wooden clocks of all kinds, mounted wyvern-head trophies, and porcelain vases lost their wood grain and color. These items get their look from a fine detail layer multiplied over a pale base texture, and the same content-packing problem behind the dark lantern glass stripped that detail feature from the shader the decorations share. Confirmed by rendering a grandfather clock from the current chaos content packs (whitewashed) next to the same clock loaded from source (correct wood tone); the lantern fix already carries the feature combinations these items need, so the repair arrives with the same build.]]></description>
    </item>
    <item>
      <title>Decorations: Added an automated test that packs the grandfather clock material into a miniature…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-313bc9fc433d</guid>
      <pubDate>Thu, 16 Jul 2026 10:00:37 -0500</pubDate>
      <description><![CDATA[Added an automated test that packs the grandfather clock material into a miniature two-pack layout the same way the game ships it and fails if its rendered color drifts from the source material, plus a check that the shared feature list keeps the exact combinations the clocks and trophies rely on. The tester checklist for the packing fix now includes clocks, trophies, and vases.]]></description>
    </item>
    <item>
      <title>Spell effects: Root-caused the spider web trap covering players as a solid white sheet instead of a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-1e10297c9ae5</guid>
      <pubDate>Thu, 16 Jul 2026 10:17:29 -0500</pubDate>
      <description><![CDATA[Root-caused the spider web trap covering players as a solid white sheet instead of a translucent web (report #651). The web texture keeps its pattern in the transparency channel, and the same content-packing problem behind the dark lantern glass stripped the transparency feature from the shader the web effect shares, so it rendered fully opaque. Confirmed by rendering the web material from the current chaos content packs (a solid grey slab) next to the same material loaded from source (a translucent web); the lantern repair already carries the transparency variants, so the fix arrives with the same build.]]></description>
    </item>
    <item>
      <title>Spell effects: Added an automated test that packs the web material into a miniature two-pack layout the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-d0a2e4d97f45</guid>
      <pubDate>Thu, 16 Jul 2026 10:17:30 -0500</pubDate>
      <description><![CDATA[Added an automated test that packs the web material into a miniature two-pack layout the same way the game ships it and fails if it stops rendering translucent. The tester checklist for the packing fix now includes getting webbed by a spider.]]></description>
    </item>
    <item>
      <title>Creatures: Root-caused crocodile-shaped enemies appearing pale grey, almost albino, in every scene…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-619e94fffe2d</guid>
      <pubDate>Thu, 16 Jul 2026 10:40:22 -0500</pubDate>
      <description><![CDATA[Root-caused crocodile-shaped enemies appearing pale grey, almost albino, in every scene (report #680). Crocodiles and caimans share one skin material, and the same content-packing problem behind the dark lantern glass stripped the feature that applies the skin's specular map, leaving a flat grey sheen washing out the hide. Confirmed by rendering the crocodile skin from the current chaos content packs next to the same material loaded from source: the packed copy matches a source copy with the feature switched off exactly. The lantern repair already carries the variants the skin needs, so the fix arrives with the same build.]]></description>
    </item>
    <item>
      <title>Creatures: Added an automated test that packs the crocodile skin into a miniature two-pack layout…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-d1f7d40128e9</guid>
      <pubDate>Thu, 16 Jul 2026 10:40:23 -0500</pubDate>
      <description><![CDATA[Added an automated test that packs the crocodile skin into a miniature two-pack layout the same way the game ships it (the skin actually travels in a decorations pack, pulled in by the caiman lawn decoration) and fails if its rendered color drifts from the source material. The tester checklist for the packing fix now includes crocodile colors, and the crocodile bug report is closed against it.]]></description>
    </item>
    <item>
      <title>Testing tools: Added launch options to the internal GM client that start it directly in a chosen scene…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-1ac40e3c5e00</guid>
      <pubDate>Thu, 16 Jul 2026 07:59:24 -0500</pubDate>
      <description><![CDATA[Added launch options to the internal GM client that start it directly in a chosen scene at exact coordinates, with an optional facing direction. Testing a fix at a specific spot no longer needs a manual login, a scene load command, and a walk to the location; the position is applied behind the loading screen on the way in. Ordinary scene changes and the retail client are unaffected.]]></description>
    </item>
    <item>
      <title>Testing tools: The automated client test runner can pass the same start position through, so scripted…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-af9599bbdaac</guid>
      <pubDate>Thu, 16 Jul 2026 07:59:25 -0500</pubDate>
      <description><![CDATA[The automated client test runner can pass the same start position through, so scripted client tests can begin at a precise location. Covered by 10 new automated tests on the argument parsing; usage written up in the team's testing docs.]]></description>
    </item>
    <item>
      <title>Testing tools: Recorded a test-runner quirk in the team docs: the editor's test tool can fail to find a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-e24e5e8ec38f</guid>
      <pubDate>Thu, 16 Jul 2026 08:03:08 -0500</pubDate>
      <description><![CDATA[Recorded a test-runner quirk in the team docs: the editor's test tool can fail to find a brand-new test class by name until the editor reloads, with the working fallbacks spelled out, after losing time to it today.]]></description>
    </item>
    <item>
      <title>Testing tools: Commits that change something testers can exercise now carry a reference to their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-2d3035d337e9</guid>
      <pubDate>Thu, 16 Jul 2026 15:16:56 -0500</pubDate>
      <description><![CDATA[Commits that change something testers can exercise now carry a reference to their verification task in the commit message, and a new pre-push check warns when a testable change is missing one. A feature spanning several commits needs only one task, and changes testers cannot reach can opt out with a stated reason.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Audited yesterday's leftover local changes: two caravan teleporter prefabs, two butterfly…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-9eb9eaf379b4</guid>
      <pubDate>Thu, 16 Jul 2026 02:11:19 -0500</pubDate>
      <description><![CDATA[Audited yesterday's leftover local changes: two caravan teleporter prefabs, two butterfly and firefly effects, and the Episode 2 overworld scene had been re-saved by the editor with no intentional edits. The re-save had regenerated internal entity ids and dropped one teleporter's destination, so all five files were reverted to their committed state.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Updated the ignore rules for files the engine and Windows keep generating: metadata…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-062841962a57</guid>
      <pubDate>Thu, 16 Jul 2026 02:11:20 -0500</pubDate>
      <description><![CDATA[Updated the ignore rules for files the engine and Windows keep generating: metadata companions for debug-symbol and thumbnail-cache files that are themselves already ignored, plus root-level transfer archives.]]></description>
    </item>
    <item>
      <title>Dev machines: Reconciled the AI assistant's project notes between the Windows and Mac development…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-84dded412eec</guid>
      <pubDate>Thu, 16 Jul 2026 10:40:24 -0500</pubDate>
      <description><![CDATA[Reconciled the AI assistant's project notes between the Windows and Mac development machines in both directions. Five notes written on the Mac last week, covering the terrain texture churn fix, build speed findings, bug reporter category work, and the game table click fix, had never made it back to the primary set; they were merged in and the full set of 130 notes was then mirrored to the Mac.]]></description>
    </item>
    <item>
      <title>Dev machines: Added a one-step sync script for that mirror. It copies the notes and shared review…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-fbf0fbb23287</guid>
      <pubDate>Thu, 16 Jul 2026 10:42:00 -0500</pubDate>
      <description><![CDATA[Added a one-step sync script for that mirror. It copies the notes and shared review tooling to the Mac, keeps the Mac-only notes intact, and refuses to run when the Mac holds newer edits that have not been merged back first, so nothing gets overwritten again.]]></description>
    </item>
    <item>
      <title>Dev machines: Recovered a week of uncommitted work found on the Mac during the sweep: the in-game bug…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-07edc2a0dc21</guid>
      <pubDate>Thu, 16 Jul 2026 10:40:26 -0500</pubDate>
      <description><![CDATA[Recovered a week of uncommitted work found on the Mac during the sweep: the in-game bug reporter's category expansion from 13 to 20 areas (decorations, stability, graphics, audio, social, and localization among the additions) and the matching tracker category script existed only in that machine's working copy. All 68 automated tests pass and the change is now committed.]]></description>
    </item>
    <item>
      <title>Dev machines: Finished moving the Mac workstation's own setup into the repo: the checked-in assistant…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-be3d7906c6b7</guid>
      <pubDate>Thu, 16 Jul 2026 15:16:57 -0500</pubDate>
      <description><![CDATA[Finished moving the Mac workstation's own setup into the repo: the checked-in assistant tool configuration now matches the machine it runs on, the game-client control harness got a dependency lockfile so installs are reproducible, and its installed modules were added to the ignore rules after turning up as thousands of untracked files.]]></description>
    </item>
    <item>
      <title>Player dungeons: Fixed monsters standing inside sealed walls in player-built dungeons (report #641…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-e90bc1b15e90</guid>
      <pubDate>Thu, 16 Jul 2026 12:19:42 -0500</pubDate>
      <description><![CDATA[Fixed monsters standing inside sealed walls in player-built dungeons (report #641, confirmed by a tester with a screenshot of a fire elemental in a cave wall). Rooms with breakable walls carry creature paths baked straight through the wall so that breaking it opens a real shortcut; the runtime seal meant to block that path until the wall breaks targeted the navigation layout of the old fixed dungeons and never engaged in player dungeons, so creatures wandered into the sealed wall pocket and fought through the rock. The seal now finds the right room navigation in player dungeons, and the same repair covers door blockers and walkway links in every room of the dungeon kit.]]></description>
    </item>
    <item>
      <title>Player dungeons: Moved four monster spawn points that were authored inside solid props and produced…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-fd20c5ba3d08</guid>
      <pubDate>Thu, 16 Jul 2026 12:19:43 -0500</pubDate>
      <description><![CDATA[Moved four monster spawn points that were authored inside solid props and produced creatures stuck in scenery: two fire elementals inside rock piles in the ancient stone lava grotto, and two kobolds inside the throne and ruins of the rotunda encounter room.]]></description>
    </item>
    <item>
      <title>Player dungeons: Rebuilt the stale precomputed navigation data for the six grotto rooms; the ancient stone…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-214905090a35</guid>
      <pubDate>Thu, 16 Jul 2026 12:19:44 -0500</pubDate>
      <description><![CDATA[Rebuilt the stale precomputed navigation data for the six grotto rooms; the ancient stone lava grotto's data predated a geometry change and carried 105 navigation points floating over nothing, which also misplaced summoned pets.]]></description>
    </item>
    <item>
      <title>Player dungeons: Added an automated test that replays the game's spawn placement for all 16 spawn-capable…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-8337ea2767ea</guid>
      <pubDate>Thu, 16 Jul 2026 12:19:45 -0500</pubDate>
      <description><![CDATA[Added an automated test that replays the game's spawn placement for all 16 spawn-capable dungeon kit rooms (204 spawn points) and fails if any point sits inside geometry or over a hole, so misplaced spawners cannot ship again.]]></description>
    </item>
    <item>
      <title>World objects: Fixed chests and mimics locking up permanently with "This object (Chest) is in use by…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-d5df12922698</guid>
      <pubDate>Thu, 16 Jul 2026 12:34:23 -0500</pubDate>
      <description><![CDATA[Fixed chests and mimics locking up permanently with "This object (Chest) is in use by another player" while nobody else was around, or turning unclickable with a green cursor (report #643, reported on the forums as far back as legacy ticket 70703 and confirmed systemic by a moderator). Rapid clicking during the open animation could cut the interaction short partway through, and the busy flag the chest had already broadcast was never released, so it refused everyone, including the player who caused it, until they left the scene. Every way a chest interaction can end now releases the busy state.]]></description>
    </item>
    <item>
      <title>World objects: Added a safety net on top of the direct fix: if a chest still ends up stuck busy, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-ccc7b7709d5e</guid>
      <pubDate>Thu, 16 Jul 2026 12:34:24 -0500</pubDate>
      <description><![CDATA[Added a safety net on top of the direct fix: if a chest still ends up stuck busy, the game notices within about 20 seconds that no interaction is actually running and clears it. Another player genuinely using the chest is never affected.]]></description>
    </item>
    <item>
      <title>World objects: Double-clicking an object that is already mid-interaction is now ignored instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-5a762abff819</guid>
      <pubDate>Thu, 16 Jul 2026 12:34:25 -0500</pubDate>
      <description><![CDATA[Double-clicking an object that is already mid-interaction is now ignored instead of raising an internal error that could cut short other running game scripts. Both fixes ride the next chaos build.]]></description>
    </item>
    <item>
      <title>World objects: Fixed mimics needing 2 to 7 clicks before the creature appeared (report #733, reported on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-8cff2638038b</guid>
      <pubDate>Thu, 16 Jul 2026 14:39:46 -0500</pubDate>
      <description><![CDATA[Fixed mimics needing 2 to 7 clicks before the creature appeared (report #733, reported on the forums as legacy ticket 68979 and open since 2021). A click on a mimic only opened a 1 second spawn window and hoped the spawner's periodic check, which runs every 3.3 seconds, landed inside it; about 7 in 10 clicks missed and the trigger was thrown away with no error. The click is now latched until the spawner consumes it, so one interaction always wakes the creature.]]></description>
    </item>
    <item>
      <title>World objects: A click in the first moments after a mimic loads in was always lost while its network…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-5fbf1ab0a89c</guid>
      <pubDate>Thu, 16 Jul 2026 14:39:47 -0500</pubDate>
      <description><![CDATA[A click in the first moments after a mimic loads in was always lost while its network ownership was still being assigned; the game now waits for the assignment instead of discarding the click. The creature also pops out promptly after the click instead of up to 3 seconds later, and the same faster reaction applies to other click-triggered spawns such as creature traps. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Treasure maps: Fixed bloodstained treasure map ambushes wedging when their creatures ran off (report…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-b20ae07be6f6</guid>
      <pubDate>Thu, 16 Jul 2026 13:19:37 -0500</pubDate>
      <description><![CDATA[Fixed bloodstained treasure map ambushes wedging when their creatures ran off (report #640, reopened from legacy ticket 71793 with player reports back to 2023, reproduced 5 of 5 tries on Map #3 in Libris Ruins). Ambush skeletons could chase unrelated wildlife far from the dig site or flee onto unwalkable ground where nobody could kill them; the battle then never finished and the chest never appeared. A watchdog now returns a creature to its spawn point after 20 seconds away from the fight, and removes it if it runs off a second time, so the battle can always be finished. Creatures actually fighting a player or a player's pet are never pulled back.]]></description>
    </item>
    <item>
      <title>Treasure maps: The treasure chest now always appears. If an ambush is still unresolved when the 30…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-eb99d730da90</guid>
      <pubDate>Thu, 16 Jul 2026 13:19:38 -0500</pubDate>
      <description><![CDATA[The treasure chest now always appears. If an ambush is still unresolved when the 30 minute event timer runs out, the chest spawns at the dig site anyway; the map was consumed at dig time and the loot was already decided, so the old silent reset that gave nothing back is gone.]]></description>
    </item>
    <item>
      <title>Treasure maps: Ambush creatures no longer spawn stacked on one spot. Spawn points that settle onto the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-bb0bfb1334de</guid>
      <pubDate>Thu, 16 Jul 2026 13:19:39 -0500</pubDate>
      <description><![CDATA[Ambush creatures no longer spawn stacked on one spot. Spawn points that settle onto the same walkable position now spread out to separated nearby positions, computed identically for every player in the scene so respawns stay consistent.]]></description>
    </item>
    <item>
      <title>Treasure maps: Reproduced the runaway bug live while verifying the fix on a local server: two of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-2981e18045f5</guid>
      <pubDate>Thu, 16 Jul 2026 13:19:40 -0500</pubDate>
      <description><![CDATA[Reproduced the runaway bug live while verifying the fix on a local server: two of the three ambush skeletons left the dig site on their own within seconds of spawning, one chasing an aggressive plant across the ruins. Both were pulled back by the watchdog, the one that bolted again was removed, and the forced timeout produced a lootable chest at the dig site. 20 new automated tests cover the watchdog, spread, and completion logic; the full editor suite of 638 stays green.]]></description>
    </item>
    <item>
      <title>Treasure maps: The scene editor now warns when a wave battle lists the same wave twice in its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-9593373fb047</guid>
      <pubDate>Thu, 16 Jul 2026 13:19:41 -0500</pubDate>
      <description><![CDATA[The scene editor now warns when a wave battle lists the same wave twice in its configuration, which silently ignores the later entries; the Libris Ruins battle carries exactly that dead data.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-16</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-16-images</guid>
      <pubDate>Thu, 16 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/treasure-map-chest-libris.png" data-full="https://catnipgames.net/blog/images/treasure-map-chest-libris.png" alt="The treasure chest sitting in the grass at the Libris Ruins dig site, spawned by the new timeout fallback during verification, with the ruined library and an old cart behind it">
        <img src="https://catnipgames.net/blog/images/vendor-listings-window-fixed.png" data-full="https://catnipgames.net/blog/images/vendor-listings-window-fixed.png" alt="The repaired Vendor Listings in Zone window open in Soltown: all nine columns fit, the scroll bar is visible on the right, and 99,999,999 gold prices render at full size, sorted most expensive first">
        <img src="https://catnipgames.net/blog/images/vendor-listings-window-widened.png" data-full="https://catnipgames.net/blog/images/vendor-listings-window-widened.png" alt="The same vendor listings window after dragging its right edge 300 pixels wider: the Item Name column absorbs the extra width while the other columns and the scroll bar keep their places">
        <img src="https://catnipgames.net/blog/images/galleon-lantern-glass-dark-chaos-bundle.png" data-full="https://catnipgames.net/blog/images/galleon-lantern-glass-dark-chaos-bundle.png" alt="A galleon lantern rendered from the current chaos content packs: the whole lantern is a black silhouette because the glow feature was stripped from its shader">
        <img src="https://catnipgames.net/blog/images/galleon-lantern-glass-glowing-fixed.png" data-full="https://catnipgames.net/blog/images/galleon-lantern-glass-glowing-fixed.png" alt="The same galleon lantern rendered with the fixed packing: the glass panes glow orange and yellow through the black metal lattice">
        <img src="https://catnipgames.net/blog/images/deco-clock-bundle-white-ab.png" data-full="https://catnipgames.net/blog/images/deco-clock-bundle-white-ab.png" alt="A grandfather clock rendered from the current chaos content packs: the whole case is washed-out white because the wood-grain detail feature was stripped from its shader">
        <img src="https://catnipgames.net/blog/images/deco-clock-source-wood-ab.png" data-full="https://catnipgames.net/blog/images/deco-clock-source-wood-ab.png" alt="The same grandfather clock rendered from source assets: the case shows its correct warm wood grain, the look the packing fix restores">
        <img src="https://catnipgames.net/blog/images/spider-web-bundle-opaque-ab.png" data-full="https://catnipgames.net/blog/images/spider-web-bundle-opaque-ab.png" alt="The spider web trap material rendered from the current chaos content packs: an opaque grey sheet with the web pattern barely embossed, the white blanket players reported">
        <img src="https://catnipgames.net/blog/images/spider-web-source-translucent-ab.png" data-full="https://catnipgames.net/blog/images/spider-web-source-translucent-ab.png" alt="The same web material rendered from source assets: a translucent spider web with the background showing through, the look the packing fix restores">
        <img src="https://catnipgames.net/blog/images/lava-grotto-room-interior.png" data-full="https://catnipgames.net/blog/images/lava-grotto-room-interior.png" alt="Inside the Cave Stone Lava Grotto player dungeon room in the editor: the raised rocky ledge and tunnel where fire elementals used to wander into the sealed wall pocket and appear inside the rock">
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-15</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-headlines</guid>
      <pubDate>Wed, 15 Jul 2026 22:06:34 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Tester leaderboard credit is fixed.</b> Several testers reported that bugs they filed and tasks they verified never showed up on the tester hub leaderboard. Three separate causes: a certificate problem had stopped reporter names being recorded on in-game Oracle reports since July 10 (all 31 affected reports are now credited to their 9 reporters), verification credit only counted after the team closed a task (it now counts when the tester comments), and hand-typed reporter names with spaces or different casing matched nobody (matching is now forgiving). The board reflects all of it as of tonight.</li>
        <li><b>The launcher's crash reporter is live.</b> Windows launcher build 12 went out today: when a game session crashes, freezes, or gets killed, the launcher notices on its next start and sends that session's log plus a short hardware summary to the team automatically. Computer names and usernames never leave the machine, each crash reports once, and a launcher setting turns it off. Verified end to end against the live service, including a build-10 launcher updating itself to 12.</li>
        <li><b>Satyrs and imps animate again.</b> Testers found satyr enemies in Ruined Keep sliding around frozen, facing the wrong way, while the trolls beside them behaved normally. The engine migration had changed how the importer names a duplicated skeleton bone, which quietly invalidated a bone list saved with every satyr animation and stripped the body motion out of those clips at import. The animation data is repaired, the affected character models are corrected, and a sweep of all 1,637 creature models confirmed imps were broken the same way (now also fixed) and every other creature family is fine. Rides the next chaos build.</li>
        <li><b>Invisible decorations on chaos are fixed.</b> A tester found decorations in Wizards Rest that were present but invisible: an unseen gate blocked the road, and an invisible tanning station still let you craft on it. The cause was the new decoration distance culling registering items attached to another decoration (gates on fences, stations on pavers) at the wrong spot during town load, so the game hid them as if they were far away. They now register where they actually stand. The fix rides the next chaos build.</li>
        <li><b>Episode 2 is opening to everyone on the test server.</b> Until now only individually granted accounts could enter Episode 2 zones there, so most testers hit an access wall at the boundary. The test server can now grant Episode 2 access to every account at login, the switch is already set, and it takes effect with the next test build. Purchased Episode 2 access on the live servers is unaffected.</li>
        <li><b>Found why the chaos shard looked washed out.</b> A tester report about one faded black rug led to a shard-wide cause: the client's default graphics quality had regressed to the lowest preset during the engine migration, rendering every texture at half resolution with anisotropic filtering off, on every launch. The default is restored to Good, and an HDR display flag that washed out colors on HDR monitors is off again. Both fixes ride the next chaos build.</li>
        <li><b>Animal chatter is no longer spoken aloud.</b> The voice-over system read the cat's "mrrow" as "miss-ro" (tester report #664), and dogs, horses, and farm animals came out just as strange. Thirty noise-only talkers, including a few characters who are canonically mute, no longer have spoken audio. Their text lines are unchanged, and the fix reaches players on their next login with no patch needed.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Asset pipeline: Turned off crunch compression on 6,285 textures that no game build includes. The list…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-1f0e9623f8af</guid>
      <pubDate>Wed, 15 Jul 2026 05:41:01 -0500</pubDate>
      <description><![CDATA[Turned off crunch compression on 6,285 textures that no game build includes. The list came from a full build's output, which records every asset packed into the player and into all 605 content bundles; every crunched texture was checked against it, and the 22,657 that actually ship were left untouched. Crunch dominates texture import time, so large reimports get faster while player downloads stay the same.]]></description>
    </item>
    <item>
      <title>Asset pipeline: Added the audit as a re-runnable pair of scripts with a runbook in the docs: one extracts…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-6b5d02ad2af0</guid>
      <pubDate>Wed, 15 Jul 2026 05:48:22 -0500</pubDate>
      <description><![CDATA[Added the audit as a re-runnable pair of scripts with a runbook in the docs: one extracts the shipped-asset list from any full build log, the other flips crunch off on unused textures and reports exactly what it changed, with a dry-run mode and verification steps. The runbook also pins the scope: the change applies to the new build line only and stays out of the version-control system the live game still uses.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Built a re-runnable audit tool that indexes every asset reference across the project in a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-8266e646c639</guid>
      <pubDate>Wed, 15 Jul 2026 04:36:44 -0500</pubDate>
      <description><![CDATA[Built a re-runnable audit tool that indexes every asset reference across the project in a single pass, then grades all 111 third-party plugin and content folders as used, removable, or needs a human call. It cross-checks code and assembly references too, and the results plus the method are written up in the docs.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Removed 11 unused third-party folders and their metadata: two empty leftovers, four…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-4b548f7d4316</guid>
      <pubDate>Wed, 15 Jul 2026 05:11:42 -0500</pubDate>
      <description><![CDATA[Removed 11 unused third-party folders and their metadata: two empty leftovers, four unextracted installer archives and content packs, and five orphaned code or shader plugins. Every one had zero asset references in the project.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Documented the plugins the automatic scan flagged as unused but that are actually used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-d1b78f718416</guid>
      <pubDate>Wed, 15 Jul 2026 04:36:46 -0500</pubDate>
      <description><![CDATA[Documented the plugins the automatic scan flagged as unused but that are actually used through indirect paths (native libraries, components added at runtime, and code inside prebuilt libraries), so they are kept rather than removed.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Removed two more unused folders after review: a set of old level-building tool installers…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-105ff3626ed6</guid>
      <pubDate>Wed, 15 Jul 2026 04:53:19 -0500</pubDate>
      <description><![CDATA[Removed two more unused folders after review: a set of old level-building tool installers that are no longer needed now that the tool ships with the engine, and 1808 auto-generated terrain-layer files left over from the version upgrade, confirmed unreferenced by any terrain or scene first.]]></description>
    </item>
    <item>
      <title>Repo cleanup: Restored one folder the audit had removed. The heatmap rendering plugin showed no asset…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-4dfb142a1baa</guid>
      <pubDate>Wed, 15 Jul 2026 05:11:43 -0500</pubDate>
      <description><![CDATA[Restored one folder the audit had removed. The heatmap rendering plugin showed no asset references, but its editor tools use it directly in code, so removing it broke the editor build. Put the plugin back and confirmed the project compiles. A reminder to cross-check code references, not just asset references, before removing a plugin.]]></description>
    </item>
    <item>
      <title>Tester hub: Restored reporter credit on in-game Oracle bug reports. Since July 10 a certificate check…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-6795d30d9733</guid>
      <pubDate>Wed, 15 Jul 2026 18:20:41 -0500</pubDate>
      <description><![CDATA[Restored reporter credit on in-game Oracle bug reports. Since July 10 a certificate check on an internal lookup failed on every report, so bugs filed through the Oracle carried no reporter name and the leaderboard counted them for nobody. Fixed the certificate on both ends and added the failure mode to the ops docs.]]></description>
    </item>
    <item>
      <title>Tester hub: Backfilled the gap: matched the 31 reports filed during the outage back to their 9…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-4a8ad9b3a044</guid>
      <pubDate>Wed, 15 Jul 2026 18:20:42 -0500</pubDate>
      <description><![CDATA[Backfilled the gap: matched the 31 reports filed during the outage back to their 9 reporters using the service logs, so every bug filed through the Oracle since July 10 now credits the right tester.]]></description>
    </item>
    <item>
      <title>Tester hub: Leaderboard "Tests completed" is now "Tests verified": credit lands when a tester…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-4382d34f0f86</guid>
      <pubDate>Wed, 15 Jul 2026 18:20:43 -0500</pubDate>
      <description><![CDATA[Leaderboard "Tests completed" is now "Tests verified": credit lands when a tester comments on a verification task, not when the team later closes it. One tester had 16 verifications waiting on task closes; all of them count now.]]></description>
    </item>
    <item>
      <title>Tester hub: Reporter-name matching is more forgiving. A hand-typed "Reported by" value with spaces or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-9017a716ee82</guid>
      <pubDate>Wed, 15 Jul 2026 18:20:44 -0500</pubDate>
      <description><![CDATA[Reporter-name matching is more forgiving. A hand-typed "Reported by" value with spaces or different casing now still credits the right tester, and when the name matches nobody the credit falls back to the report's author. Also added a tester who was filing bugs but missing from the leaderboard roster; their reports now count.]]></description>
    </item>
    <item>
      <title>Community: Re-read the week's new forum activity across the workblog discussion thread, the wishlist…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-5bfeee94b9eb</guid>
      <pubDate>Wed, 15 Jul 2026 17:09:48 -0500</pubDate>
      <description><![CDATA[Re-read the week's new forum activity across the workblog discussion thread, the wishlist board, the feedback board, and all fifteen bug-report boards, checking everything against the entries already on file from last week's full sweep.]]></description>
    </item>
    <item>
      <title>Community: Filed 8 new player suggestions on the tracker: light armor parity with heavy, longer buff…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-95d67299dfd1</guid>
      <pubDate>Wed, 15 Jul 2026 17:09:49 -0500</pubDate>
      <description><![CDATA[Filed 8 new player suggestions on the tracker: light armor parity with heavy, longer buff durations, a cooking and naming flavor bundle, zone and date stamps with a collector credit on PvP skulls, roaming overland world bosses, tamer multi-pet groups, tamer credit on filled taming necklaces, and crafting straight from the bank.]]></description>
    </item>
    <item>
      <title>Community: Filed one bug: several buff potions (Shadow Form, Cat's Grace, Stalking Cat) refuse to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-e2bd7a6b8a5b</guid>
      <pubDate>Wed, 15 Jul 2026 17:09:50 -0500</pubDate>
      <description><![CDATA[Filed one bug: several buff potions (Shadow Form, Cat's Grace, Stalking Cat) refuse to slot onto the combat bar, a question the forum moderators had explicitly left open. Bug threads the Bug Brigade had already logged were left with them, with cross-reference notes where they overlapped our entries.]]></description>
    </item>
    <item>
      <title>Community: The forum sweep now runs automatically every night: new suggestions and untriaged bug…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-f3fda0959430</guid>
      <pubDate>Wed, 15 Jul 2026 17:25:17 -0500</pubDate>
      <description><![CDATA[The forum sweep now runs automatically every night: new suggestions and untriaged bug reports get checked against the tracker and filed with source links, quiet nights change nothing, and duplicates are prevented by exact source-thread matching.]]></description>
    </item>
    <item>
      <title>Economy: Made all 39 player-event award trophies no-trade (wishlist request): the decoration…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-76340c96e3a0</guid>
      <pubDate>Wed, 15 Jul 2026 20:39:17 -0500</pubDate>
      <description><![CDATA[Made all 39 player-event award trophies no-trade (wishlist request): the decoration, fashion, fishing, lava fishing, pumpkin growing, and treasure hunt contest trophies plus the PvP trophies can no longer be traded, placed on player vendors, mailed, or sold to merchants, and their tooltips now show No Trade. The change also applies to trophies already in player hands. Mounted fish and taxidermy trophies are craftable goods and stay tradeable.]]></description>
    </item>
    <item>
      <title>Economy: Added an automated data check that fails if any current or future event trophy is left…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-cf26a2b85d53</guid>
      <pubDate>Wed, 15 Jul 2026 20:39:18 -0500</pubDate>
      <description><![CDATA[Added an automated data check that fails if any current or future event trophy is left tradeable.]]></description>
    </item>
    <item>
      <title>Editor tooling: Deleted the Perforce maintenance alert system that fired warning windows and a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-9f5e7d342cfb</guid>
      <pubDate>Wed, 15 Jul 2026 04:22:30 -0500</pubDate>
      <description><![CDATA[Deleted the Perforce maintenance alert system that fired warning windows and a click-through dialog on a fixed daily and weekly maintenance schedule. It ran automatically for anyone opening the project; nothing else depended on it, and the editor compiles clean without it.]]></description>
    </item>
    <item>
      <title>Editor tooling: Removed the rest of the editor's Perforce residue: the Perforce status and reconnect…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-48887b87e493</guid>
      <pubDate>Wed, 15 Jul 2026 05:03:41 -0500</pubDate>
      <description><![CDATA[Removed the rest of the editor's Perforce residue: the Perforce status and reconnect window (the whole Perforce Tools menu) and a leftover editor setting that still named Perforce as the version-control system, now matched to the setting the project actually uses.]]></description>
    </item>
    <item>
      <title>Logging: Stopped normal disconnects from being logged as errors. When a client cleanly closes its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-e48f45cb64af</guid>
      <pubDate>Wed, 15 Jul 2026 05:42:35 -0500</pubDate>
      <description><![CDATA[Stopped normal disconnects from being logged as errors. When a client cleanly closes its connection to a zone, that routine event was recorded at error level and dominated the server error logs. It is now logged as routine, so real errors stand out.]]></description>
    </item>
    <item>
      <title>Server: Added a per-shard server switch that grants Episode 2 access to every account at login…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-71d778820fd9</guid>
      <pubDate>Wed, 15 Jul 2026 20:44:49 -0500</pubDate>
      <description><![CDATA[Added a per-shard server switch that grants Episode 2 access to every account at login, and turned it on for the test server. Previously only individually granted accounts could enter Episode 2 zones there. The grant applies at each login, covers new accounts automatically, and is off everywhere else; live purchases are unaffected. Takes effect with the next test build. Verified end to end on a local server: a plain account logged in and came back carrying Episode 2 access.]]></description>
    </item>
    <item>
      <title>Networking: Faster recovery when you try to enter a game instance that just closed. The client used…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-437a66081f4b</guid>
      <pubDate>Wed, 15 Jul 2026 05:55:26 -0500</pubDate>
      <description><![CDATA[Faster recovery when you try to enter a game instance that just closed. The client used to show "The target instance is no longer open" and sit there for about 30 seconds, which felt like being stuck. It now shows the message briefly and returns you to the overworld within a few seconds, still logged in.]]></description>
    </item>
    <item>
      <title>Build farm: Fixed the nightly server report job re-running its full generation pass after a shutdown…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-4909c2238ac3</guid>
      <pubDate>Wed, 15 Jul 2026 17:33:31 -0500</pubDate>
      <description><![CDATA[Fixed the nightly server report job re-running its full generation pass after a shutdown crash. The generator writes a completion marker as its last step; the job now accepts any run that reached that marker regardless of how the process exited, treats the ever-present licensing log noise as a failure signal only when the run died in its first minutes, and gives a genuine mid-run crash one retry. Doubled nights ran 140 to 179 minutes against roughly 55 for a clean pass, and one of them still ended in a failure after paying for both passes.]]></description>
    </item>
    <item>
      <title>Build farm: Put the second build agent on the Linux build machine to work. It had been provisioned…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-af2d6b04259f</guid>
      <pubDate>Wed, 15 Jul 2026 17:33:32 -0500</pubDate>
      <description><![CDATA[Put the second build agent on the Linux build machine to work. It had been provisioned since June 30 with its own copy of the project but was never labeled for client builds, so it sat idle. It now takes the same Linux client build jobs as the first agent, and a build was verified end to end on it while another ran on the first agent at the same time.]]></description>
    </item>
    <item>
      <title>Build farm: Unblocked Linux IL2CPP client builds. The build failed at the final native link step…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-b9fa8b3308b0</guid>
      <pubDate>Wed, 15 Jul 2026 18:17:07 -0500</pubDate>
      <description><![CDATA[Unblocked Linux IL2CPP client builds. The build failed at the final native link step because the engine's downloaded linker depends on two system libraries the build machine's newer OS no longer ships. The old library versions are now staged alongside the system ones, the linker runs again, and the fix is baked into the machine setup script so a rebuilt box gets it automatically.]]></description>
    </item>
    <item>
      <title>UI: Baked a thin black outline into all 38 mouse cursors (wishlist #427). The white and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-9f213ad34be3</guid>
      <pubDate>Wed, 15 Jul 2026 20:42:02 -0500</pubDate>
      <description><![CDATA[Baked a thin black outline into all 38 mouse cursors (wishlist #427). The white and silver cursor art had no dark edge and disappeared against snow and other bright surfaces. Every cursor state carries the outline now: default, combat, interact, talk, gathering, and window-resize arrows. Click points are unchanged, and the cursors read the same on dark backgrounds as before.]]></description>
    </item>
    <item>
      <title>World: Fixed the bonfire island in Port Harmony's harbor popping into view on approach (tester…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-88211756071b</guid>
      <pubDate>Wed, 15 Jul 2026 17:51:17 -0500</pubDate>
      <description><![CDATA[Fixed the bonfire island in Port Harmony's harbor popping into view on approach (tester report #656, also present on live). The signal tower's brazier bowl and the island's rocks were set to stop drawing beyond 125 meters, which is closer than the town docks, so they appeared suddenly partway across the water. They now draw at the same range as the rest of the island.]]></description>
    </item>
    <item>
      <title>World: Fixed decorations turning invisible on the chaos server while still blocking movement and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-bbd322bfd25c</guid>
      <pubDate>Wed, 15 Jul 2026 20:37:34 -0500</pubDate>
      <description><![CDATA[Fixed decorations turning invisible on the chaos server while still blocking movement and accepting clicks (tester report #652, seen in Wizards Rest: an invisible gate, an invisible tanning station you could still craft on). Decorations attached to another decoration, such as gates on fences or stations on pavers, were registered with the new distance culling at the wrong spot when a town loaded, so the game hid them as if they were far away. They now register at their true location. Rides the next chaos build.]]></description>
    </item>
    <item>
      <title>Rendering: Fixed the washed-out textures on the chaos shard (tester report #653, a black rug that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-3cdc4d51bce1</guid>
      <pubDate>Wed, 15 Jul 2026 18:17:08 -0500</pubDate>
      <description><![CDATA[Fixed the washed-out textures on the chaos shard (tester report #653, a black rug that had lost its color; also #363, a blurry statue base). The client's default graphics quality had regressed to the lowest preset during the engine migration, which rendered every texture at half resolution and turned off anisotropic filtering, and the game never re-applies a saved quality level at startup, so every launch ran at that floor. The default is restored to Good. Floor textures viewed at a shallow angle were hit worst, which is why a rug was the first thing testers noticed.]]></description>
    </item>
    <item>
      <title>Rendering: Turned off the HDR display output flags that were enabled in the same settings pass. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-21f7fe1114b4</guid>
      <pubDate>Wed, 15 Jul 2026 18:17:09 -0500</pubDate>
      <description><![CDATA[Turned off the HDR display output flags that were enabled in the same settings pass. The client has no HDR-aware color handling, so on HDR monitors the whole game washed out toward gray. Reaches testers with the next chaos build.]]></description>
    </item>
    <item>
      <title>Voice-over: Removed spoken audio from 30 conversations whose lines are animal noises or mumbles: cats…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-33ca66e8a45e</guid>
      <pubDate>Wed, 15 Jul 2026 17:53:28 -0500</pubDate>
      <description><![CDATA[Removed spoken audio from 30 conversations whose lines are animal noises or mumbles: cats (including Saberhagen, whose lines are all meows despite the lore), dogs, horses and unicorns, farm and wild animals, the mimic, and a few canonically mute characters such as Stella and the silent pilgrims. Text-to-speech mangled these lines (tester report #664 heard the cat's "mrrow" as "miss-ro"). Text responses are unchanged, and the change is live for players at next login without a new build.]]></description>
    </item>
    <item>
      <title>Voice-over: Added a permanent do-not-voice list for marking any conversation as never spoken, plus an…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-6fb72ff59105</guid>
      <pubDate>Wed, 15 Jul 2026 17:53:29 -0500</pubDate>
      <description><![CDATA[Added a permanent do-not-voice list for marking any conversation as never spoken, plus an audit that scans every voiced character's lines and flags the ones that are mostly onomatopoeia. The audit needed human review on both sides: the chicken scored low because of inherited generic word lines but is still a chicken, while the talking reindeer and a cursed knight who speaks through a wolf genuinely converse and keep their voices.]]></description>
    </item>
    <item>
      <title>Voice-over: Fixed the male beggar in Castle Atos speaking with a female voice (tester report #562)…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-a745cb6389a6</guid>
      <pubDate>Wed, 15 Jul 2026 20:24:43 -0500</pubDate>
      <description><![CDATA[Fixed the male beggar in Castle Atos speaking with a female voice (tester report #562). His character data had the wrong gender recorded, so the voice system picked the female performance shared with the Port Harmony beggar. Corrected the data, generated the few missing male-voice lines, and audited every conversation in the game for the same mismatch; he was the only one. The male voice reaches players with the next chaos build.]]></description>
    </item>
    <item>
      <title>Creatures: Fixed satyr enemies in Ruined Keep sliding around with no animation and facing the wrong…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-e9831c305e6d</guid>
      <pubDate>Wed, 15 Jul 2026 22:05:31 -0500</pubDate>
      <description><![CDATA[Fixed satyr enemies in Ruined Keep sliding around with no animation and facing the wrong way (tester report #573). During the engine migration the importer began assigning a different name to a duplicated bone in the satyr skeleton. Each satyr animation carries a saved list of which bones it may animate, and that list still used the old name, so the importer silently dropped the motion for every body bone and left only the root moving: the creature glides in a frozen pose. Repaired the saved bone lists and the satyr animations import complete again, a run cycle going from 2 animated bones back to 84.]]></description>
    </item>
    <item>
      <title>Creatures: The same rename also broke the link between the repaired animations and the satyr…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-357fe0b40467</guid>
      <pubDate>Wed, 15 Jul 2026 22:05:32 -0500</pubDate>
      <description><![CDATA[The same rename also broke the link between the repaired animations and the satyr character models, which still carried the old bone name. Corrected the bone naming in all 38 affected creature models: every satyr variant including Krampus, Krang, and the underdweller satyrs, plus all imps, which turned out to be broken the same way with nobody having reported it. Each corrected model was verified to play its animations.]]></description>
    </item>
    <item>
      <title>Creatures: The repair pass also restored animation data lost to the same stale bone lists on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-205f4d6abca1</guid>
      <pubDate>Wed, 15 Jul 2026 22:05:33 -0500</pubDate>
      <description><![CDATA[The repair pass also restored animation data lost to the same stale bone lists on the skeletal and hell horses, a beggar, and a few older effect models.]]></description>
    </item>
    <item>
      <title>Creatures: Swept all 1,637 creature models in the game with an automated check that plays each one's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-b7c7893d3eeb</guid>
      <pubDate>Wed, 15 Jul 2026 22:05:34 -0500</pubDate>
      <description><![CDATA[Swept all 1,637 creature models in the game with an automated check that plays each one's animations and confirms its skeleton actually moves: satyrs and imps were the only broken families, and trolls and everything else bind their animations correctly.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-15</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-images</guid>
      <pubDate>Wed, 15 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/satyr-run-restored.png" data-full="https://catnipgames.net/blog/images/satyr-run-restored.png" alt="A horned satyr fighter mid-stride in its restored run animation, weapon slung across its back, rendered against a plain dark background">
        <img src="https://catnipgames.net/blog/images/quality-default-rug-fastest.png" data-full="https://catnipgames.net/blog/images/quality-default-rug-fastest.png" alt="The Huge Rectangle Rug (Black) rendered at the regressed Fastest quality default: the medallion and filigree pattern is smeared and washed out at half texture resolution">
        <img src="https://catnipgames.net/blog/images/quality-default-rug-good.png" data-full="https://catnipgames.net/blog/images/quality-default-rug-good.png" alt="The same rug rendered at the restored Good quality default: the weave and filigree detail resolves sharply at full texture resolution">
        <img src="https://catnipgames.net/blog/images/cursor-outline-before-after.png" data-full="https://catnipgames.net/blog/images/cursor-outline-before-after.png" alt="Four mouse cursors shown on a snow-white background, before on top and after on the bottom: the original silver cursors nearly disappear while the outlined versions stand out clearly">
      </div>]]></description>
    </item>
    <item>
      <title>Launcher: Windows launcher build 12 is live, the first carrying the automatic crash reporter from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-286906a0b23e</guid>
      <pubDate>Wed, 15 Jul 2026 17:12:38 -0500</pubDate>
      <description><![CDATA[Windows launcher build 12 is live, the first carrying the automatic crash reporter from last week: the launcher notices a session that crashed, froze, or was killed and sends that session's log plus a short hardware summary to the team on its next start. Numbered 12 because 11 went to the Linux launcher release. Verified a build-10 install updating itself to 12 and the full report path against the live service, including that the report never includes the computer name or username.]]></description>
    </item>
    <item>
      <title>Launcher: Standing up the report receiver surfaced a rate-limiting flaw in the team's report…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-15-e64830bc027d</guid>
      <pubDate>Wed, 15 Jul 2026 17:12:39 -0500</pubDate>
      <description><![CDATA[Standing up the report receiver surfaced a rate-limiting flaw in the team's report service: the web server in front of it hid every visitor's real address, so all per-visitor request limits shared a single bucket. Fixed and verified; the limits on the in-game Oracle helper now count per visitor as designed.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-14</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-headlines</guid>
      <pubDate>Tue, 14 Jul 2026 20:51:57 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Closed out the missing-terrain issue.</b> A batch of older terrain files, authored years ago, were being corrupted by an automatic text conversion in version control, so the rebuilt client could not read them and the ground dropped out of a few zones. The recovered files were re-checked in the editor: six of the seven now load with correct height data, and the seventh was a broken leftover demo file not used anywhere in the game, so it was removed. The last "could not load terrain" error from the build is gone.</li>
        <li><b>Creatures no longer move too fast on high-frame-rate machines.</b> Enemy movement was tied to how many frames per second the simulating machine ran, so on faster machines creatures such as skeletons and liches could move quicker than intended. Movement now uses real elapsed time, so creatures keep their designed speed regardless of frame rate. A sweep of the client found and fixed two related cases.</li>
        <li><b>Fixed a Vendor Listings search error on rapid searches.</b> Starting a new vendor search before the previous one finished, by re-submitting, flipping a toggle, or changing the category filter within about ten seconds, could leave the listings stuck. The latest search now takes over and runs right away.</li>
        <li><b>Leaderboards load again.</b> The in-game Leaderboards window was fetching over plain HTTP, which the rebuilt client blocked by default, so it showed no data. Cleartext fetches are permitted again for the legacy leaderboard and log-upload endpoints, and the standings come back.</li>
        <li><b>Player-owned-town owners can be rebuilt from the game database.</b> The list of who owns each town was hand-maintained and had drifted, so ownership reports could name the wrong player after a town changed hands. A new tool reconstructs current owners from the game data and folds them back into that list.</li>
        <li><b>Using a glyph or item you lack a component for now explains itself.</b> One failure case showed no message at all and silently did nothing. It now tells you a required component is missing.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Client migration: Verified the earlier terrain recovery holds: the seven terrain files flagged as…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-1fc8fefd1ad6</guid>
      <pubDate>Tue, 14 Jul 2026 05:48:00 -0500</pubDate>
      <description><![CDATA[Verified the earlier terrain recovery holds: the seven terrain files flagged as unreadable were re-loaded in the editor, and the six real ones (two live zones plus four development and vendor scratch terrains) all opened with valid height data. Deleted the seventh, a corrupt third-party sample terrain referenced only by that sample's own demo scenes and never part of a shipped zone, along with its leftover folder. Recorded the root cause and the recovery in the build-health notes.]]></description>
    </item>
    <item>
      <title>Gameplay: Fixed creature movement speed changing with frame rate. A safety cap on how far a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-aa0f67db6686</guid>
      <pubDate>Tue, 14 Jul 2026 06:31:03 -0500</pubDate>
      <description><![CDATA[Fixed creature movement speed changing with frame rate. A safety cap on how far a creature moves each frame was scaled by frame time, which slowed creatures on low-frame-rate hosts and let them run at full speed on fast ones, so the same creature could look faster on one machine than another. It now limits the per-frame step without lowering sustained speed, so creatures move at their intended speed everywhere. Added automated tests that confirm movement covers the same distance per second at 10 and 120 frames per second.]]></description>
    </item>
    <item>
      <title>Gameplay: Swept the client for the same frame-rate coupling and fixed two more cases. How often…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-0b8574d3707f</guid>
      <pubDate>Tue, 14 Jul 2026 06:31:04 -0500</pubDate>
      <description><![CDATA[Swept the client for the same frame-rate coupling and fixed two more cases. How often creatures re-check for nearby targets was tied to frame count, so faster machines re-checked more often; it now runs on a fixed one-second cadence. Mouse-look smoothing now behaves the same across frame rates.]]></description>
    </item>
    <item>
      <title>UI: Fixed an error in the Vendor Listings search when a new search started before the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-c2c49defa7cb</guid>
      <pubDate>Tue, 14 Jul 2026 06:40:18 -0500</pubDate>
      <description><![CDATA[Fixed an error in the Vendor Listings search when a new search started before the previous one finished. After a search, a ten-second refresh cooldown kept the old request active, so re-submitting, flipping the All Zones or Buy Orders toggle, or changing the category filter in that window could leave the listings stuck. A new search now supersedes the in-flight one and runs immediately. Found in server log triage; added a test covering the rapid re-entry case.]]></description>
    </item>
    <item>
      <title>UI: Fixed the in-game Leaderboards window showing no data. The rebuilt client blocks…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-d0a420e23e2d</guid>
      <pubDate>Tue, 14 Jul 2026 06:52:26 -0500</pubDate>
      <description><![CDATA[Fixed the in-game Leaderboards window showing no data. The rebuilt client blocks plain-HTTP requests by default, and the leaderboard data and crash-log endpoints are served over plain HTTP on legacy hosts with no HTTPS listener, so the fetch failed with an insecure-connection error. Re-enabled cleartext HTTP for the client so those endpoints work again. Found in server log triage.]]></description>
    </item>
    <item>
      <title>UI: Hid GM-only right-click menu options from non-GM accounts. Options like Summon Player…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-fa2576194fb4</guid>
      <pubDate>Tue, 14 Jul 2026 12:27:07 -0500</pubDate>
      <description><![CDATA[Hid GM-only right-click menu options from non-GM accounts. Options like Summon Player, Zone To Player, and GM-Ghost Mode were shown to everyone on the test build, including testers without GM access; they now require an Admin/Dev account. Normal menu options are unchanged.]]></description>
    </item>
    <item>
      <title>UI: Stopped empty "Server" lines from cluttering the chat window. A blank line reading just…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-94982aa9a233</guid>
      <pubDate>Tue, 14 Jul 2026 15:02:20 -0500</pubDate>
      <description><![CDATA[Stopped empty "Server" lines from cluttering the chat window. A blank line reading just "Server" was being added about once a second; empty server, admin, and daily messages are now dropped, while real ones with text still show.]]></description>
    </item>
    <item>
      <title>UI: Fixed the /datafolder chat command. It used a call that fails on newer builds and opened…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-5c110f6b648a</guid>
      <pubDate>Tue, 14 Jul 2026 15:48:24 -0500</pubDate>
      <description><![CDATA[Fixed the /datafolder chat command. It used a call that fails on newer builds and opened nothing; it now reliably opens the game's data folder in your file browser.]]></description>
    </item>
    <item>
      <title>UI: Fixed a doubled word in the vendor "Get Directions" confirmation ("marked on on your…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-1ecaa8cdd106</guid>
      <pubDate>Tue, 14 Jul 2026 20:50:57 -0500</pubDate>
      <description><![CDATA[Fixed a doubled word in the vendor "Get Directions" confirmation ("marked on on your compass").]]></description>
    </item>
    <item>
      <title>Stability: Fixed the game hanging on the "Please Wait" dialog when exiting. The exit sequence waited…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-a0bec757508c</guid>
      <pubDate>Tue, 14 Jul 2026 15:48:25 -0500</pubDate>
      <description><![CDATA[Fixed the game hanging on the "Please Wait" dialog when exiting. The exit sequence waited for a clean network disconnect with no time limit, so a slow disconnect could leave the dialog up forever and force a manual kill. It now waits briefly, then closes regardless.]]></description>
    </item>
    <item>
      <title>Gathering: Fixed the Meticulous Collection gathering prompt sometimes staying above the character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-ca2aacdf285b</guid>
      <pubDate>Tue, 14 Jul 2026 15:27:42 -0500</pubDate>
      <description><![CDATA[Fixed the Meticulous Collection gathering prompt sometimes staying above the character after a node finished. The prompt now always fades once gathering completes.]]></description>
    </item>
    <item>
      <title>Combat: Fixed a rune-use failure that showed no message. When an action failed because a required…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-c126a4ca971f</guid>
      <pubDate>Tue, 14 Jul 2026 07:57:56 -0500</pubDate>
      <description><![CDATA[Fixed a rune-use failure that showed no message. When an action failed because a required component was missing, the client had no text for that case, so it produced an internal error instead of a player message and the action appeared to do nothing. Added the message ("You do not have a component required to use this.") and a test that keeps every failure reason mapped to real text. Found in server log triage.]]></description>
    </item>
    <item>
      <title>Server: Hardened the character name search used by the GM and admin tools. The search text was…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-25809238e8a8</guid>
      <pubDate>Tue, 14 Jul 2026 08:47:11 -0500</pubDate>
      <description><![CDATA[Hardened the character name search used by the GM and admin tools. The search text was used to build a database pattern without escaping, so specially crafted input could make the server do excessive work. Search text is now treated as literal text and results are capped. Added a unit test. Part of the server input-validation audit.]]></description>
    </item>
    <item>
      <title>Server tooling: Addressed the deepest cause of stale town-ownership reports: the list mapping each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-13.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-14-7578f7d2e1e2</guid>
      <pubDate>Tue, 14 Jul 2026 07:27:33 -0500</pubDate>
      <description><![CDATA[Addressed the deepest cause of stale town-ownership reports: the list mapping each player-owned town to its owner was hand-maintained and frozen months ago, so once a town was created, renamed, or transferred the report named the wrong owner on every environment. Added a read-only tool that reconstructs the current owner of each town from the game data (via the town's master deed) and an editor step that folds those owners back into the list, updating only the owner names and flagging new towns for a designer to finish. Ships the first phase; a runbook and tests are included.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-11</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-headlines</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Bug tracker reorganized.</b> Reviewed all 230 tracker entries and re-filed 105 of them into seven new categories covering graphics, sound, stability, chat and mail, translations, decorations, and the in-game Oracle assistant itself. The Oracle's own reports now classify into twenty areas instead of thirteen, so crashes and disconnects no longer share a bucket with frame-rate problems.</li>
        <li><b>Fixed players showing online forever.</b> A player reported on the forum that friends and guild lists kept showing him online with his machine powered off, and it never cleared. The cause was found and fixed: the online list was kept up to date only by login and logout signals, so one lost logout stranded a player as online until a full restart. The servers now cross-check the list against real connections once a minute and correct it both ways. Reaches testers with the next test-shard build.</li>
        <li><b>The Linux client is live on the test shard.</b> Build 34 shipped to both Windows and Linux from a single source revision at the same build number: the server was rebuilt to match, both download channels went live, and a login test passed before the release was called done. Testers can now download a Linux launcher, and a link for it sits on the tester and developer pages beside the Windows one.</li>
        <li><b>Build releases can no longer split across platforms.</b> The two platform builds of a release used to each pick up "the latest code" independently, so a change landing between them could put them on different revisions. The release now locks one revision up front and builds every platform from it, and the deploy refuses any mismatched pair as a backstop.</li>
        <li><b>Faster test builds.</b> Measured where a two-hour build actually goes: about 50 minutes was spent compressing the finished 16 GB game package with settings meant for text, on data that is already compressed. The packaging step now uses a fast multi-core archiver, and a written plan covers the next target: making the 49-minute asset packaging step skip work that has not changed. That skip check now records a per-file fingerprint list each build and logs exactly which files triggered a rebuild, so the next build names the files that keep defeating it.</li>
        <li><b>Community suggestion sweep.</b> Read the workblog discussion thread, every wishlist request active since January 2025, the live-server feedback board, and all fifteen bug-report boards, then filed 70 new tracker entries: 53 player suggestions and 17 bugs and follow-ups. Everything was checked against the suggestions already on file so nothing got logged twice.</li>
        <li><b>Ended the terrain-texture file churn.</b> A long-running annoyance where 253 terrain texturing files could show up as locally modified after simply opening the editor was traced to a stored checksum that mixed in the editor version and build platform. The checksum now depends only on the actual texture formats, which are identical on every desktop platform, and an automated test locks the formula in place.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Bug tracker: Added seven categories to the bug tracker: graphics, audio, stability, social…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-93c4de512408</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Added seven categories to the bug tracker: graphics, audio, stability, social, localization, decorations, and oracle (reports about the in-game Oracle assistant itself). Crashes, freezes, and disconnects moved out of performance into stability; performance now means frame rate, lag, and load times.]]></description>
    </item>
    <item>
      <title>Bug tracker: Reviewed all 230 open and closed tracker entries and re-filed 105 of them. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-657acf7193cd</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Reviewed all 230 open and closed tracker entries and re-filed 105 of them. The engineering catch-all bucket dropped from 134 entries to 61, the 45 player reports filed before the Oracle learned area classification all found real homes, and a 16-entry cluster of requests about the Oracle itself now sits in its own category.]]></description>
    </item>
    <item>
      <title>Bug tracker: Taught the in-game Oracle the new areas: its classification guide now routes a crash to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-74a13f51ec33</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Taught the in-game Oracle the new areas: its classification guide now routes a crash to stability, a missing texture to graphics, a silent spell to audio, and mail or party problems to social. It also counts how often it fails to classify a report, so classification slips show up in the service metrics. The reporting service picks this up with its next deploy.]]></description>
    </item>
    <item>
      <title>Linux client: Shipped build 34 to the test shard on Windows and Linux together. Both clients were built…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-0b9b2c04661c</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Shipped <b>build 34</b> to the test shard on Windows and Linux together. Both clients were built from the same source revision and carry the same build number, the server was rebuilt to match and swapped in with a rollback copy kept aside, both download channels flipped live, and an automated login test passed before the release finished.]]></description>
    </item>
    <item>
      <title>Linux client: Released the Linux launcher as a small archive that stays runnable after extraction, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-249a626f07bd</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Released the <b>Linux launcher</b> as a small archive that stays runnable after extraction, and verified the whole path on a Linux machine end to end: the launcher fetched build 34 over the network, checked its signature, and left the game marked runnable. Added a Linux launcher download link to the tester page and the developer portal next to the Windows one.]]></description>
    </item>
    <item>
      <title>Linux client: Closed the release race that could put two platforms on different code: a release now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-907f24b2d622</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Closed the release race that could put two platforms on different code: a release now locks one source revision up front and builds every platform from it. The build tooling gained the revision pin, and the deploy still refuses a mismatched pair as a backstop.]]></description>
    </item>
    <item>
      <title>Community: Swept recent community input across four sources: the workblog discussion thread (all 50…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-1b70e4425a4f</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Swept recent community input across four sources: the workblog discussion thread (all 50 posts), wishlist requests active since January 2025, the live-server feedback board (38 threads), and the fifteen bug-report boards.]]></description>
    </item>
    <item>
      <title>Community: Filed 53 new player suggestions on the tracker, including bulk vendor listings with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-3c79feeec492</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Filed 53 new player suggestions on the tracker, including bulk vendor listings with partial-quantity buying, town maps that show placed lots and owners, calendar-driven seasons and weather, PvP factions with territory, ambient sound for player-owned towns, and a pass on underperforming skills and incomplete tooltips.]]></description>
    </item>
    <item>
      <title>Community: Filed 17 bug and follow-up entries from the same pass, among them farm actions failing on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-931d838f103b</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Filed 17 bug and follow-up entries from the same pass, among them farm actions failing on very large farms, axe-head salvage yielding nothing for a quest, players showing online to friends while logged off, and interactive objects getting stuck in a busy state.]]></description>
    </item>
    <item>
      <title>Community: Bug reports already moving through the Bug Brigade's forum pipeline were left with them…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-f7107df4635b</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Bug reports already moving through the Bug Brigade's forum pipeline were left with them; only open, systemic, or stalled items were imported. Ideas players re-raised that were already on file got follow-up notes instead of duplicates.]]></description>
    </item>
    <item>
      <title>Friends and guild presence: Fixed the bug where a player could show as online in friends and guild lists…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-652ac0275bf5</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Fixed the bug where a player could show as online in friends and guild lists indefinitely, even with their machine powered off, surviving relogs and server restarts (from a forum report, tracker entry filed in yesterday's community sweep). The online roster was maintained purely by login and logout signals, so a single lost logout (a dropped connection with no clean sign-off, a hiccup in cross-server delivery, or a restart replaying old state) left a stale entry with nothing to ever remove it. The servers now audit the roster against real connections once a minute and repair it in both directions: stuck online entries clear within about two minutes, and missed logins get filled in. Verified the repair logic directly with an automated harness, 31 checks passing.]]></description>
    </item>
    <item>
      <title>Friends and guild presence: Fixed a related gap where stopping a server skipped the disconnect handling for every…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-822e4a444088</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Fixed a related gap where stopping a server skipped the disconnect handling for every connected player, which could strand online entries and skip session cleanup. Player disconnects now complete before the server finishes shutting down.]]></description>
    </item>
    <item>
      <title>Board game tables: Fixed a tester-reported bug where the placeable chess, checkers, and backgammon tables…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-98226f906663</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Fixed a tester-reported bug where the placeable chess, checkers, and backgammon tables did nothing on double-click. The placed tables were missing the piece that makes a world object clickable, so the game never recognized the mouse was over them: no highlight, no prompt, no game window. All three tables now show their play prompt and open the game window. The fix needs the next test-shard build to reach testers.]]></description>
    </item>
    <item>
      <title>Terrain textures: Diagnosed why 253 terrain texturing files kept showing up as locally modified: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-ba37cc0d4e66</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Diagnosed why 253 terrain texturing files kept showing up as locally modified: the MicroSplat plugin stamps a checksum into each of its 84 texture-array configs, and the stock formula mixed in the editor version and the active build platform, so any environment difference rebuilt and re-saved every config plus its large texture-array files. The trigger this morning was an unclean editor shutdown on a portable drive losing the saved build-target setting, which silently reset the platform on the next launch.]]></description>
    </item>
    <item>
      <title>Terrain textures: Reworked the checksum to depend only on the texture formats the arrays are actually built…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-1edfd7831f16</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Reworked the checksum to depend only on the texture formats the arrays are actually built with, which are identical across all desktop platforms. Editors on different machines, platforms, or versions now agree on the stored value, so the mass rewrite cannot recur; a genuine format change, such as a mobile build target, still rebuilds the arrays as designed.]]></description>
    </item>
    <item>
      <title>Terrain textures: When only the stored checksum is stale, the plugin now restamps the config file instead…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-0f67472798eb</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[When only the stored checksum is stale, the plugin now restamps the config file instead of recompiling, so the multi-megabyte array files are no longer rewritten needlessly. An automated test pins the formula to a golden value, making an accidental change fail the test suite instead of dirtying 84 files on every developer machine.]]></description>
    </item>
    <item>
      <title>Build pipeline: Timed every phase of a full client build from the build farm's logs: roughly 7 minutes of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-381213d437e0</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Timed every phase of a full client build from the build farm's logs: roughly 7 minutes of real build work, 49 minutes packaging game assets, and 50 minutes compressing the finished 16 GB package at maximum effort even though the data inside is already compressed. Switched the packaging step to a fast multi-core archiver on both build platforms.]]></description>
    </item>
    <item>
      <title>Build pipeline: Wrote up the full speed-up plan for the asset packaging step: the change tracking that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-dd835321505a</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Wrote up the full speed-up plan for the asset packaging step: the change tracking that should skip untouched work currently invalidates itself every build, and the plan lays out how to fix that, close a staleness gap, and cache the expensive bookkeeping, targeting routine builds in well under half an hour.]]></description>
    </item>
    <item>
      <title>Build pipeline: Confirmed from build logs that half the skip system already works: the scene half of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-c26b992af7cb</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Confirmed from build logs that half the skip system already works: the scene half of asset packaging reused its previous output in the latest build, while the game-data half rebuilt every time. That narrows the always-rebuilds problem to the folders the build itself rewrites while it runs, including nearly two thousand dialog data files it deletes and regenerates on every pass.]]></description>
    </item>
    <item>
      <title>Build pipeline: Added diagnostic logging to the asset-packaging skip check, verified by 8 new automated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-878d30f49271</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Added diagnostic logging to the asset-packaging skip check, verified by 8 new automated tests. The build now stores a per-file fingerprint list alongside its rolled-up change signature, and when a rebuild triggers it logs which files changed, were added, or were removed, with the full list saved to a report file. It also times the fingerprint scan and the heaviest native packaging call, so the next build produces exact numbers instead of estimates.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed the blog publishing tool to reset file permissions on the web server after each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-11-a66cfcb4364b</guid>
      <pubDate>Sat, 11 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Fixed the blog publishing tool to reset file permissions on the web server after each upload. Publishing from a Mac had shipped image files the web server was not allowed to read, which briefly broke every picture on this blog; the deploy now cleans that up itself no matter which machine publishes.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-10</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-headlines</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:28 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>A Linux client is on the way.</b> The game client now builds and runs natively on Linux: the first build came out of the build farm today on the first try and passed the new network stack's self test, 7 checks of 7, on a Linux machine. The launcher, the patch server, and the release pipeline all learned the second platform, and a public test build is being prepared.</li>
        <li><b>Random dungeon generator.</b> A new chest for player-owned dungeons builds a random layout from whatever room pieces you drop inside: close the lid, confirm, and rooms attach themselves to your dungeon's open doorways, with a different layout on every roll. Hand-built work is never touched, pieces that do not fit stay in the chest, and every build obeys the same rules as placing rooms by hand.</li>
        <li><b>Mounts can jump.</b> The jump animations for the horse, stag, and reindeer mounts were fully built and wired into the game years ago and shipped switched off behind a single disabled setting. That setting is now on: a mounted jump costs half the focus of one on foot and clears the same height, measured at 1.1 meters in a live test session. From the player wish list on the official forums.</li>
        <li><b>Dungeon-exit crash run down.</b> A tester's client died twice today at the same instant: the moment the game begins tearing a player dungeon down to travel out. Server logs traced the window to scene teardown racing the engine's new background object spawning, and the tester's crash file confirmed the exact failure inside the engine's teardown walk. The game now finishes those spawns before any teardown and holds new ones until loading ends.</li>
        <li><b>The client exits properly again.</b> Quitting the game on the new network stack left the process running forever: ending a connection never closed its underlying socket, every trip between servers leaked another one (a two-hour session held 22 at quit), and the engine's new runtime waits for socket threads where the old one killed them. Sockets now close when a connection ends, when the client hops servers, and at quit. Diagnosed from a live hung process on a dev machine.</li>
        <li><b>One build number everywhere.</b> The launcher called today's test build 32 while the game inside called itself build 30. Both were the same build: build jobs and the patch channel counted independently, and the publisher bridged any gap by renumbering the release, so the two numbers could never re-converge. The number stamped into the game is now the number the channel publishes, a mismatched release is refused instead of shipped, and the server turns away out-of-date clients at login with the standard "restart your launcher" prompt instead of letting them play into strange errors. Build 33 shipped through the new chain the same evening with the launcher, the in-game label, and the server all reporting one number.</li>
        <li>The in-game <b>Oracle</b> got a full reporting overhaul. It now asks up to two short follow-up questions about a bug (what you expected against what actually happened, how to reproduce it, how often it happens) and stops the moment the report is usable, so reports arrive with real detail instead of one vague line. Every report is classified into one of 13 game areas such as combat, crafting, interface, or performance, severity follows a written rubric instead of a guess, and before anything is filed the report is checked by meaning against every existing report, similar wording or not, so duplicates get pointed at the original instead of piling up.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Player dungeons: Added the Random Dungeon Generator Chest for player-owned dungeons. Place the chest…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-9d472db15fdf</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:27 -0500</pubDate>
      <description><![CDATA[Added the <b>Random Dungeon Generator Chest</b> for player-owned dungeons. Place the chest inside your dungeon, fill it with dungeon room pieces, and close it: after a confirmation, the pieces assemble themselves onto the dungeon's open doorways, rolling a different layout every time. It only ever adds to what you built by hand, and pieces that do not fit stay in the chest with a chat summary of why (no matching doorway, no space, or the dungeon point limit).]]></description>
    </item>
    <item>
      <title>Player dungeons: Generated layouts obey every rule manual building enforces: doorway set matching, room…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-0d8910e54aaf</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:26 -0500</pubDate>
      <description><![CDATA[Generated layouts obey every rule manual building enforces: doorway set matching, room collision, the dungeon point budget, and every room staying reachable from the entrance. Verified end to end against a local server: two full builds each landing on an exact 100 of 100 point budget, all rooms connected, and the layout identical after leaving and re-entering the dungeon.]]></description>
    </item>
    <item>
      <title>Player dungeons: Fixed two defects that live verification surfaced before they could ship: rooms built…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d54db3dd2a27</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:25 -0500</pubDate>
      <description><![CDATA[Fixed two defects that live verification surfaced before they could ship: rooms built from a stacked item briefly shared one network identity, and a rapid build could outrun the server's save acknowledgments so a room could trail in on the next visit. Builds now pace themselves against the server and stop with an honest report if it falls behind.]]></description>
    </item>
    <item>
      <title>Player dungeons: The manual doorway builder now shares one placement code path with the generator, so the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-756ef71bbb09</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:24 -0500</pubDate>
      <description><![CDATA[The manual doorway builder now shares one placement code path with the generator, so the two cannot drift apart. 15 automated tests pin the layout logic. The chest is a test-only item for now; how players will earn it gets decided after the testers have beaten on it.]]></description>
    </item>
    <item>
      <title>Mounts: Enabled mounted jumping (a player wish list item from the official forums). The horse…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-9c4aeb33d2d3</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:23 -0500</pubDate>
      <description><![CDATA[Enabled <b>mounted jumping</b> (a player wish list item from the official forums). The horse, stag, and reindeer jump animations, the rider animations, the input handling, the physics, and the network replication all existed and were switched off behind one disabled setting since the mount system first shipped. A mounted jump costs half the usual focus and clears the same height as on foot, measured at 1.1 meters in a live session. The mounted body is wider than a walking avatar, so this opens no new squeeze-through routes; the tester task includes an out-of-bounds sweep anyway. Known cosmetic gap: cat mounts have no rider jump animation, so the rider holds the saddle pose while the cat jumps.]]></description>
    </item>
    <item>
      <title>Mounts: Riders now stay mounted across scene changes . The Automatic Remount option existed but…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-78cb21cd83f6</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:22 -0500</pubDate>
      <description><![CDATA[Riders now <b>stay mounted across scene changes</b>. The Automatic Remount option existed but was off by default and visibly re-cast the mount seconds after arrival. It is now on by default and starts behind the loading screen. Players who had explicitly turned it off keep their choice, and dismounting on purpose before traveling still means arriving on foot. The re-cast needs about two seconds after arrival to survive the arrival state sync, so a short wait can remain visible after long loads.]]></description>
    </item>
    <item>
      <title>Mounts: Fixed three defects in the remount logic while moving it: being knocked off a mount and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d629d960a80e</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:21 -0500</pubDate>
      <description><![CDATA[Fixed three defects in the remount logic while moving it: being knocked off a mount and then traveling on foot no longer surprise-remounts you scenes later, arriving dead no longer queues a forced remount for whenever you resurrect (it gives up quietly after 30 seconds), and the remount can no longer stall a scene load, because it runs independently of the loading sequence.]]></description>
    </item>
    <item>
      <title>Mounts: Doors and city gates can be opened while mounted. Every door refused with "You cannot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d858a4355559</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[<b>Doors and city gates</b> can be opened while mounted. Every door refused with "You cannot interact while mounted!"; doors and gates now open from the saddle, while chests, crafting stations, and everything else still require dismounting. A door swinging open no longer counts as a collision that knocks the rider off; riding into a genuinely low doorframe still dismounts as before.]]></description>
    </item>
    <item>
      <title>Mounts: Verified in a live Editor session with a real login: a measured mounted jump arc, a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d5c16a072211</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[Verified in a live Editor session with a real login: a measured mounted jump arc, a mounted zone transition running the full remount chain, and a door query from the saddle. Six new automated tests lock the setting values and the door and collision behavior. Filed three tester verification tasks and two new wish list entries; none of this is on the test shard until the next build.]]></description>
    </item>
    <item>
      <title>Input: Caught and fixed a bug from yesterday's harvesting swing meter that silently unbound the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-3978334fd57f</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[Caught and fixed a bug from yesterday's harvesting swing meter that silently <b>unbound the jump key for every player</b>. The meter registered its own key defaulting to Space, and key registrations are exclusive: the second owner of a key strips the first, so Space stopped jumping everywhere, on foot and mounted. The swing input now has no default key of its own and reads the jump key while the meter is live, which was the intended design. The live test build predates the meter, so testers never saw the broken state.]]></description>
    </item>
    <item>
      <title>Client stability: Ran down a tester's report of the client dying while leaving a player dungeon. Server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-e00c232738c3</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[Ran down a tester's report of the client dying while leaving a player dungeon. Server logs showed two hard crashes in one afternoon, both at the exact moment the game starts tearing the dungeon scene down for the trip out, and two error entries from the same session caught the underlying state: the engine's new background object spawning was still integrating pooled objects while the game swept and tore down the scene around them.]]></description>
    </item>
    <item>
      <title>Client stability: Fixed the window: in-progress spawn batches are now finished off before the end-of-load…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-9a50f6cc59fc</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Fixed the window: in-progress spawn batches are now finished off before the end-of-load sweep of a fresh scene, before the dungeon cleanup pass, and before a scene is torn down for travel. The stalls land behind the loading screen. The same race had been silently aborting the pass that registers lights and effects for distance culling and the pass that returns disconnected dungeon pieces to inventory, so those now complete reliably in player dungeons. Four automated tests pin the new behavior; the fix rides the next test-shard build.]]></description>
    </item>
    <item>
      <title>Client stability: The same log dig surfaced a separate problem: a slower scene load got another player…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-9660da9bab59</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[The same log dig surfaced a separate problem: a slower scene load got another player disconnected to the title screen mid-travel because the server's client timeout keeps counting during long loads. Filed for follow-up rather than fixed today.]]></description>
    </item>
    <item>
      <title>Client stability: The tester sent in the crash file, and it confirmed the diagnosis exactly: the engine…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-ffd715b734a2</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[The tester sent in the crash file, and it confirmed the diagnosis exactly: the engine died walking a half-built spawn batch while it tore the dungeon scene down. The symbols matched the exact engine build, so the readout is definitive.]]></description>
    </item>
    <item>
      <title>Client stability: The crash file also exposed one residual gap: the doomed scene keeps running for a few…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-a9fcfa5e2e1e</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[The crash file also exposed one residual gap: the doomed scene keeps running for a few frames after the safety flush, so a spawn batch started in that window could reopen the race. Background spawning now switches to immediate mode for the whole loading sequence and back afterward. Five automated tests cover the behavior.]]></description>
    </item>
    <item>
      <title>Oracle: Taught the Oracle to gather a usable bug report before filing. For bugs it may ask up to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-f0ecd11b6f22</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Taught the Oracle to gather a usable bug report before filing. For bugs it may ask up to two short clarifying messages aimed at what is missing: expected against actual first, then how to make it happen, then frequency. It stops early once the report is usable, never asks anything after you confirm, and a player who answers "I don't know" or "just file it" still gets their report filed with what they gave. Feature ideas stay at a single question at most.]]></description>
    </item>
    <item>
      <title>Oracle: Reports now carry structured Expected, Actual, and Frequency sections when the player…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-12403dafded8</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Reports now carry structured Expected, Actual, and Frequency sections when the player provided them, so the team reads the failure in the player's own words instead of digging it out of a summary paragraph.]]></description>
    </item>
    <item>
      <title>Oracle: The Oracle now files every report into one of 13 player-facing game areas (combat…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-6db52be3a545</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[The Oracle now files every report into one of 13 player-facing game areas (combat, crafting, gathering, economy, housing, items, interface, travel, world, quests, progression, taming, performance) instead of one catch-all engineering bucket. The choice is checked server-side and falls back safely when nothing fits.]]></description>
    </item>
    <item>
      <title>Oracle: Severity now follows a written rubric: blocker means you cannot keep playing or lost…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-166020b983f6</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Severity now follows a written rubric: blocker means you cannot keep playing or lost something permanently, major means a system is broken with no workaround, minor covers cosmetic issues and inconveniences. When torn, the Oracle picks the lower level, except lost progress is never minor.]]></description>
    </item>
    <item>
      <title>Oracle: Built duplicate detection that cannot be skipped. Every filing attempt is compared by…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-f9c0c783e1ef</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Built duplicate detection that cannot be skipped. Every filing attempt is compared by meaning against all existing reports, open and closed, and against reports other players filed minutes earlier. Likely matches are surfaced and must be ruled out before a new report files; a match against a fixed bug files anyway with a note that it may have returned. Shipped in a watch-only mode first, with a calibration tool that picks the match thresholds from the real report corpus before enforcement turns on.]]></description>
    </item>
    <item>
      <title>Oracle: Hardened the service around the funnel: per-player and service-wide usage limits now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-263c41e09548</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Hardened the service around the funnel: per-player and service-wide usage limits now survive restarts, oversized requests are trimmed before they cost anything, a single abusive account can be cut off without touching anyone else, and every decision is logged for tuning.]]></description>
    </item>
    <item>
      <title>Oracle: Filed reports now include the build number, operating system, hardware, display mode…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-c8f2e296e1cd</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Filed reports now include the build number, operating system, hardware, display mode, graphics quality, frame rate, and language when the game client sends them. The service side landed today; the client side rides the next test-shard build, and either half works alone.]]></description>
    </item>
    <item>
      <title>Oracle: Backed the whole overhaul with an offline test suite, 52 checks covering the new prompt…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-c976c388e034</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Backed the whole overhaul with an offline test suite, 52 checks covering the new prompt rules, the area list, the duplicate gate paths, the usage limits, and the report rendering.]]></description>
    </item>
    <item>
      <title>Oracle: The game client's half landed too, riding the next test-shard build: the Oracle window's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-e16f5a016976</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[The game client's half landed too, riding the next test-shard build: the Oracle window's input box now stops at the same length the server accepts instead of silently losing the overflow, and the "Filed report" and "Matches existing report" lines are styled apart from the knowledge-base citations so the outcome of a report is the first thing you see.]]></description>
    </item>
    <item>
      <title>Oracle: Split the client's request-building code out of the window plumbing into a pure piece…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-faa28aee2619</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Split the client's request-building code out of the window plumbing into a pure piece with 7 editor tests pinning it, including one that keeps decimal points correct for players running the game on German or French systems.]]></description>
    </item>
    <item>
      <title>Oracle: Grew the Oracle's knowledge base where players asked about the interface. The Game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-fe1705ad30f7</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Grew the Oracle's knowledge base where players asked about the interface. The Game Interface guide went from a 60-line overview to a full walkthrough of status bars, effect icons, targeting, nameplates, the compass, hotbars, and window management, and four new guides joined it: Inventory Management, Options and Settings, Chat and Social, and The Map and Compass. Every claim was pulled from the game's own code and help text and then independently re-checked, which caught and corrected 16 wrong or unverifiable statements before anything shipped.]]></description>
    </item>
    <item>
      <title>Oracle: Deployed the whole overhaul to the live Oracle service the same day and verified it end…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-1aa6aed5d687</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Deployed the whole overhaul to the live Oracle service the same day and verified it end to end: a question about splitting item stacks answered from the new Inventory Management guide with a working source link, and a test bug report came back tagged interface, severity minor, with the expected and actual behavior as separate sections and the report visible to the duplicate matcher seconds later. The tracker gained the 13 new game-area categories, and a verification task went to the testers.]]></description>
    </item>
    <item>
      <title>Oracle: The duplicate-matching calibration proved its worth before it could do harm: measured on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-2f147deadcdc</guid>
      <pubDate>Fri, 10 Jul 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[The duplicate-matching calibration proved its worth before it could do harm: measured on the real report corpus, two completely unrelated reports typically score 79 percent similar to their nearest neighbor under the matching model, so the ship-with defaults would have flagged half of all honest reports. The measured thresholds went live instead, and matching runs in a watch-only mode while a week of data confirms them.]]></description>
    </item>
    <item>
      <title>Launcher: The launcher now detects that the previous game session did not close properly (a crash…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-61602f4e56d1</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[The launcher now detects that the previous game session did not close properly (a crash, a hang, or a killed process) and automatically sends that session's log file, plus a short hardware summary (operating system, processor, memory, graphics cards, language, free disk space), to the team. A small line in the launcher notes when a report went out; a setting in the launcher's config file turns the feature off.]]></description>
    </item>
    <item>
      <title>Launcher: Privacy rules are built in: the computer name and Windows username are never collected…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-289aa4518253</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Privacy rules are built in: the computer name and Windows username are never collected, and file paths inside the log are blanked to a placeholder before anything leaves the machine. Each distinct crash is reported once, with at most three delivery attempts, and uploads are size-capped.]]></description>
    </item>
    <item>
      <title>Launcher: When the engine wrote a crash dump for a hard crash, the report carries the dump and its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-2a9ee405f907</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[When the engine wrote a crash dump for a hard crash, the report carries the dump and its error log too, so those crashes arrive with enough detail to be read directly. An update interrupted mid-upload finishes the send on the next launcher start.]]></description>
    </item>
    <item>
      <title>Launcher: Built the receiving service endpoint with per-machine and service-wide daily limits…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-a7d08b02dec2</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Built the receiving service endpoint with per-machine and service-wide daily limits, verified the full loop end to end with a staged crash (detected, uploaded, stored with its hardware summary, and correctly skipped as a duplicate on the next start), and covered both halves with 44 new automated tests. Rides the next launcher update.]]></description>
    </item>
    <item>
      <title>Linux client: Started shipping a native Linux client . The first Linux build came out of the build farm…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-9d1bee7a7a1e</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Started shipping a native <b>Linux client</b>. The first Linux build came out of the build farm on the first try with no game-code changes and passed the new network stack's built-in self test, 7 checks of 7, running on a Linux machine.]]></description>
    </item>
    <item>
      <title>Linux client: Fixed the failure that killed an earlier Linux release-build attempt: the build-number…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-563ee88596c4</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Fixed the failure that killed an earlier Linux release-build attempt: the build-number stamp marks two project files read-only after writing them, and on Linux clearing that mark requires owning the file. The stamp now skips the read-only marking on non-Windows build machines.]]></description>
    </item>
    <item>
      <title>Linux client: The launcher's transfer engine now records which files in a build must be executable and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-c2cd0fc29f80</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[The launcher's transfer engine now records which files in a build must be executable and marks them after every update on Linux and Mac, where a downloaded file is not runnable by default. The launcher also starts the game directly on those platforms; the old launch path only worked reliably on Windows. The launcher test suite, 97 checks, passes on both Windows and Linux.]]></description>
    </item>
    <item>
      <title>Linux client: The Linux launcher download will be a small archive that keeps the program runnable after…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-0d0f0f024c97</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[The Linux launcher download will be a small archive that keeps the program runnable after extraction, built automatically by the release script alongside the plain binary the launcher uses to update itself.]]></description>
    </item>
    <item>
      <title>Linux client: The patch server gained a Linux section beside the Windows one, the nightly cleanup of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-019d41ef3dbd</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[The patch server gained a Linux section beside the Windows one, the nightly cleanup of old builds understands the Linux download shapes, and the pre-deploy security checks audit the Linux channel with the same rules as the Windows one.]]></description>
    </item>
    <item>
      <title>Linux client: The release pipeline can now ship both platforms as one release: Windows and Linux…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-14d8eeb409f9</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[The release pipeline can now ship both platforms as one release: Windows and Linux clients built from the same source revision carry the same build number, are checked against each other before anything goes live, and publish to their own patch channels in a single deploy.]]></description>
    </item>
    <item>
      <title>Build and deploy: Diagnosed last night's failed Windows client release build: a leftover Unity process had…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-7f12602da2a9</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Diagnosed last night's failed Windows client release build: a leftover Unity process had held the dedicated build tree open all night, so the build could not open the project, and the console blamed a licensing retry instead of the real cause. Build jobs now clear any stale Unity process off the build tree before starting and report that failure by name with the offending process listed. A fresh release build went through cleanly this morning.]]></description>
    </item>
    <item>
      <title>Build and deploy: Rebuilt the chaos deploy pipeline around the new server stack. The old server phase still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-8ccdb4f6a8f0</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Rebuilt the chaos deploy pipeline around the new server stack. The old server phase still tried to ship the retired backend to a machine that no longer exists, which is why yesterday's deploy died in its first seconds, and it would have paired the client with a five-day-old server build even if it had worked. The deploy now compiles the new-stack server from exactly the same source revision as the client being published, refuses any client and server mismatch up front, and a server build that fails to compile leaves the running shard untouched.]]></description>
    </item>
    <item>
      <title>Build and deploy: A failed server start now rolls itself back: the previous build is kept aside on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-89d9883f3724</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[A failed server start now rolls itself back: the previous build is kept aside on the shard, restored, and restarted automatically, so a bad deploy can no longer leave the test shard down.]]></description>
    </item>
    <item>
      <title>Build and deploy: The deploy pipeline targets the chaos shard only now. The options to point it at other…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-150140d5f0fe</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[The deploy pipeline targets the chaos shard only now. The options to point it at other environments were removed outright, and the deploy scripts refuse any other destination independently of the pipeline settings.]]></description>
    </item>
    <item>
      <title>Build and deploy: Each server deploy can also carry a freshly generated world report, so player-owned towns…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-2069210ea7a3</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Each server deploy can also carry a freshly generated world report, so player-owned towns created since the last snapshot set up correctly after an update.]]></description>
    </item>
    <item>
      <title>Build and deploy: The reworked deploy's first live run proved the safety design and caught its own gap: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-5310a973fb20</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[The reworked deploy's first live run proved the safety design and caught its own gap: the server compile references shared sources outside the source slice the pipeline had prepared, so the compile failed and the running shard was left untouched, exactly as intended. The slice now covers the full shared-source set.]]></description>
    </item>
    <item>
      <title>Build and deploy: Chaos build 32 went out through the rebuilt pipeline end to end: the server was compiled…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-55b3fc1e962d</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Chaos build 32 went out through the rebuilt pipeline end to end: the server was compiled from the same source revision as the client, the shard restarted with a rollback copy held aside, the world report shipped fresh so all 442 player-owned towns are current, and the automated login probe passed before the release was called done. Eleven waiting tester tasks were marked ready to test on the new build.]]></description>
    </item>
    <item>
      <title>Build and deploy: Fixed the recurring "phantom-modified" file noise in the game repo. 529 large baked Unity…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-85b985969d8c</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Fixed the recurring "phantom-modified" file noise in the game repo. 529 large baked Unity assets (combined meshes, occlusion-culling data, terrain and project-settings assets) were stored as raw text even though the repo is configured to keep files that size in dedicated large-file storage, so every fresh checkout reported them as changed forever and each sync had to stash the noise away. Re-stored them as proper large-file pointers; the on-disk content is unchanged and the working tree is finally clean after a pull.]]></description>
    </item>
    <item>
      <title>Build and deploy: Merged that large-file fix into the working copy here, which surfaced one more publisher…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d99ad3853148</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Merged that large-file fix into the working copy here, which surfaced one more publisher gap: the merge rewrote this log's page with Windows line endings and the weekly rollover script only accepted Unix ones, so publishing refused to run. The script now accepts both, and the merged page with both machines' entries went out.]]></description>
    </item>
    <item>
      <title>Build and deploy: Made the launcher and the game agree on the build number. The launcher called the current…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-bc264091e216</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Made the launcher and the game agree on the build number. The launcher called the current test build 32 while the game inside reported build 30: each build job counts its own builds, the patch channel counts published releases, and the publisher bridged any gap by renumbering the release, so the two numbers drifted apart permanently. Builds now stamp themselves with the next channel number, the publisher refuses to renumber anything, and a release whose numbers disagree is refused instead of shipped. The next build converges launcher, in-game build label, and server on one number.]]></description>
    </item>
    <item>
      <title>Build and deploy: The server now turns away out-of-date game clients at login. The only version check…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-6cb6bab60055</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[The server now turns away out-of-date game clients at login. The only version check compared a name that changes once per data wipe, not per build, so a stale client could keep playing against a newer server and run into confusing errors. The server now compares the client's build number against the build it shipped with and sends old clients the standard "restart the game using the launcher" prompt. Local development servers and Editor sessions are unaffected.]]></description>
    </item>
    <item>
      <title>Build and deploy: The Chaos shard's daily message now greets testers with a real welcome instead of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-01c836b60639</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[The Chaos shard's daily message now greets testers with a real welcome instead of the "Default Message" placeholder: the shard never had a message file, so it served the built-in fallback, and each deploy now installs the real one.]]></description>
    </item>
    <item>
      <title>Build and deploy: Build 33 shipped through the whole reworked chain the same evening: the build stamped…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-52891f5f8479</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Build 33 shipped through the whole reworked chain the same evening: the build stamped itself one above the live channel, the publisher accepted it without renumbering, and the launcher, the in-game build label, and the server now all report 33. An outdated client picked up the new build through the launcher bounce exactly as designed, and a scripted login on the fresh build confirmed the new welcome message in chat.]]></description>
    </item>
    <item>
      <title>Build and deploy: The first live pass caught one placement bug in the new deploy step: the server reads its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d478027a7aaa</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[The first live pass caught one placement bug in the new deploy step: the server reads its runtime files from its data directory, and the deploy had written the build-number stamp and the daily-message file next to the binaries instead, leaving the login gate off. The deploy now writes both to the right place and restores the previous values if a deploy rolls back; corrected on the shard the same hour and verified with the gate reporting build 33 on startup.]]></description>
    </item>
    <item>
      <title>Build and deploy: Verified remote access to the build machine ahead of travel. The web build console…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-addaf9d511b8</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Verified remote access to the build machine ahead of travel. The web build console already works from anywhere behind two logins, and direct maintenance access rides an existing secure tunnel between two of our servers; both connections dial outward from the office and reconnect on their own after a network blip. Wrote the procedure into the operations docs and set up a one-command shortcut on the laptop.]]></description>
    </item>
    <item>
      <title>Client performance: Started the next client performance workstream: runtime combining of identical house…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-6afc563e04f6</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Started the next client performance workstream: runtime combining of identical house decorations into single render objects, with the originals restored the moment anyone edits one. Groundwork landed first: the decoration audit tool now measures combine readiness across all 6,524 decoration items (mesh readability, level-of-detail structure, transparent materials), and an Editor survey of a 425-item sample showed 86 percent of decoration meshes already qualify. The design doc covers grouping by item and dye, spatial clustering, and the safety rules that keep decorations clickable while combined.]]></description>
    </item>
    <item>
      <title>Client performance: Built the decoration combining core: identical items group by prefab and dye into 24…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-38421d59cbc2</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Built the decoration combining core: identical items group by prefab and dye into 24 meter plot cells, a quiet-time debounce holds work until a lot stops changing, builds are budgeted per frame, and any edit to a member dissolves its combined group on the spot. 22 automated tests pin the scheduling behavior. The piece is inert until the mesh combiner and game hooks land on top.]]></description>
    </item>
    <item>
      <title>Client performance: Landed the rest of the decoration combining runtime on top of that core: the mesh…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-c0d191c5d123</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Landed the rest of the decoration combining runtime on top of that core: the mesh combiner that merges each group into one draw object with dye colors preserved per piece, and the game hooks that hide the originals and bring them back the instant a decoration is grabbed, moved, dyed, or picked up, with the whole lot held out of combining while a player is actively decorating it. A new Video option (on by default) lets players switch the system off; everything stays inactive behind the master setting until the benchmark and audit gates pass.]]></description>
    </item>
    <item>
      <title>Client performance: Added the measurement tools for those gates: a play-mode audit that reports how many…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-dd8ef7f1b71c</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Added the measurement tools for those gates: a play-mode audit that reports how many identical-item groups a real player town actually offers the combiner, and the synthetic benchmark scene can now stamp combine-eligible decorations for before/after captures. The full client test suite is green at 773 tests, including one scheduling test that had never been run to completion and was asserting at the wrong moment.]]></description>
    </item>
    <item>
      <title>GM tools: Chased a report that the Light spell cast fine but produced no light. The spell itself…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-a5bc5b7f06f8</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Chased a report that the Light spell cast fine but produced no light. The spell itself was healthy: the test character was in GM ghost mode, which hides all of a ghosted GM's spell effects by design, persists across logins, and switches itself on when certain GM windows open. Nothing on screen ever said so, which made a working spell look broken.]]></description>
    </item>
    <item>
      <title>GM tools: Casting while ghosted now prints a chat notice that GM ghost mode is hiding your spell…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-cde705804167</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Casting while ghosted now prints a chat notice that GM ghost mode is hiding your spell effects, with where to turn Ghost off, at most once every ten seconds. Verified in a live session: one notice on a ghosted cast, none after unghosting, and the Light spell's light back on the caster.]]></description>
    </item>
    <item>
      <title>GM tools: Ran down a red "Server: Unknown operation code" error appearing in chat at character…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-e5b51bb92fad</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Ran down a red "Server: Unknown operation code" error appearing in chat at character select. A GM window left open survives logging out, and its automatic player-roster refresh kept asking the login server a question only game servers can answer. GM requests now hold until the client is back on a game server, and the login server answers unknown requests without printing its confusion into player chat.]]></description>
    </item>
    <item>
      <title>GM tools: Typing /gm now leaves a success line in the client log, so a "nothing happened" report…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-65ea6b991dd8</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Typing /gm now leaves a success line in the client log, so a "nothing happened" report can be settled from the log alone: every failure branch already logged, and total silence now always means the command never reached the game. Verified end to end in a scripted fresh client session on the test shard: window open, roster request answered, screenshot taken.]]></description>
    </item>
    <item>
      <title>Connection errors: Rewrote all 22 connection-error dialogs. Each kept its support code word ([WHEAT]…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-ed1b6ceac076</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Rewrote all 22 connection-error dialogs. Each kept its support code word ([WHEAT], [IRON], [CICADA], and the rest) so a screenshot still identifies the exact failure branch, but the message behind the code now explains in plain language what likely happened and what to try: servers down or restarting, a firewall or router blocking the game's ports, an internet connection that dropped, the account service unreachable. The old texts were deliberately vague one-liners.]]></description>
    </item>
    <item>
      <title>Connection errors: The generic "connection lost" dialog now names the usual real causes: an internet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-77856fdabc55</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[The generic "connection lost" dialog now names the usual real causes: an internet connection that dropped or changed mid-session, such as a router failover, a VPN reconnect, or a network switch. That exact case came up this morning: a mid-session failover to a backup internet line dropped the connection, and the old dialog offered nothing but a code word and Diagnostic="None".]]></description>
    </item>
    <item>
      <title>Connection errors: On the new network stack the dialog's Diagnostic value now carries the real transport…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-8657f15c0008</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[On the new network stack the dialog's Diagnostic value now carries the real transport reason (timeout, connection refused, socket error) instead of "None" for every unclassified drop, and the client logs that reason on every disconnect, so a report screenshot alone tells support what actually happened.]]></description>
    </item>
    <item>
      <title>Connection errors: All 22 messages were re-translated into the seven supported languages and the shipped…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-806fc9b49314</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[All 22 messages were re-translated into the seven supported languages and the shipped language files regenerated; the Spanish and Italian files caught up with several older text changes at the same time. Verified end to end in a live play-mode session: a real disconnect rendered the new dialog text cleanly, and the client test suite passed with no failures.]]></description>
    </item>
    <item>
      <title>Client shutdown: Fixed the built client never exiting after quit. On the new network stack, ending a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-939a5465726f</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Fixed the built client never exiting after quit. On the new network stack, ending a connection stopped the conversation but left the underlying socket and its listening thread running, and every hop between servers opened a fresh connection without closing the old one; a two-hour play session held 22 abandoned sockets at quit. The old engine runtime forcibly ended those threads on exit, the new one waits for them, so the window closed and the process lived on until killed by hand. Diagnosed from a live hung process: engine teardown had completed and the leaked sockets were still bound two hours later.]]></description>
    </item>
    <item>
      <title>Client shutdown: The transport now closes its socket the moment a connection ends, a reconnect retires the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-07675416b2b7</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[The transport now closes its socket the moment a connection ends, a reconnect retires the old socket before opening the new one, and quitting closes every remaining connection before the engine shuts down. Three new automated tests pin the behavior, including the server-hop reconnect pattern, and the full transport test suite passed.]]></description>
    </item>
    <item>
      <title>Client shutdown: Fixed every radio deco object throwing an error during shutdown: the engine no longer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-05ba964cc307</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Fixed every radio deco object throwing an error during shutdown: the engine no longer accepts a missing texture when a radio turns its screen off, and the error was also skipping the radio player's cleanup accounting. Missing textures are now skipped.]]></description>
    </item>
    <item>
      <title>Client shutdown: The internet-radio tuner could park a thread for ten minutes waiting on a dead station…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-d94560d509f7</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[The internet-radio tuner could park a thread for ten minutes waiting on a dead station stream: the wait constant was 100 times larger than intended. It now gives up after the intended six seconds, and the wait no longer counts against process exit.]]></description>
    </item>
    <item>
      <title>Quest tools: Designed the quest wizard , the authoring step for the Quest Graph tool: a designer…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-8a4b547419d0</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Designed the <b>quest wizard</b>, the authoring step for the Quest Graph tool: a designer describes a quest in plain language, an AI drafts the dialogue in each character's established voice along with the flags, journal entries, and reward wiring, and a step-by-step review screen with exact file previews is the gate before anything is written. Every generated quest must pass the same validation that already checks the 677 shipped quests, and a finished quest lands as one change that a single undo removes completely.]]></description>
    </item>
    <item>
      <title>Quest tools: The design rests on a full audit of everything creating a quest actually touches…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-1a3bcceef57c</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[The design rests on a full audit of everything creating a quest actually touches (conversation files, journal entries, reward lists on the characters themselves) and does not require the AI: the same wizard accepts hand-built quest plans, and the id bookkeeping the retired quest database used to handle moves into the tool. Build order is settled in the design document; implementation starts later.]]></description>
    </item>
    <item>
      <title>Tavern games: The chess, checkers, and backgammon game tables are now obtainable on the chaos shard…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-c4433b611f01</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[The chess, checkers, and backgammon game tables are now obtainable on the chaos shard. The tables shipped in an earlier build, but the server's item data snapshot predated them, so the server did not recognize the tables and could not create or mail one. Build 32's deploy carried a current snapshot, confirmed on the shard itself, and each community tester account received one of each table by in-game mail for the open verification task.]]></description>
    </item>
    <item>
      <title>Harvesting: Redrew the harvesting swing meter as a ring track after team feedback that the needle…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-953f9c33ab52</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Redrew the harvesting swing meter as a ring track after team feedback that the needle read poorly. The old design filled a half circle and swung a needle from the center, but the needle's pivot sat below the wedge's center, so where it pointed was ambiguous. The meter is now a thin ring: a red marker sweeps along the track right to left, the target is a green zone on the track with a gold center for a perfect hit, and the marker overhangs the track like a tick so the press moment reads at a glance.]]></description>
    </item>
    <item>
      <title>Harvesting: Timing, skill effects, and rewards are unchanged: gathering skill still sizes the zone…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-44cb8b45d14b</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Timing, skill effects, and rewards are unchanged: gathering skill still sizes the zone, Meticulous Collection still softens how much it shrinks per hit, and the sweep still speeds up as a chain grows. How much of the ring the sweep covers is a tuning value, shipped at 270 degrees to match the team mockup.]]></description>
    </item>
    <item>
      <title>Harvesting: Verified in a live session against a local server: a real copper vein drove the new meter…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-5cd1c7d1aff5</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Verified in a live session against a local server: a real copper vein drove the new meter through a full harvest pass, and 7 new automated tests pin the ring geometry alongside the existing 12 on the harvest math.]]></description>
    </item>
    <item>
      <title>Harvesting: Fixed gathering speed bonuses not applying to Meticulous Collection's bonus swings. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-87128727e134</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Fixed gathering speed bonuses not applying to Meticulous Collection's bonus swings. The extra collection passes a high Meticulous Collection skill grants ran on a flat timer, so the skills, potions, and gear that speed up gathering did nothing for them and the bonus swings dragged compared to the first. Bonus passes now get the same speed bonus as the first pass; 4 new automated tests pin the timer math.]]></description>
    </item>
    <item>
      <title>Scene analysis: Ran the scene analysis bake across 10 more scenes picked for variety: the mountain city…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-1b3938de095f</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Ran the <b>scene analysis</b> bake across 10 more scenes picked for variety: the mountain city of Aerie, The Rise dungeon, the Graff Gem Mines, the Grunvald Shardfall, a swamp, an underground cavern, an island, the Spindelskog forest, the Isle of Storms, and a roadside siege encounter. The scene browser now carries 13 scenes with spawner levels, chests, merchants, quest givers, entry points, and load health for each; all 10 loaded with zero errors.]]></description>
    </item>
    <item>
      <title>Scene analysis: Fixed a bake tool defect along the way: analyzing a chosen list of scenes rebuilt the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-1bd35c0e88c7</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Fixed a bake tool defect along the way: analyzing a chosen list of scenes rebuilt the browser index from only that list, dropping every scene baked earlier. A partial bake now folds the existing results back in, so the index always reflects everything baked so far.]]></description>
    </item>
    <item>
      <title>Scene analysis: Followed up with a second batch of 20 scenes, taking the browser to 33: the towns of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-1b065ebc75a7</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Followed up with a second batch of 20 scenes, taking the browser to 33: the towns of Kingsport, Etceter, and Valhold with its palace interior, the Owls Head sewers, the Despair and The Fall dungeons, the Etceter Crag Mines, the Verdantis Shardfall, the Crawl to Krul passage, the Kas ruins, the Necropolis forest, Superstition Canyon, Eastreach Gap, a volcanic field, Mariah Overlook, a kobold battle camp, a desert road encounter, the Tartarus PvP scene, and the Sequana Colossus. The 20 scenes baked and published in under four minutes.]]></description>
    </item>
    <item>
      <title>Scene analysis: The batch produced its first real content finding: the Necropolis forest logs 16 physics…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-49d161d907ef</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[The batch produced its first real content finding: the Necropolis forest logs 16 physics errors on every load, from a flat quad mesh being used as a solid collider shape. The failure now shows in the scene's health panel in the browser instead of scrolling past in a console.]]></description>
    </item>
    <item>
      <title>Scene analysis: Fixed a browser defect the new batch exposed: detail pages for scenes with spaces in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-74b6f8252956</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Fixed a browser defect the new batch exposed: detail pages for scenes with spaces in their names (The Fall, The Rise, Graff Gem Mines, the sewers) refused to load, showing "Missing or invalid scene id". The page's id check did not allow spaces. Verified fixed on the live page, where The Fall now renders its full data set including live telemetry from the test shard.]]></description>
    </item>
    <item>
      <title>Mail: The first full test-suite run since the bulk mail work landed caught its one pending test…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-a3bc98c88806</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[The first full test-suite run since the bulk mail work landed caught its one pending test disagreeing with the game by a single gold at exact tenth-of-a-pound package weights. The game's postage fee was correct; the test's copy of the formula rounded slightly differently near the boundary. The test now rounds exactly like the game does.]]></description>
    </item>
    <item>
      <title>Server logging: The log cluster's field-typing templates now carry version numbers, and the setup script…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-94db049b522e</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[The log cluster's field-typing templates now carry version numbers, and the setup script refuses to overwrite a newer live template with an older file. Earlier this week a re-run from a stale copy silently reverted fresh field typing and three days of log indices rolled unusable for the dashboards; that class of mistake is now blocked at the script.]]></description>
    </item>
    <item>
      <title>Developer tools: Stopping the local development server no longer scatters a stray log folder into whatever…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-62da2da37562</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Stopping the local development server no longer scatters a stray log folder into whatever directory the stop command happened to run from.]]></description>
    </item>
    <item>
      <title>Developer tools: Updated the Editor's assistant plugin to its current release.</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-13e7a1f57299</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Updated the Editor's assistant plugin to its current release.]]></description>
    </item>
    <item>
      <title>Developer tools: Committed a batch of routine Editor re-saves: five effect materials picked up current…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-c3e2efbdf805</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Committed a batch of routine Editor re-saves: five effect materials picked up current shader property lists, and the Chinese UI font shed a megabyte of stale baked glyph data its dynamic atlas regenerates at runtime anyway.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-10</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-10-images</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/scene-analysis-grunvald-shardfall.jpg" data-full="https://catnipgames.net/blog/images/scene-analysis-grunvald-shardfall.jpg" alt="The Grunvald Shardfall as captured by the scene analysis bake: dark rock formations and red ground cover under a hazy sky filled with floating obsidian shards">
        <img src="https://catnipgames.net/blog/images/scene-analysis-isle-of-storms.jpg" data-full="https://catnipgames.net/blog/images/scene-analysis-isle-of-storms.jpg" alt="The Isle of Storms entry as captured by the scene analysis bake: a moonlit stone courtyard between trees, looking toward a rock arch marked with the East entry label">
        <img src="https://catnipgames.net/blog/images/connection-error-wheat-rewrite.png" data-full="https://catnipgames.net/blog/images/connection-error-wheat-rewrite.png" alt="The rewritten connection-lost dialog on the login screen, explaining that the internet connection likely dropped or changed and to check the connection and log in again, with the WHEAT support code kept in front">
        <img src="https://catnipgames.net/blog/images/chaos-build-label-30-gm-tools.png" data-full="https://catnipgames.net/blog/images/chaos-build-label-30-gm-tools.png" alt="A scripted verification session on the Novia overworld beach: the corner build label reads build 30 while the launcher channel called the same build 32, the GM Tools window is open after a /gm command, and the old red Daily Message placeholder shows in chat">
        <img src="https://catnipgames.net/blog/images/chaos-build-33-converged.png" data-full="https://catnipgames.net/blog/images/chaos-build-33-converged.png" alt="The same scripted verification after build 33 shipped: the corner build label reads 33, matching the launcher and the server, the new Chaos welcome message shows as the Daily Message in chat, and the GM Tools window is open after a /gm command">
        <img src="https://catnipgames.net/blog/images/harvest-swing-ring-track.png" data-full="https://catnipgames.net/blog/images/harvest-swing-ring-track.png" alt="The reworked harvesting swing meter over a Soltown street: a thin ring track with a red marker near the top sweeping toward a green target zone with a gold center, and the Meticulous Collection chain label in the middle of the ring">
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-09</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-headlines</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:52 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Harvesting became a game. Mining an ore vein, chopping a tree, foraging a plant, or skinning a carcass no longer means standing still while a bar fills: a needle sweeps a half-circle <b>swing meter</b>, and stopping it inside the gold wedge collects a bonus pull and re-arms a smaller, faster swing, chain after chain until a miss or the cap of 12. Skill still matters (gathering level widens the wedge, the meticulous skills slow its shrink), and ignoring the meter behaves exactly like the old harvest, so nothing was taken away from players who prefer to wait.</li>
        <li>Windmills now face the wind. The wind system always had a direction field, but the authored data kept it between zero and one degree in every weather type except storms, so every windmill top in the game pointed north. Wind now gets a real heading from the shared game clock: each map has its own prevailing wind that drifts around the full compass over an hour or two, gusts swing it harder in storms, every player sees the same direction, and windmill tops, ship flags, and wind turbines track it at a believable turn rate.</li>
        <li>A <b>tester hub</b> went live: a limited page for external testers with the launcher download, verification tasks, the player wish list, the balance audit, and server health. One checkbox on the accounts page now creates a tester account that works on the hub, the tracker, and in the game, and grants nothing else. By evening the hub gained a sortable tester leaderboard: every tester ranked by hours played on the Chaos shard, bugs reported, and tests completed, each with a last-7-days column and a running total, refreshed every 15 minutes. Late in the day a tester found the gap in it: bugs reported from inside the game earned no credit. Fixed the same evening; in-game reports now credit the reporter, and testers gained read access to the main bug project so they can find their own reports.</li>
        <li><b>Tavern games</b> reached feature-complete for version one. On top of yesterday's playable chess, checkers, and backgammon: every window string is now translated into all seven supported languages, the three games ship as game-table furniture you can place in your house or tavern, and <b>/roll</b> was moved to the server so a dice result can no longer be faked by a modified client. The tables themselves wait on a server data refresh before they can be handed out on the test shard; /roll is live there now.</li>
        <li>The chaos launcher connects again, and the shard now runs the new networking stack end to end. The morning's legacy-stack retirement exposed that the launcher's update channel still carried a client built before the cutover, so every install hung at "Connecting..." while a healthy server sat unreachable. The channel now delivers <b>build 30</b>, a client and server built from the same commit, and the publishing tools and security checks enforce that pairing from now on: a mismatched client is refused at publish time and flagged by the nightly checks. A follow-up caught that build 30 also went out as a clean player build, which dropped the tester tools and the developer console; the publisher now enforces the right build flavor too, and <b>build 31</b> shipped the same evening with the tools restored and verified in a live client session. The cutover also left the chat window filling with blank red "Server:" lines: the new stack marked every routine server reply with an empty debug note, and test builds print any note into chat. Replies without a note are silent again, and the fix rides the next build.</li>
        <li>Vendors on the Chaos shard sell again. Since the network cutover every vendor in every town showed an empty list: the search index that feeds the vendor window lost its data when the legacy virtual machine was retired, and the window trusted the healthy but empty answer instead of falling back to the game server. The indexer now runs on the new stack and was refilled with 286,993 listings, and the nightly security checks now catch an empty index before players do.</li>
        <li>The <b>mirror flip</b> key for house decorations works properly now. Garden gnomes mirror upright instead of flipping into the ground, and by end of day 1,245 more decorations accept the flip (statues, trophies, portraits, columns, snowmen, road pavers, city walls), every one cleared by an automated safety audit of all 6,524 decoration items. A player wish list item from the official forums.</li>
        <li>Mail can now go to several friends at once. Pick friends in the send-mail window and one send delivers to all of them: each attached stack is split evenly between the recipients, the leftover stays in your bag, and gold and postage are charged per recipient, with a preview of the exact split before anything sends. Limited to your friends list. A player wish list item from the official forums.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Harvesting: Added a swing meter to resource gathering. Harvesting an ore vein, tree, plant, or…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-1b8780e5d500</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:51 -0500</pubDate>
      <description><![CDATA[Added a <b>swing meter</b> to resource gathering. Harvesting an ore vein, tree, plant, or carcass now shows a half-circle meter with a sweeping needle: press Space (or click) while the needle is inside the gold wedge to collect a bonus pull and start the next swing. Every hit grants one bonus, and each hit shrinks the wedge and speeds up the next sweep, so deep chains take real timing. A chain ends on a miss or at 12 hits.]]></description>
    </item>
    <item>
      <title>Harvesting: Skills feed the meter. Gathering level widens the target wedge and shortens the sweep…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-da4992b389db</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:50 -0500</pubDate>
      <description><![CDATA[Skills feed the meter. Gathering level widens the target wedge and shortens the sweep, and the Meticulous Collection skills now slow how fast the wedge shrinks between hits instead of rolling a hidden continuation chance, so the same skills that used to mean more random bonuses now mean longer reachable chains.]]></description>
    </item>
    <item>
      <title>Harvesting: Missing never costs what you earned. A miss or no input on the first swing falls back to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-89eb38da7f45</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:49 -0500</pubDate>
      <description><![CDATA[Missing never costs what you earned. A miss or no input on the first swing falls back to the old random bonus roll, so ignoring the meter gives exactly the old harvesting experience; a miss later in the chain ends it with all collected loot kept, and the missed swing itself pays nothing.]]></description>
    </item>
    <item>
      <title>Harvesting: The swing key is rebindable (Harvest Swing under Options, Space by default). Jumping and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-da977aea7d82</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:48 -0500</pubDate>
      <description><![CDATA[The swing key is rebindable (Harvest Swing under Options, Space by default). Jumping and attacking are suspended while a swing is live so the same key and mouse button serve the meter, and moving still cancels a harvest exactly as before. Fishing, watering, and breakables are unchanged.]]></description>
    </item>
    <item>
      <title>Harvesting: A settings switch on the data side can restore the old wait-timer behavior instantly if…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-f86687759382</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:47 -0500</pubDate>
      <description><![CDATA[A settings switch on the data side can restore the old wait-timer behavior instantly if testing turns up trouble. 12 new automated tests pin the meter math. Not on the test shard yet; it rides the next build.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Launched a tester hub : a small page for external testers with the game launcher…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-22f0103f32cc</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:46 -0500</pubDate>
      <description><![CDATA[Launched a <b>tester hub</b>: a small page for external testers with the game launcher download, their verification task list, the player wish list, the combat balance audit, and the server health view. A new tester account flag gates it; a tester reaches exactly those pages and nothing else behind the portal login.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Tester onboarding is one checkbox on the accounts page. Ticking tester creates everything…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-56cba55e457e</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:45 -0500</pubDate>
      <description><![CDATA[Tester onboarding is one checkbox on the accounts page. Ticking tester creates everything the person needs: hub access, a tracker login, and a playable game account. Unticking it shuts off the hub immediately and leaves the rest to their own checkboxes.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Added tracker cards to the dev portal: the tracker itself, the open task list, the player…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-40b75e709824</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:44 -0500</pubDate>
      <description><![CDATA[Added tracker cards to the dev portal: the tracker itself, the open task list, the player wish list, and the new verification board.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Stood up a Tester Verification board on the tracker: the team files an item for each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-e863d0351fda</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:43 -0500</pubDate>
      <description><![CDATA[Stood up a <b>Tester Verification</b> board on the tracker: the team files an item for each change that needs a check on the test shard, a tester picks it up, tries it in the game, and posts the result as a comment. Testers see this board and the wish list; the main project stays private.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Fixed a bug that would have blocked every tester from the tracker: accounts created…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-382f76e612f8</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:42 -0500</pubDate>
      <description><![CDATA[Fixed a bug that would have blocked every tester from the tracker: accounts created through the accounts page were missing a name in the login directory, and the tracker rejects nameless users with an error page after sign-in. New accounts get names automatically now, and the 9 existing directory users were repaired the same way.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Extended the pre-deploy security checks to cover the new pages and re-ran the full suite…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-c2420dd4c15d</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:41 -0500</pubDate>
      <description><![CDATA[Extended the pre-deploy security checks to cover the new pages and re-ran the full suite: green, with anonymous visitors still locked out of every gated page.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Made verification tasks part of the definition of done: every change a tester could…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-a25488c6ae2f</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:40 -0500</pubDate>
      <description><![CDATA[Made verification tasks part of the definition of done: every change a tester could exercise now gets a task filed on the verification board in the same working session, with a fixed template covering what changed in player terms, the build that carries it, numbered test steps, an expected-results checklist, and edge cases worth trying to break.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Added a leaderboard to the tester hub, above the buttons: every tester listed with hours…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-032b75146f55</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:39 -0500</pubDate>
      <description><![CDATA[Added a leaderboard to the tester hub, above the buttons: every tester listed with hours on the Chaos shard, bugs reported, and tests completed, each as a last-7-days column plus a running total, sortable by any column. It started the day as four aggregate tiles and grew into rankings by evening. A collector on the web box refreshes it every 15 minutes from the account directory, the game's own per-account play time counter, and the verification board.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Made the hours column count Chaos play only. The game's play time counter is a lifetime…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-0dc595154466</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:38 -0500</pubDate>
      <description><![CDATA[Made the hours column count Chaos play only. The game's play time counter is a lifetime value, and accounts imported from the live-game data snapshot arrived with thousands of live hours on it, so the collector now keeps its own sample history and shows the growth since tracking began rather than the raw counter. A data reseed that rewinds the counter resets that tester's history cleanly.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Bug and completed-test credits come from the tracker: a bug counts for whoever filed it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-729f04207541</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:37 -0500</pubDate>
      <description><![CDATA[Bug and completed-test credits come from the tracker: a bug counts for whoever filed it, and a completed test counts for the testers who posted results on it before the team closed it.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: A tester caught the leaderboard missing credit for bugs reported from inside the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-dd7760ec1c4c</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:36 -0500</pubDate>
      <description><![CDATA[A tester caught the leaderboard missing credit for bugs reported from inside the game. Those reports are filed by an automation account into the private bug project, so the board's whoever-filed-it rule never matched a tester. The in-game reporter now looks up the reporting account's game name and stamps it on the issue in a new Reported by field, and the leaderboard counts that field first, so a bug reported from the game credits the right tester. The tester's three existing reports were credited retroactively, verified end to end with a fresh in-game report, and the board caption now says bugs reported in the game or on the board both count.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Tightened web access to two tiers: the dev portal is now admin only, and testers see…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-65387419c971</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:35 -0500</pubDate>
      <description><![CDATA[Tightened web access to two tiers: the dev portal is now admin only, and testers see exactly the tester hub, server health, and the balance audit. The old catch-all access group that every new account used to receive is retired and was stripped from all accounts.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Flagging an account as Admin on the accounts page now carries web access with it: one…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-654f5994a893</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:34 -0500</pubDate>
      <description><![CDATA[Flagging an account as Admin on the accounts page now carries web access with it: one checkbox grants the portal, the tester hub, and membership on the main tracker project, and unflagging takes them away again. Tracker membership reconciles automatically every 15 minutes.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: New accounts with tracker access get their tracker account created at creation time…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-5080ad95410e</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:33 -0500</pubDate>
      <description><![CDATA[New accounts with tracker access get their tracker account created at creation time instead of on their first sign-in, so a new tester or admin can be handed working links immediately.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: The Tester Verification button on the hub and the dev portal now shows how many…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-0e9489df6d98</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:32 -0500</pubDate>
      <description><![CDATA[The Tester Verification button on the hub and the dev portal now shows how many verification tasks are open, so a tester can see at a glance whether there is work waiting. The count refreshes with the leaderboard every 15 minutes.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: Added an "Open links in a new window" checkbox to the hub and the dev portal. The choice…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-3cc8dbc278cf</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:31 -0500</pubDate>
      <description><![CDATA[Added an "Open links in a new window" checkbox to the hub and the dev portal. The choice is remembered per machine in the browser and applies to every button on the page.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; tester hub: A tester reported the expected-results checkboxes on verification tasks cannot be ticked…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-8acffbe0d6cd</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:30 -0500</pubDate>
      <description><![CDATA[A tester reported the expected-results checkboxes on verification tasks cannot be ticked; the tracker only lets a task's author edit them. All 32 open tasks now ask testers to copy the checklist into their comment with PASS or FAIL on each line, and new tasks use that format from the start. The board-games task also got corrected steps to match what the current test build can exercise.]]></description>
    </item>
    <item>
      <title>Tracker: Added one-click Close and In Progress buttons to every tracker issue page, next to Edit…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-e985aef0ec5e</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:29 -0500</pubDate>
      <description><![CDATA[Added one-click <b>Close</b> and <b>In Progress</b> buttons to every tracker issue page, next to Edit. Close asks for an optional note first and files it as a comment on the issue; In Progress also assigns the issue to whoever clicked it, when nobody owns it yet.]]></description>
    </item>
    <item>
      <title>Tracker: The buttons follow the same permissions as a manual edit: someone without the right to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-05f14dcbba16</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:28 -0500</pubDate>
      <description><![CDATA[The buttons follow the same permissions as a manual edit: someone without the right to make a status change does not see them, and the button for the status the issue is already in stays hidden.]]></description>
    </item>
    <item>
      <title>Tracker: Packaged the tracker theme install as a one-command server recipe so the styling and the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-400fe84fadee</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:27 -0500</pubDate>
      <description><![CDATA[Packaged the tracker theme install as a one-command server recipe so the styling and the new buttons survive container updates.]]></description>
    </item>
    <item>
      <title>Tracker: Opened the buttons up to testers on the verification board: taking a task marks it In…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-4a954491ae3d</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:26 -0500</pubDate>
      <description><![CDATA[Opened the buttons up to testers on the verification board: taking a task marks it In Progress and assigns it to them, and closing it asks for the result note. Testers get exactly those two moves and only on that board; the wish list and the main project are unchanged.]]></description>
    </item>
    <item>
      <title>Tracker: Testers can now read the main bug project. A new read-and-comment role, granted…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-1ff4fd8425af</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:25 -0500</pubDate>
      <description><![CDATA[Testers can now read the main bug project. A new read-and-comment role, granted automatically to every tester account, lets a tester find the bug they reported from the game, check whether something is already known before re-reporting it, and answer follow-up questions from the team. It covers ordinary issues only; anything marked private stays hidden, so sensitive reports go in as private issues from now on.]]></description>
    </item>
    <item>
      <title>Tavern games: Made /roll server-authoritative. The command used to roll on your own machine and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d08faea816b7</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:24 -0500</pubDate>
      <description><![CDATA[Made <b>/roll</b> server-authoritative. The command used to roll on your own machine and announce the number, which a modified client could fake; the roll now happens on the server with its own random generator and is broadcast to everyone nearby, so a wagered roll can be trusted. The chat wording and range are unchanged for players, single-player offline keeps working, and the change is additive so it deploys without breaking older clients.]]></description>
    </item>
    <item>
      <title>Tavern games: Translated the game window into German, Spanish, French, Italian, Portuguese, Russian…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-383d6a7b03d7</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:23 -0500</pubDate>
      <description><![CDATA[Translated the game window into German, Spanish, French, Italian, Portuguese, Russian, and Simplified Chinese, reusing each language's existing terms for the game names and actions. No more English-only board games.]]></description>
    </item>
    <item>
      <title>Tavern games: Added three placeable game tables as furniture: a wooden table with the board on top for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-b3d2c8e74d9f</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:22 -0500</pubDate>
      <description><![CDATA[Added three placeable <b>game tables</b> as furniture: a wooden table with the board on top for chess, checkers, and backgammon. Place one like any decoration, interact to open the board, and the game is bound to that specific table so two tables on a lot never mix up their games. Player-placed tables are for playing each other; computer opponents arrive later with the fixed tavern tables.]]></description>
    </item>
    <item>
      <title>Tavern games: Learned, and wrote down, why the editor kept blocking a tool script mid-run: the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-c7b6ce50608b</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:21 -0500</pubDate>
      <description><![CDATA[Learned, and wrote down, why the editor kept blocking a tool script mid-run: the game guards against deleting item templates because that would orphan references in saved games, and it enforces it with a popup. A brand-new template nobody owns yet is safe to remove, but the guard does not make that distinction, so the tooling now updates templates in place and never deletes.]]></description>
    </item>
    <item>
      <title>Tavern games: Tried to hand the new game tables to testers on the test shard and found they cannot…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-e7e4538ed1ef</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[Tried to hand the new game tables to testers on the test shard and found they cannot exist there yet: the server's item data snapshot is two days older than the tables, so the server refuses to create them even though the code shipped. A data refresh is prepared and rides the next server update. The tester task now separates what is testable today (the server-rolled /roll command) from what waits on the refresh.]]></description>
    </item>
    <item>
      <title>Vendors: Fixed vendors showing no entries in every scene on the Chaos shard. The vendor window is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-8e7cb7493072</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[Fixed vendors showing no entries in every scene on the Chaos shard. The vendor window is fed by a search index, and the indexer that keeps it current (<b>VendorSync</b>) ran inside the retired legacy virtual machine: when that machine's game database was wiped ahead of the reseed, the indexer's reconciliation emptied the index to match, and the machine's retirement the next day killed the indexer itself. Rebuilt the pipeline on the new stack, refilled the index with 286,993 listings in 39 seconds, and verified a new listing becomes searchable within 4 seconds and a removed one disappears as fast.]]></description>
    </item>
    <item>
      <title>Vendors: The vendor window only falls back to asking the game server when the search service…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d5d286c7c748</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[The vendor window only falls back to asking the game server when the search service errors, so a healthy but empty index looked like a world with no vendor stock while every status light stayed green. The pre-deploy security checks now fail when the index is empty while the game database holds listings, and warn when the indexer service is not running.]]></description>
    </item>
    <item>
      <title>Vendors: Public vendor listings on the Chaos shard now last 30 days. The deployed rules still…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d233ee15cae9</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[Public vendor listings on the Chaos shard now last 30 days. The deployed rules still carried a 20-minute development value, and a background sweep was deleting every public vendor listing 20 minutes after it was created, including everything a data reseed restores (the items go back to their owners by mail). Player vendors were never affected by this one.]]></description>
    </item>
    <item>
      <title>Mail: Added multi-recipient mail from the player wish list: select several friends in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-68034ac251e0</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Added <b>multi-recipient mail</b> from the player wish list: select several friends in the send-mail window (Ctrl or Shift click), attach item stacks and gold as usual, and one send delivers to everyone. Each stack is split evenly between the recipients and the remainder stays with the sender; enclosed gold and postage are charged per recipient. A confirmation shows the exact per-recipient split and total cost before anything sends.]]></description>
    </item>
    <item>
      <title>Mail: Recipients are limited to mutual friends and capped at 20 per send, and the server checks…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-9efe8ce37c1a</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[Recipients are limited to mutual friends and capped at 20 per send, and the server checks every recipient before anything moves: one full mailbox or ended friendship cancels the whole send, and the window names which recipient blocked it. A stack too small to give every recipient at least one is rejected up front, which also covers single unstackable items.]]></description>
    </item>
    <item>
      <title>Mail: Not on the test shard yet; it rides the next build. The stack-splitting and postage rules…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-17ab99bcf578</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[Not on the test shard yet; it rides the next build. The stack-splitting and postage rules are pure shared logic covered by 17 automated editor tests.]]></description>
    </item>
    <item>
      <title>Test server: Investigated the test server showing 93% memory used and found three causes: the retired…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-5ee46a9e0de1</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[Investigated the test server showing 93% memory used and found three causes: the retired legacy stack's virtual machine still held its full 32 GB reservation, the new stack's database cache had swelled to 37 GB during Tuesday's data reseed (the dataset itself is 15 GB) and never returns memory on its own, and the host's file cache had no ceiling either.]]></description>
    </item>
    <item>
      <title>Test server: Shut the legacy virtual machine down and halved its allocation for any future revival…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-312e8a36881a</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Shut the legacy virtual machine down and halved its allocation for any future revival. Its game data had already been wiped for the reseed and nothing had connected to it since, so the old stack going dark is intentional and reversible in about a minute.]]></description>
    </item>
    <item>
      <title>Test server: Put hard ceilings on the database cache and the file cache, and wrote the caps into the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-7c7fcd498a38</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Put hard ceilings on the database cache and the file cache, and wrote the caps into the bring-up script and runbooks so future setups inherit them. Memory settled at 33% used, all 8.8 million database records verified intact, and a full login test against the new stack passed afterward.]]></description>
    </item>
    <item>
      <title>Server health page: Investigated the health page's two yellow tiles and traced both to the legacy stack's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-b52a1a3a1551</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Investigated the health page's two yellow tiles and traced both to the legacy stack's retirement. The inter-server drop counter was counting seven orphaned worker processes left behind by Tuesday's shutdown, still retrying their stopped master every two seconds, and the unreachable game port was that stopped master's login listener. Neither reflected the serving stack, which was healthy the whole time.]]></description>
    </item>
    <item>
      <title>Server health page: Re-pointed the page at the all-Linux cluster it should have been watching. The old…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-bc48b29149fc</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Re-pointed the page at the all-Linux cluster it should have been watching. The old virtual-machine tiles are gone, a new cluster group checks that all seven server processes are running and their client listeners are bound, and the outside-in reachability probe now speaks the new stack's protocol family instead of testing retired ports.]]></description>
    </item>
    <item>
      <title>Server health page: Discovered the new stack had never shipped a log line to the on-box search cluster: its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-fd801a4340a0</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Discovered the new stack had never shipped a log line to the on-box search cluster: its logging config still pointed at an unreachable address from the old office network. Repointed it (a hot reload, no restart), which restored the error-rate, drop-counter, and player-count tiles and lit up the server metrics dashboard for the serving stack for the first time. The deploy script now applies the repoint automatically and refuses to start if it ever regresses.]]></description>
    </item>
    <item>
      <title>Server health page: Broadened the dropped-connection detector so it recognizes both the legacy stack's error…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-9ac7e14655f3</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Broadened the dropped-connection detector so it recognizes both the legacy stack's error format and the new stack's, and updated the security posture checks for a world without the virtual machine: its checks now skip cleanly, and any leftover forwarding rule from the old setup gets flagged for review instead of silently allowed.]]></description>
    </item>
    <item>
      <title>Server health page: Verified the result end to end: every tile green on live data, log and metric streams…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-c0017d5c7fa8</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Verified the result end to end: every tile green on live data, log and metric streams flowing, and a credentialed login test against the shard passing from the outside. The whole change shipped without restarting the game cluster.]]></description>
    </item>
    <item>
      <title>Weather &amp; windmills: Gave the wind a real direction. Windmill houses and windmill decorations were already…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-53d6225862f8</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Gave the wind a real direction. Windmill houses and windmill decorations were already wired to turn their tops toward the wind, but the authored wind direction data sat between zero and one degree for every weather type except storms, so every windmill in the game pointed north. Direction is now computed from the game clock: each map gets its own prevailing heading, the heading drifts around the full compass over an hour or two, and gusts swing it harder in heavy wind and storms.]]></description>
    </item>
    <item>
      <title>Weather &amp; windmills: Every player sees the same wind. The old path rolled the direction per machine; the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d65fc3ccaab1</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Every player sees the same wind. The old path rolled the direction per machine; the new one derives it from the shared game clock and the map name, so two players watching the same windmill see the same heading with no network traffic added. Trees, drifting clouds, and blowing particles read the same value, so the whole scene agrees on which way the wind blows.]]></description>
    </item>
    <item>
      <title>Weather &amp; windmills: Windmill tops now swing at a capped turn rate instead of snapping to the new heading…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-061e55b06549</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Windmill tops now swing at a capped turn rate instead of snapping to the new heading every frame, and the rate no longer varies with frame rate. Ship flags on the galleon houses, air balloon teleporters, and the other wind-facing props pick the direction up through the same component.]]></description>
    </item>
    <item>
      <title>Weather &amp; windmills: Stopped windmill tops turning inside the store and inventory item preview window, where…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-aa316b5bc2ac</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Stopped windmill tops turning inside the store and inventory item preview window, where the constant re-aim fought the mouse rotation. Blades still spin in the preview, and placing a windmill in the world still aims it into the wind.]]></description>
    </item>
    <item>
      <title>Weather &amp; windmills: Six new automated tests pin the wind model: identical inputs give identical headings, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-e2853f8f7a08</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Six new automated tests pin the wind model: identical inputs give identical headings, the turn rate stays under a documented bound (including with a server clock millions of game hours past epoch), the full compass is covered over time, different maps get different prevailing winds, and gust strength scales as intended. Full suite green after the change, 575 for 575, plus a live check in the editor watching the heading drift smoothly with the wind zone tracking it exactly.]]></description>
    </item>
    <item>
      <title>Dev tooling: Built a reservation system so multiple AI coding sessions on one machine stop colliding…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-ae1ca349bdd5</guid>
      <pubDate>Thu, 09 Jul 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Built a reservation system so multiple AI coding sessions on one machine stop colliding in the Unity Editor. Every session drives the same editor; the first to touch it now holds a short lease, later arrivals wait up to two minutes and are then told to come back, and the lease frees itself after ten idle minutes, on session exit, or by hand.]]></description>
    </item>
    <item>
      <title>Dev tooling: The guard runs as a hook in front of every editor call and fails open: if anything in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-6d41e65d0c66</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[The guard runs as a hook in front of every editor call and fails open: if anything in the lock machinery breaks, the call goes through and the problem is logged, so a bug in the guard can never block editor access. A 23-check test suite covers acquisition races (20 simultaneous claimers, exactly one winner), stale-lease takeover, and corrupt-state recovery.]]></description>
    </item>
    <item>
      <title>Dev tooling: Verified it live: a second session's editor call waited, then received the reserved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-ace7e1f7cc83</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Verified it live: a second session's editor call waited, then received the reserved message naming the holder and its idle time, and a fresh session acquired, renewed, and auto-released the lease when it exited.]]></description>
    </item>
    <item>
      <title>Dev tooling: Taught the test bot to deliver items by in-game mail: a new command logs in with a staff…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-794ad425868f</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Taught the test bot to deliver items by in-game mail: a new command logs in with a staff account, looks the recipient up by character name, and has the server compose the mail, so test items can reach tester mailboxes without cutting a new build.]]></description>
    </item>
    <item>
      <title>Work blog: This work log now has an RSS feed at /blog/feed.xml , backfilled with the full history…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-40245f1991f6</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[This work log now has an RSS feed at <a href="https://catnipgames.net/blog/feed.xml">/blog/feed.xml</a>, backfilled with the full history. Every work item is its own feed entry, titled by its area, and each day also carries a headlines digest entry and an entry per screenshot gallery.]]></description>
    </item>
    <item>
      <title>Work blog: The feed rebuilds automatically on every publish and every blog page links it from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-5ea30c7e7050</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[The feed rebuilds automatically on every publish and every blog page links it from the header, so subscribing in any feed reader keeps up with new work without visiting the page.]]></description>
    </item>
    <item>
      <title>In-game tester tools: Locked the in-game developer console behind the game-admin account flag. On test builds…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-fcb669015ef9</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Locked the in-game developer console behind the game-admin account flag. On test builds it used to open for any player who pressed the tilde key; now only admin-flagged accounts can open it, it closes itself if the flag goes away mid-session, and single-player offline mode still allows it since nothing there leaves the local machine. The <b>/gm</b> window already checked the same flag, so the two developer surfaces now match.]]></description>
    </item>
    <item>
      <title>In-game tester tools: Added a /tester chat command for tester accounts. It opens a window with the essentials…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-4a3ca18ccd7e</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Added a <b>/tester</b> chat command for tester accounts. It opens a window with the essentials for exercising a build: jump to any zone by name with type-ahead suggestions, set every skill to a chosen level or a single skill through a picker, duplicate whatever items are selected in an open inventory window, and open the verification task board in the browser.]]></description>
    </item>
    <item>
      <title>In-game tester tools: Tester access in the game rides the same account flag the accounts page already creates…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-aefe4460b30b</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Tester access in the game rides the same account flag the accounts page already creates: the one tester checkbox that grants the hub and tracker now also unlocks /tester on the player's next login, and unticking it takes the window away again.]]></description>
    </item>
    <item>
      <title>In-game tester tools: The server checks the tester flag again on its own side before honoring the item…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-dc384dccbb93</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[The server checks the tester flag again on its own side before honoring the item duplication, so the window is a convenience, not the permission.]]></description>
    </item>
    <item>
      <title>In-game tester tools: Nine new automated tests pin the access rules (who can open the console, /gm, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-8b05f3f53583</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Nine new automated tests pin the access rules (who can open the console, /gm, and /tester), the exact flag value the login system writes, and the window's wiring; the full suite stays green.]]></description>
    </item>
    <item>
      <title>Deco placement: Fixed the placement-mode mirror flip key for a player wish list request. The true mirror…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-417f496f432d</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Fixed the placement-mode <b>mirror flip</b> key for a player wish list request. The true mirror path had never been wired to a single item, so the few flippable decorations fell back to a rotation that tipped floor items upside down; garden gnomes buried head-first were the reported case. Gnomes now mirror upright, with details like the lantern swapping hands.]]></description>
    </item>
    <item>
      <title>Deco placement: Enabled the mirror flip on 120 more decorations: statues, trophies, ancient portraits…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-c4ed9931a318</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Enabled the mirror flip on 120 more decorations: statues, trophies, ancient portraits, classic columns, snowmen, and housewares. Symmetric pieces show little change; the asymmetric ones players asked for can finally face the other way.]]></description>
    </item>
    <item>
      <title>Deco placement: Every enabled item passed an automated safety audit of all 6,524 decoration items: static…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-fb46dba17187</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Every enabled item passed an automated safety audit of all 6,524 decoration items: static meshes only, collision shapes outside the mirrored part, visual roots centered on the mirror plane, no animated or interactive pieces. Items that used the old rotation flip on purpose (the upside-down painting, weapons crossed on walls) keep their behavior exactly.]]></description>
    </item>
    <item>
      <title>Deco placement: The audit ships as an editor tool with a CSV report and an apply mode, and a new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-a3b720ddb738</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[The audit ships as an editor tool with a CSV report and an apply mode, and a new automated test locks every flippable item to a valid mirror setup so future items cannot ship half-configured. The roughly 3,600 uncategorized decoration items wait for a follow-up batch after this one soaks on the test shard.]]></description>
    </item>
    <item>
      <title>Deco placement: The follow-up batch landed the same day: the remaining 1,125 audit-approved decorations…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-0a9cefc72805</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[The follow-up batch landed the same day: the remaining 1,125 audit-approved decorations (the uncategorized pile plus road pavers, city walls, and building blocks) are now flippable too, bringing the total to 1,250. The reaper statue mirrors its scythe to the other side, which is the exact statue example the original forum request asked for. Fixed a tool bug along the way where the bulk pass added the mirror markers but forgot to set the flip permission itself.]]></description>
    </item>
    <item>
      <title>Deco placement: What is left is the roughly 1,750 decorations the audit flagged for per-item work before…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-aef0e4f7e07e</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[What is left is the roughly 1,750 decorations the audit flagged for per-item work before they can mirror safely: meshes on the item root, collision shapes inside the mirrored part, or visual roots sitting off the mirror plane.]]></description>
    </item>
    <item>
      <title>Deco lights: Fixed placed home lights (torches, lanterns, lampposts, candles) going dark even when set…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-5a059d939cdf</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Fixed placed home lights (torches, lanterns, lampposts, candles) going dark even when set to stay lit. Yesterday's decoration culling pass hides distant decorations to speed up dense towns, and hiding a decoration also switched off the light it carries: a lantern went dark about 40 meters out, close enough to notice from your own yard, and the culling ignored a light's own never-fade setting. Testers reported it within a day.]]></description>
    </item>
    <item>
      <title>Deco lights: Decorations that carry a light are now left out of that culling entirely, so their lights…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-a831670d2306</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Decorations that carry a light are now left out of that culling entirely, so their lights keep the same fade distances they had before the performance pass; everything unlit is still culled for the performance win. A new automated test pins the exclusion. The fix rides the next Chaos build.]]></description>
    </item>
    <item>
      <title>Inventory &amp; vendors: Moving a multi-selected batch of items into a chest that cannot hold them all now stores…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-4a7130f07206</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Moving a multi-selected batch of items into a chest that cannot hold them all now stores what fits and hands back only the overflow, with a message counting how many items came back. Before, a single item that did not fit made the game refuse the entire drop. A player wish list request from the official forums.]]></description>
    </item>
    <item>
      <title>Inventory &amp; vendors: Items that combine into a stack the chest already holds never needed a free slot, so a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-1e5446c65880</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Items that combine into a stack the chest already holds never needed a free slot, so a full chest now accepts a drop of resources it already stores and merges them in; only items needing their own slot come back.]]></description>
    </item>
    <item>
      <title>Inventory &amp; vendors: Dragging a batch onto an NPC merchant's sell window now carts the sellable items and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-3c9e4378c778</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Dragging a batch onto an NPC merchant's sell window now carts the sellable items and skips the rest (locked, untradeable, or worthless pieces), with a chat note counting what was left out. One bad item no longer cancels the whole sale.]]></description>
    </item>
    <item>
      <title>Inventory &amp; vendors: Trades, mail attachments, and equipping from a drop keep the old all-or-nothing behavior…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-27755c1c7edb</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Trades, mail attachments, and equipping from a drop keep the old all-or-nothing behavior on purpose, since those flows track the whole set after the move. New automated tests pin the container-capacity rules the change relies on, and the full editor test suite stays green.]]></description>
    </item>
    <item>
      <title>Player wish list: Pets can now be told to stop using stun attacks, a player wish list ask from the official…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-39b6b17deb92</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Pets can now be told to stop using stun attacks, a player wish list ask from the official forums. A pet spamming weak stuns builds up the target's crowd control resistance, which made a group member's long stun fail to land. A new right-click option on a tamed or summoned pet, <b>Stop Using Stun Attacks</b>, makes the pet skip attacks that stun or knock down while keeping its normal attacks; the chat commands /pet nostuns and /pet usestuns do the same.]]></description>
    </item>
    <item>
      <title>Player wish list: The pet stun choice is saved per pet and survives resummoning and relogging. The menu…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-b2b18933b37f</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[The pet stun choice is saved per pet and survives resummoning and relogging. The menu entry only appears on pets that actually have a stunning attack: earth elementals and golems (the earthquake slam) and charging boars qualify, while a plain wolf turns out to have no stun at all, only a slowing bite, so wolves show no entry. The menu strings and chat feedback shipped in all seven supported languages.]]></description>
    </item>
    <item>
      <title>Player wish list: Added Tier and Episode columns to the teleport scroll's Select Destination window, a…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-f1217de20764</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Added Tier and Episode columns to the teleport scroll's Select Destination window, a player wish list ask from the official forums. Tier now shows the zone difficulty on its own ("5", "5+") in the same color coding as the summary text, and Episode shows EP-1 or EP-2 so groups can pick zones everyone can enter. The Episode entry turns orange when the account does not own Episode 2.]]></description>
    </item>
    <item>
      <title>Player wish list: Clicking the new Tier column header sorts zones by difficulty; the plain text sort would…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-e0254a2393a1</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Clicking the new Tier column header sorts zones by difficulty; the plain text sort would have put tier 10 ahead of tier 2. German translations for the new labels shipped with the change, and the other languages show English until the next translation pass.]]></description>
    </item>
    <item>
      <title>Player wish list: Rescanned the Wishlist Requests forum against the curated wish list. Five days on from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-4dbae9ebbca2</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Rescanned the Wishlist Requests forum against the curated wish list. Five days on from the last sweep, so the yield was small: added two housing and placement asks (garden bowers as wall decoration surfaces, and decoy doors for player dungeons) to the tracker, and refreshed several existing entries with current reply and view counts and new developer replies.]]></description>
    </item>
    <item>
      <title>Player wish list: Fixed ESC dismounting the rider while UI windows were open, a wish list ask from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-ac4159cd2a03</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Fixed ESC dismounting the rider while UI windows were open, a wish list ask from the official forums. ESC now closes open windows and dialogs first; pressing it again with nothing left to close dismounts as before. Binding a dedicated dismount key still disables ESC dismounting entirely.]]></description>
    </item>
    <item>
      <title>Compass: Made the compass direction letters readable under markers, a player wish list ask from…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-38ef2413480c</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Made the compass direction letters readable under markers, a player wish list ask from the official forums. The letters are part of the compass strip artwork and every point of interest icon drew on top of them, so in a town full of vendors or with several quests running the cardinal letters disappeared. A gold copy of the letters and tick marks now draws above all markers; markers stay visible around the glyphs since everything outside the letters is transparent.]]></description>
    </item>
    <item>
      <title>Compass: Press and hold on the compass still brings the classic white strip with its dark backing…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-4b8edb23ee8c</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Press and hold on the compass still brings the classic white strip with its dark backing to the front; the gold letters step aside while it is held so nothing draws twice.]]></description>
    </item>
    <item>
      <title>Compass: Added a Show POI Markers on Compass option, on by default. Turning it off hides…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-a2ff4478b277</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Added a <b>Show POI Markers on Compass</b> option, on by default. Turning it off hides discovered location, vendor, and lot markers on the compass for a clean strip. Task, destination, and resurrection markers always stay visible: quest markers already have their own toggle, destinations are somewhere the player explicitly asked to go, and a dead player needs to find an ankh. The map is unaffected.]]></description>
    </item>
    <item>
      <title>Compass: The option label and tooltip ship translated into all seven supported languages, and nine…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d78e83416906</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[The option label and tooltip ship translated into all seven supported languages, and nine new automated tests pin the setup: the letter overlay exists and stays wired, its color stays distinct from every marker color, press-to-front keeps hiding the overlay, and the option keeps its default and its saved-setting name.]]></description>
    </item>
    <item>
      <title>Localization pipeline: Found and documented a trap in the translation deploy while shipping the compass option…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-f5885dc6e8a8</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Found and documented a trap in the translation deploy while shipping the compass option strings: the shipped Spanish and Italian text packs contain translations that are missing from the translation database, so regenerating those two languages would silently strip live text from the game. The deploy for this change ran per language on the five languages that are in sync, and the pipeline docs now warn that Spanish and Italian need a database back-fill before their packs can be regenerated.]]></description>
    </item>
    <item>
      <title>Build pipeline: Client builds now pull the latest code before compiling, matching the step the server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-f099003a0b6a</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Client builds now pull the latest code before compiling, matching the step the server build already ran. This closes a gap where a build kicked off after new commits could compile slightly out-of-date source; a safety check that refuses stale source had already caught the case and stopped the build.]]></description>
    </item>
    <item>
      <title>Build pipeline: Repaired the nightly job that regenerates the town and scene data a server deploy ships…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-b1b6c52b681c</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Repaired the nightly job that regenerates the town and scene data a server deploy ships. A packaging change last week broke its final cleanup step, so it failed every night and deploys fell back to older data. The check now allows for the new layout and the job completes, keeping that data current.]]></description>
    </item>
    <item>
      <title>Scene analysis: Built a Scene Analysis browser for the dev portal: one page with a generated thumbnail…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-b42859f2c5f3</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Built a <b>Scene Analysis</b> browser for the dev portal: one page with a generated thumbnail card for each adventure and story scene (291 qualify; player towns and player dungeons are excluded), each card opening a detailed analysis page for that scene.]]></description>
    </item>
    <item>
      <title>Scene analysis: An editor tool walks the scenes and bakes the data: spawner count with average, median…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-e510c314592c</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[An editor tool walks the scenes and bakes the data: spawner count with average, median, and highest level, chest and merchant counts, quest givers and quest steps drawn from the quest tooling, every player entry point with a screenshot rendered from that exact spot at eye height, a card thumbnail, and a lighting summary with the time of day forced to noon.]]></description>
    </item>
    <item>
      <title>Scene analysis: Every scene also gets a clean-load test: errors and warnings the scene produces while…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-5b1c5ac6fe65</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Every scene also gets a clean-load test: errors and warnings the scene produces while loading are captured, de-duplicated with counts, listed on the detail page, and rolled up into a green, yellow, or red badge on the scene's card.]]></description>
    </item>
    <item>
      <title>Scene analysis: The detail page joins in two weeks of play data from the test shard: gold earned per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-c60f1610f14a</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[The detail page joins in two weeks of play data from the test shard: gold earned per player hour, average frame rate by player, zone load times, and visit counts. Two new measurements feed it: the server now records each scene's player count once a minute, and the client reports its frame rate once a minute while in a scene. Panels show a collecting-data note until those accrue; gold totals and zone load times populate from data the game already recorded.]]></description>
    </item>
    <item>
      <title>Scene analysis: Three pilot scenes are live now: Soltown (91 spawners, 19 quest givers), the Soltown…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-648b42c752a1</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Three pilot scenes are live now: Soltown (91 spawners, 19 quest givers), the Soltown Catacombs, and Vertas Pass (123 spawners, average level 55). The full sweep across all 291 scenes runs next; scenes appear on the page as they are baked.]]></description>
    </item>
    <item>
      <title>Scene analysis: Along the way, fixed the scene tool reading zone-in points from the wrong marker type…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-55388592452c</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Along the way, fixed the scene tool reading zone-in points from the wrong marker type (towns use the base spawn marker, not the subclass) and matched conversations through the NPC's conversation component because prefab file names do not match conversation names.]]></description>
    </item>
    <item>
      <title>Scene analysis: Reworked the screenshot capture after the first pass came out flat, shadowless, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-021e2ceb7f47</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Reworked the screenshot capture after the first pass came out flat, shadowless, and uniformly bright. Captures now render through the game's own camera rig with its post-processing stack, and the weather system that drives the game's authored lighting curves is initialized at the forced noon hour instead of bypassed. The three pilot scenes were re-baked: daylight, cast shadows, and tone now match what a player sees in the game.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Diagnosed the chaos launcher's game client hanging at "Connecting...": the update channel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-90ac867a598e</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Diagnosed the chaos launcher's game client hanging at "Connecting...": the update channel was still serving a client built four days before the networking cutover, dialing a connection path retired that morning, while the new server stack sat healthy the whole time. Watching the server's network traffic live confirmed the stuck client knocking on the old door with nothing answering.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Published build 30 to the update channel: the first launcher-delivered client on the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-87969b6c2ec5</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Published <b>build 30</b> to the update channel: the first launcher-delivered client on the new networking stack, built from the same commit as the server cluster it talks to. It is a large download because the build also moves the client to the precompiled runtime used for shipping.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Redeployed the server cluster from that same commit, which brings this week's gameplay…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d93983219267</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Redeployed the server cluster from that same commit, which brings this week's gameplay changes (partial chest drops, merchant batch selling, the tavern game tables, scene telemetry) to testers. Verified with a credentialed login test from outside and clean server logs after the restart.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: The server redeploy hit a build breakage first: the new table-game files compiled in the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-ac0d8c1bb2cd</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[The server redeploy hit a build breakage first: the new table-game files compiled in the main server build but were missing from the new stack's build list. The existing drift checker named the 12 missing files and the list is fixed; the nightly gate that watches for exactly this now covers the new feature.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Made the one-version rule mechanical. The publisher refuses to put a pre-cutover client…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-2938cedaabba</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Made the one-version rule mechanical. The publisher refuses to put a pre-cutover client on the chaos channel, the security preflight fails if the live channel ever serves one, and it warns when the channel's client and the deployed server come from different commits. All three checks were verified against the bad state (they fire) and the fixed state (they pass).]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Commented the build number on the seven waiting verification tasks and filed a new task…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-010375be29de</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Commented the build number on the seven waiting verification tasks and filed a new task covering the launcher update and login.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Traced a report that a developer account could not open the developer console on build…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-581ed166ae88</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Traced a report that a developer account could not open the developer console on build 30, while the GM tools worked fine for the same account. The account and its permissions were never the problem: build 30 went out as a clean player build, a flavor that leaves out the developer console, the tester tools window, and the test-automation hook at compile time, while the GM tools ship in every build behind a runtime permission check. The shard's intended flavor keeps those tools in and relies on the runtime checks added this week to keep them locked to the right accounts.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Closed the gap the same way as the one-version rule: the publisher now refuses a clean…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-aeee0260e5b6</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Closed the gap the same way as the one-version rule: the publisher now refuses a clean player build on the chaos channel (with a deliberate override for knowingly trialing one), and the security preflight warns when the live channel serves a build without the tester surface. Both were verified to fire on the bad flavor and pass on the right one.]]></description>
    </item>
    <item>
      <title>Chaos shard deploy: Published build 31 the same evening: the same game as build 30 with the tester and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-aa74ca5c7f05</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Published <b>build 31</b> the same evening: the same game as build 30 with the tester and developer tools compiled back in, client and server from one commit. Before it shipped, the artifact passed the networking self-test (7 of 7 checks) and a scan proving the tool code is present. After the channel switched over, the full security preflight came back green (52 checks, none failed), a credentialed login test passed, and a scripted client session on the shard confirmed the GM tools and the tester window open for a developer account.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Fixed the chat window filling with blank red "Server:" lines on the test shard. Test…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-d1081e9ed9ff</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Fixed the chat window filling with blank red "Server:" lines on the test shard. Test builds print any server reply's debug note into chat, and the new networking stack attached an empty note to every routine reply where the old stack sent none, so most actions produced a blank line. An absent note now stays absent end to end, and the chat echo skips blank text as a second guard. Real warnings still print.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Four new automated tests pin the reply format's debug-note round trip (absent, empty, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-02e021914071</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Four new automated tests pin the reply format's debug-note round trip (absent, empty, and real text), and the networking suites stay green, including the live check against the new server runtime. The fix reaches testers with the next chaos build.]]></description>
    </item>
    <item>
      <title>Legacy servers: Fixed the old QA shard's admin console, which had refused to connect since July 5. Its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-40e9dbaf3a29</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Fixed the old QA shard's admin console, which had refused to connect since July 5. Its message and MotD pages talk to a logging service on a separate machine, and that service had shut itself down: a periodic check it makes over a secure connection stopped working with the machine's outdated settings, so the service exited about a second after every start. Enabled current TLS settings on that machine and started the service; the console's QA pages load again, verified end to end.]]></description>
    </item>
    <item>
      <title>Legacy servers: Set the service to restart itself automatically if it stops again, and wrote the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-fa6ba26f194e</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Set the service to restart itself automatically if it stops again, and wrote the diagnosis and the fix recipe into the server reference docs, with a warning that the remaining legacy machines need the same settings before their next restart.]]></description>
    </item>
    <item>
      <title>Legacy servers: Documented a separate long-standing rule found during the diagnosis: the console's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-7e6198af8171</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Documented a separate long-standing rule found during the diagnosis: the console's command pages reject one class of sign-in by design on every environment, which is easy to mistake for the same outage. The message pages are unaffected.]]></description>
    </item>
    <item>
      <title>Crafting: Fixed the Only craftable checkbox at crafting stations never showing its check mark. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-68df93fb0a29</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Fixed the <b>Only craftable</b> checkbox at crafting stations never showing its check mark. The filter itself worked, but the check mark graphic was saved disabled inside the window layout, and the toggle only fades that graphic in and out, so the box always looked unticked. Reported by a tester on the verification board; the fix rides the next Chaos build.]]></description>
    </item>
    <item>
      <title>Crafting: A new automated test now checks the window layout keeps the check mark wired and enabled…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-67f0f146c5bd</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[A new automated test now checks the window layout keeps the check mark wired and enabled, so it cannot ship that way again.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-09</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-09-images</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/scene-analysis-grid.png" data-full="https://catnipgames.net/blog/images/scene-analysis-grid.png" alt="The Scene Analysis browser's card grid with the three pilot scenes: Soltown, Soltown Catacombs, and Vertas Pass, each with a generated thumbnail, tier, load-test badge, and content counts">
        <img src="https://catnipgames.net/blog/images/scene-analysis-soltown-detail.png" data-full="https://catnipgames.net/blog/images/scene-analysis-soltown-detail.png" alt="The Soltown detail page: content stat tiles, entry point screenshots with default badges, the lighting summary table, and the clean load-test result">
        <img src="https://catnipgames.net/blog/images/TesterHubStats.png" data-full="https://catnipgames.net/blog/images/TesterHubStats.png" alt="The tester hub as it looked at midday, with the first version of the stats area (aggregate tiles, later reworked into a per-tester leaderboard) above the launcher, verification, wish list, balance audit, and server health cards">
        <img src="https://catnipgames.net/blog/images/TesterHubOpenCount.png" data-full="https://catnipgames.net/blog/images/TesterHubOpenCount.png" alt="The tester hub cards with the new open-task count on the Tester Verification button">
        <img src="https://catnipgames.net/blog/images/WindmillHouseWindDirection.png" data-full="https://catnipgames.net/blog/images/WindmillHouseWindDirection.png" alt="The windmill village player house, whose cap and blades now turn to face the wind">
        <img src="https://catnipgames.net/blog/images/RedmineQuickActions.png" data-full="https://catnipgames.net/blog/images/RedmineQuickActions.png" alt="A wish list issue on the tracker with the new In Progress and Close quick-action buttons next to Edit">
        <img src="https://catnipgames.net/blog/images/RedmineCloseDialog.png" data-full="https://catnipgames.net/blog/images/RedmineCloseDialog.png" alt="The optional-note dialog that opens when closing an issue with the new Close button">
        <img src="https://catnipgames.net/blog/images/GnomeMirrorFlip.png" data-full="https://catnipgames.net/blog/images/GnomeMirrorFlip.png" alt="A garden gnome decoration before and after the mirror flip key: upright both ways, with the lantern swapping hands">
        <img src="https://catnipgames.net/blog/images/ReaperMirrorFlip.png" data-full="https://catnipgames.net/blog/images/ReaperMirrorFlip.png" alt="The reaper statue decoration normal and mirrored, the scythe swapping sides, which is the statue example the original forum request asked for">
        <img src="https://catnipgames.net/blog/images/TesterToolsBuild31.png" data-full="https://catnipgames.net/blog/images/TesterToolsBuild31.png" alt="The Tester Tools window open in a live client session on build 31: load zone, set skills, duplicate selected items, and the testing task board button">
        <img src="https://catnipgames.net/blog/images/CompassGoldCardinals.png" data-full="https://catnipgames.net/blog/images/CompassGoldCardinals.png" alt="The compass strip in Soltown with the direction letters in gold, the SW letters drawing over an NPC marker icon that used to hide them">
        <img src="https://catnipgames.net/blog/images/CompassPOIMarkersOption.png" data-full="https://catnipgames.net/blog/images/CompassPOIMarkersOption.png" alt="The Options window Interface tab with the new Show POI Markers on Compass checkbox directly under Show Task Highlighting">
        <img src="https://catnipgames.net/blog/images/HarvestSwingMeter.png" data-full="https://catnipgames.net/blog/images/HarvestSwingMeter.png" alt="The new harvesting swing meter over a silver vein in Vertas Pass: the white needle inside the gold target wedge with its brighter perfect zone, above the mining chance readout">
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-08</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-headlines</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[<ul>
        <li><b>Tavern games</b> went from idea to playable in one day. Research across other online games settled the design in the morning: server-enforced chess, checkers, and backgammon, free to play, with computer opponents. By night the whole system was built and the first real games ran end to end in the client against the real server: a 44-move checkers game, a chess game ending in checkmate, and a backgammon gammon, every move validated server-side. Screenshots below.</li>
        <li>The <b>Monty Python coconut gallop</b> is back. Equipping a coconut half in each hand once made your avatar ride an invisible steed; the 2020 mounts feature disconnected that code path and the emote had been dead in towns ever since. Held coconuts now ride the mount system's own coconut animations, and real mounts are untouched.</li>
        <li>Kicked off the <b>city performance pass</b>. Player towns are CPU-bound on the sheer count of small placed decorations, and a code investigation pinned the causes: distant decorations never dropped from rendering, redundant per-frame work in the culling and mouse-targeting systems, and draw batching switched off entirely in the shipping client. Measurement tooling landed first, so every coming fix ships with before and after numbers.</li>
        <li>The first measured baseline settled the biggest question in one day: with 3,000 real decorations in a controlled benchmark scene, about 95% of the decoration frame cost is the main thread submitting thousands of individual draw calls. Script overhead is under a millisecond, and the graphics card itself sits idle waiting. The fix priorities are now proven, not guessed: stop rendering far-away decorations, and let identical items share draw calls.</li>
        <li>Yesterday's build of the new-networking test client shipped unable to connect, and the cause was embarrassingly simple: the build machine's source tree was one commit behind, missing the change that bakes the connection settings into the client. The build tools now check for that before starting: a build from a tree that is missing pushed commits fails outright on the build farm and asks for confirmation in the editor, instead of silently spending hours producing a dud.</li>
        <li>Refreshed the networking test shard from a current, sanitized snapshot of live player data and ran the outstanding data migrations against it, so the new stack now runs against realistic world, item, and economy state. Database changes also gained a standing rule: log the needed migration in the same commit, enforced by a new check.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Tavern games: Researched how other online games do in-world parlor games before designing ours: Ultima…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-38df13bac504</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Researched how other online games do in-world parlor games before designing ours: Ultima Online's freeform boards (loved as decor, unplayable competitively), Final Fantasy XIV's Gold Saucer, Elder Scrolls Online's card game, Red Dead's poker and its country-by-country blocks, and Puzzle Pirates' server-dealt tables. The published court rulings on virtual-chip gambling shaped the biggest call: version one has no wagering of any kind.]]></description>
    </item>
    <item>
      <title>Tavern games: Wrote the implementation plan and added the epic to the roadmap: chess, checkers, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-0f0c0b27f497</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Wrote the implementation plan and added the epic to the roadmap: chess, checkers, and backgammon first, at game tables placeable on player lots and fixed in NPC taverns with a computer opponent, unranked and free, spectators supported. The server validates every move, turn, and outcome; the client is only a view. Card games and any stakes system are designed-for seams, deliberately deferred.]]></description>
    </item>
    <item>
      <title>Tavern games: Landed the wire contract and the first plumbing: a new table-games operation set on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-7ee11b0e5717</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Landed the wire contract and the first plumbing: a new table-games operation set on the game server (join, sit, ready, move, concede, draw, rematch, spectate, reset, add a computer opponent), the session state machine and complete checkers rules in the shared code both client and server compile, and the client-side manager that mirrors table state. Sessions key to the table object itself, so two players walking to the same table land in the same game.]]></description>
    </item>
    <item>
      <title>Tavern games: The rules layer sends each seat its own filtered view of the game from day one. For chess…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-682ed0245388</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[The rules layer sends each seat its own filtered view of the game from day one. For chess and checkers every view is identical, but the pipeline shape is what later lets poker deal hidden hole cards without changing the protocol.]]></description>
    </item>
    <item>
      <title>Tavern games: All three rules engines shipped complete with 85 automated tests: chess passes the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-8c279baa7efe</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[All three rules engines shipped complete with 85 automated tests: chess passes the standard move-generation reference counts through four levels deep (197,281 positions from the opening) plus castling, en passant, promotion, the fifty-move rule, and threefold repetition; checkers enforces mandatory captures and multi-jump chains; backgammon enforces the forced-play and higher-die rules with server-rolled dice. Each game also has a computer opponent with three difficulty levels, and a bad or buggy submission cannot corrupt a game: the server rejects anything that is not in its own list of legal moves.]]></description>
    </item>
    <item>
      <title>Tavern games: Played the first real games in the client tonight against a local run of the real server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-631f5778d37e</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Played the first real games in the client tonight against a local run of the real server: joined a table in the world, summoned a computer opponent, and played checkers (44 moves), chess (checkmate in 24), and backgammon (lost by a gammon, 48 turns) to completion, with rematches swapping who moves first. The game window handles seats, ready-up, turn indicators, draw offers, concede, rematch, and spectators.]]></description>
    </item>
    <item>
      <title>Tavern games: Sessions survive the messy cases by design: disconnecting mid-game reserves your seat for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-7c80ab7a8e59</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Sessions survive the messy cases by design: disconnecting mid-game reserves your seat for three minutes before it counts as abandonment, walking away from the table does not forfeit, and closing the window mid-game just hides it. A test-harness verb can drive whole games from scripts, which is how tonight's games were played.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-08</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-images</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/TavernGamesCheckersLive.png" data-full="https://catnipgames.net/blog/images/TavernGamesCheckersLive.png" alt="Checkers game in progress at a tavern table, played in the client against a computer opponent">
        <img src="https://catnipgames.net/blog/images/TavernGamesChessLive.png" data-full="https://catnipgames.net/blog/images/TavernGamesChessLive.png" alt="Chess game at a tavern table ending in checkmate by the computer opponent">
        <img src="https://catnipgames.net/blog/images/TavernGamesBackgammonLive.png" data-full="https://catnipgames.net/blog/images/TavernGamesBackgammonLive.png" alt="Backgammon board at game end, computer opponent winning by a gammon">
      </div>]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Diagnosed why the freshly built test client could not connect: the build machine's tree…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-febaf6398fc0</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Diagnosed why the freshly built test client could not connect: the build machine's tree was one commit behind the push that bakes the new-stack connection settings, so the client dialed the old stack's port with no server identity key and failed closed. The client's own log told the whole story in two lines.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Added a staleness gate to the chaos build tools: before any build starts, the tree is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-cfb0da1eeac5</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Added a staleness gate to the chaos build tools: before any build starts, the tree is checked against the pushed branch; a tree missing pushed commits fails the build on the farm (with an explicit override switch for deliberate cases) and asks first in the editor. Trees that are ahead for local experiments still build, and offline builds still work when the check cannot reach the server.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): A corrected build is running from the updated tree; it gets verified end to end (bare…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-e06ddc17d5cc</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[A corrected build is running from the updated tree; it gets verified end to end (bare launch, login, world entry) before it goes anywhere near the patch channel.]]></description>
    </item>
    <item>
      <title>Client performance: Investigated why player-town scenes are CPU-bound. The decoration objects themselves are…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-655fcdc4bfd2</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Investigated why player-town scenes are CPU-bound. The decoration objects themselves are cheap; the cost lives around them: no system that stops rendering far-away decorations, the culling manager re-reading positions of objects that never move, the mouse-targeting ray tested against the whole decoration collider soup every frame (even with the cursor parked over a window), and the shaders and most materials ready for GPU instancing that nothing ever enables.]]></description>
    </item>
    <item>
      <title>Client performance: Wrote the phased fix plan: measurement first, then the low-risk fixes, each gated on…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-1008791dc1c6</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Wrote the phased fix plan: measurement first, then the low-risk fixes, each gated on captured numbers. One finding reshaped it: the rule that keeps a player town's central plot always loaded is load-bearing (its items are what spawn every claimed lot), so the eventual "do not even create far-away town decorations" change is designed but deferred until the cheaper fixes show what headroom is left.]]></description>
    </item>
    <item>
      <title>Client performance: Landed the measurement kit: timing markers through the decoration load and culling path…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-c44b735a3245</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Landed the measurement kit: timing markers through the decoration load and culling path, a capture recorder that logs frame-time and engine-subsystem percentiles for before/after comparisons, an audit tool that inventories every decoration prefab (which animation scripts it carries, which materials cannot batch), and a builder that generates a repeatable synthetic benchmark town from real decoration prefabs, no server needed.]]></description>
    </item>
    <item>
      <title>Client performance: Audited all 6,209 unique decoration prefabs. It corrected an assumption: animated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-18e801ed1015</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Audited all 6,209 unique decoration prefabs. It corrected an assumption: animated decorations are rare (158 animation scripts total, mostly moondials and windmills), so the planned per-object animation work moved down the list. The real weight is elsewhere: 46,621 colliders across the prefab set, 7,319 particle systems, and 626 prefabs carrying materials with GPU instancing switched off.]]></description>
    </item>
    <item>
      <title>Client performance: Captured the first baseline: 3,000 decorations in the benchmark scene cost 27.9 ms per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-b28f818d0162</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Captured the first baseline: 3,000 decorations in the benchmark scene cost 27.9 ms per frame, and 26.6 ms of that is the main thread pushing roughly 6,500 draw batches. A one-decoration control scene isolated the number, and a graphics-wait probe confirmed the GPU is not the bottleneck. Two harness defects were fixed on the way (a stats recorder that was created but never started, and game-logic scripts on benchmark decorations throwing without the game's bootstrap).]]></description>
    </item>
    <item>
      <title>Client performance: The benchmark scene itself: a seeded grid of three thousand real decorations, from dragon…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-62a23c2f1914</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[The benchmark scene itself: a seeded grid of three thousand real decorations, from dragon trophies to potted palms, built in one click and identical on every run.]]></description>
    </item>
    <item>
      <title>Client performance: First fix landed: deleted twelve empty per-frame Update methods left over from script…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-59e5e688925d</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[First fix landed: deleted twelve empty per-frame Update methods left over from script templates. The engine pays a native-to-managed call for every declared Update even when the body is empty, and these rode common objects like nameplate status panels and vendor shout triggers.]]></description>
    </item>
    <item>
      <title>Client performance: The culling system now knows that placed decorations do not move. It re-read the position…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-eb6c20239828</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[The culling system now knows that placed decorations do not move. It re-read the position and bounds of every registered object every frame to keep its spheres current; objects flagged static (decorations, houses) are skipped, a slow five-second sweep self-heals anything mis-flagged, and dragging a decoration flips it back to dynamic until placement finishes. The sweep also stopped re-scanning the same list multiple times within one frame.]]></description>
    </item>
    <item>
      <title>Client performance: Mouse targeting stopped paying for a full-scene ray test every frame. The ray only…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-7adb3dc53784</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Mouse targeting stopped paying for a full-scene ray test every frame. The ray only re-runs when the cursor or camera actually moved (or on a short tunable interval so objects moving under a parked cursor still update), and it skips entirely while the cursor sits over a window. Hover feel is unchanged: any movement re-tests the same frame.]]></description>
    </item>
    <item>
      <title>Client performance: Nameplates that faded out at distance now re-check only a few times a second instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-d7915e399dfd</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Nameplates that faded out at distance now re-check only a few times a second instead of every frame, spread across frames so crowds of vendor plates do not check in lockstep, with a small hysteresis so a plate at the exact fade boundary cannot flicker.]]></description>
    </item>
    <item>
      <title>Client performance: Creating a placed decoration used to walk its object hierarchy about fifteen separate…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-d0ffaad34398</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Creating a placed decoration used to walk its object hierarchy about fifteen separate times looking for different component types; it now walks it twice (the game can modify the hierarchy midway through setup, so once is not safe). Eight new tests pin the replacement to the exact old semantics, including two obscure engine rules the rewrite had to reproduce. The full editor test suite passes, 410 for 410. This trims the per-item cost of streaming a lot&rsquo;s decorations in.]]></description>
    </item>
    <item>
      <title>Client performance: The big one landed: placed decorations now stop rendering at distance. Every placed item…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-d97fb28c5c04</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[The big one landed: placed decorations now stop rendering at distance. Every placed item registers one bounding sphere with a new dedicated culling system; small furniture stops drawing past 40 m, larger pieces at 75 or 120 m, and only structures render out to 200 m, with all distances live-tunable and a kill switch. Only the rendering is culled: colliders, interactions, and server updates keep working on a hidden item, and landmarks players steer by (lot markers, buildings, vendors, teleporters, pets) never hide. Eleven new tests pin the bookkeeping; the before/after capture on the benchmark scene is next.]]></description>
    </item>
    <item>
      <title>Client performance: Measured the culling on the benchmark scene, and the honest result is a modest win there…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-7406c33f4c26</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Measured the culling on the benchmark scene, and the honest result is a modest win there: draw batches dropped about 7% on a wide 380 m layout and frame time about 3%. The reason is instructive: many prefabs carry the engine's own screen-size level-of-detail culling, which already stops drawing far small items in a synthetic overhead view. The real test is a live player town at eye level, where most placed items have no such setup; that capture runs once the next test-shard build carries the new recorder. The measurement session also hardened the benchmark tooling against duplicated automation calls that could half-wire a scene.]]></description>
    </item>
    <item>
      <title>Client performance: Switched on GPU instancing for 496 decoration materials that supported it but never opted…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-128a693db0b9</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Switched on GPU instancing for 496 decoration materials that supported it but never opted in (about 3,900 sibling materials already had it). A new editor tool found them through the decoration catalog, checked each shader actually compiles instancing support, and flipped exactly one line per material file. Measured on the dense benchmark view: 13% fewer draw batches and 12% less main-thread render time, about 3 ms a frame back. Dyed items keep their colors; the shader family stores dye per instance.]]></description>
    </item>
    <item>
      <title>Gameplay fixes: Restored the coconut gallop emote. Holding a coconut half in each hand is meant to play…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-12ddd5344ebb</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Restored the coconut gallop emote. Holding a coconut half in each hand is meant to play the pretend-horse gallop everywhere; the September 2020 mounts change removed the code that put coconut holders into the pretend-mount state and repurposed that state for real mounts, so the emote only survived on the overworld map. Held coconuts now enter the mount state through the mount system's coconut animation set, which shipped with mounts but was only reachable from the summonable coconut mount item.]]></description>
    </item>
    <item>
      <title>Gameplay fixes: Tightened a mount-era animator ejection so it cannot kick a coconut holder out of the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-b4c934562d93</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Tightened a mount-era animator ejection so it cannot kick a coconut holder out of the overworld gallop during scene transitions, and taught the mount state to handle a rider with no mount item: movement unlocks immediately and the horse-sized collision volume stays off.]]></description>
    </item>
    <item>
      <title>Gameplay fixes: Added editor tests that pin the coconut animator wiring in both player animator…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-5ca6bf7f03e2</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Added editor tests that pin the coconut animator wiring in both player animator controllers: the coconut dispatch in the mount hub, the overworld gallop entries, and the ejection guard's coconut exemption. Verified the full flow by simulating the animator in the editor: equip, idle, gallop while moving, and clean dismount back to normal locomotion.]]></description>
    </item>
    <item>
      <title>Gameplay fixes: Wrote up a test-runner quirk found during the coconut work: the editor test tool's class…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-9c175d5d5fc5</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Wrote up a test-runner quirk found during the coconut work: the editor test tool's class and method filters can miss fixtures whose tests are all parameterized. The test docs now carry the workarounds, running by namespace or invoking the fixture directly.]]></description>
    </item>
    <item>
      <title>Database and test data: Refreshed the networking test shard with a current, sanitized copy of live player data…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-f463f9da1107</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Refreshed the networking test shard with a current, sanitized copy of live player data, so the new stack gets exercised against realistic world, item, and economy state instead of a handful of test accounts. Payment records, credential caches, and last-login IPs are stripped before the data leaves the source and re-checked on the target.]]></description>
    </item>
    <item>
      <title>Database and test data: Brought that older snapshot up to the current build by running two data migrations…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-e8492c2b0d32</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Brought that older snapshot up to the current build by running two data migrations against it: the gold-crown normalization that lets crown stacks from every source merge again, and the pet-bag cleanup that clears orphaned entries able to bloat a character's pet list.]]></description>
    </item>
    <item>
      <title>Database and test data: Tightened the process behind those migrations. Any change to a database record…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-d1a38d0b7b3c</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Tightened the process behind those migrations. Any change to a database record, collection, index, or data backfill now has to add an entry to the migration log in the same commit, and a new check flags a database change that ships without one. That log is what tells you which migrations an older data snapshot needs.]]></description>
    </item>
    <item>
      <title>Database and test data: Wrote up the whole test-shard reseed and migration procedure in the ops runbook…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-a6d37acf7561</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Wrote up the whole test-shard reseed and migration procedure in the ops runbook, including the parts that fought back this time, so the next refresh is a recipe rather than a re-derivation.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-08</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-08-images-2</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        <img src="https://catnipgames.net/blog/images/DecoBenchmarkScene.png" data-full="https://catnipgames.net/blog/images/DecoBenchmarkScene.png" alt="Synthetic deco benchmark scene: 3,000 real decoration prefabs in a seeded grid, viewed from the fixed overlook camera">
        <img src="https://catnipgames.net/blog/images/CoconutGallopPose.png" data-full="https://catnipgames.net/blog/images/CoconutGallopPose.png" alt="Editor render of the avatar mid clip-clop, sampled from the restored coconut gallop animation">
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-07</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-headlines</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The <b>Photon replacement</b> crossed its biggest line yet: the entire game backend ran on the new networking stack for the first time, every service up as its own process against real game data, registering with each other over the new authenticated internal links. The automated test bot then passed its full conformance suite against it, all forty-seven modes, zero failures: logins, characters, gameplay, banking, mail, vendors, crafting, chat, parties, guilds, trade, duels, and matchmaking, end to end over the new wire.</li>
        <li>The replacement stack then went live on the test shard's server: the whole seven-service backend running natively on Linux beside the still-serving current stack. By evening a real player was in the world on it, from a home internet connection with a normal account login. Character creation, the tutorial with quests advancing, and a zone change into Brittany, over twenty minutes of play on the new wire with zero server errors. The test build is now turnkey, so invited testers just run the game.</li>
        <li>An experimental <b>Ultima mode</b> went into the client: flip one developer toggle and the whole game renders with flattened banded lighting, ink outlines, and posterized painterly color, in the spirit of the classic Ultima games. The shader review behind it also fixed a years-old lighting bug on batched scenery and cut thousands of dead shader variants.</li>
        <li>Then the deeper check passed too: the new stack's traffic was recorded and compared message by message against the reference captures of the current stack. Thirteen test modes match byte for byte, and every other difference traced to message ordering or already-known multi-bot timing, none to message content. The two stacks say the same things on the wire.</li>
        <li>An endurance soak then earned its keep: repeated full-suite runs against one long-lived cluster surfaced a defect no single run could, a rare thread race that silently killed a server-to-server link while it still looked healthy. It was hunted down live (thread dumps, per-message logging, a twenty-run reproduction with a perfect correlation), fixed the same day, and verified with the same three-cycle endurance test that first exposed it: 144 suite modes and 18 targeted probes, zero failures on the cluster that previously sickened by cycle three.</li>
        <li>Then the real game client joined the backend on the new stack. A normal Windows client, built with one flag flipped, logged into the local server cluster over the new networking, created a character, loaded into a rendered scene, and ran a full scripted session (movement, chat commands, an emote, screenshots) with no errors, its entire networking path on the replacement transport. The vendor library is compiled out of that build entirely. This is the same client players run, proven end to end on the new wire for the first time.</li>
        <li>The <b>combat balance</b> program is underway. A new audit tool graded all 163 implemented combat skills on paper and confirmed the big suspects: Death magic computes to zero damage against tier-5 undead at grandmaster, Chaos and Bard rank far above every other school, and 59.5% of characters that invest in Bard take it to grandmaster. A new changeset pipeline makes every coming tuning change reviewed, capped, and revertible.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Ran the complete backend on the replacement stack: all seven server processes (master…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-edb2700db965</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Ran the complete backend on the replacement stack: all seven server processes (master, social, game, scene, two group servers, and logging) on the new process host, on the same port layout the current stack uses, against the local database and real game data. The servers found and registered with each other over the new encrypted internal links, and a game server restarting its connection to the master recovered on its own.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Wrote the one-command launcher that stands that cluster up and down. It publishes each…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-f115075bf3f4</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Wrote the one-command launcher that stands that cluster up and down. It publishes each service together with the host so their shared components agree, copies the runtime config the services expect, generates and wires the shared local development key for the internal authentication, and pins the master's identity setting (its fallback of reading a network adapter's hardware address can pick an adapter without one and crash a store subsystem).]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Ran the full automated test suite against the live cluster: 48 of 48 modes pass with only…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-fbf92ba4b6ce</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Ran the full automated test suite against the live cluster: 48 of 48 modes pass with only the website-credentials mode skipped, the same mode set the reference captures of the current stack were recorded from. The suite went from twelve passes on the first attempt to all of them on the third as the defects below were fixed.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Fixed typed lists over the wire. The game's messages carry lists of numbers, names, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-5d88a46f9c0d</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Fixed typed lists over the wire. The game's messages carry lists of numbers, names, and object ids whose exact element type must survive transit (the receiving code casts to the typed list), and the new encoding only carried untyped lists; lists of the game's custom data types were not carried at all. Both now travel with their element type and rebuild exactly, covered by new encoder test cases on both the server and the in-editor client suites.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Fixed the disconnect reason a client sees when the server deliberately drops it. The…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-17b34dde91ee</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Fixed the disconnect reason a client sees when the server deliberately drops it. The logging server's spam cutoff test checks for the specific server-logic disconnect code, and the new client layer reported a generic one; the deliberate-close case now maps to the code the game expects, with the timeout case kept separate.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Fixed a silent message loss that broke chat, parties, and social presence. A group server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-fcb36e496996</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Fixed a silent message loss that broke chat, parties, and social presence. A group server introduces itself to the social server the moment its connection object is constructed, and the new stack only armed a connection's encryption after construction finished, so that first message was dropped without a trace. The handshake keys are now staged before construction, matching how the old system behaved, and the ordering guarantees the receiving side can decrypt construction-time messages.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Fixed the local address a server sees on its own outgoing connections. Servers derive…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-41856d9a8394</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Fixed the local address a server sees on its own outgoing connections. Servers derive their cluster identity from it, and the new stack reported a placeholder; registrations now carry the real address, which is also what the master hands to clients when directing them to a game server.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Made the published test bot self-contained: its login credentials, per-test fixture data…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-82d92f79308c</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Made the published test bot self-contained: its login credentials, per-test fixture data, and logging config now ride the publish, and the test harness gained a switch to point at the new-stack bot. The missing fixture files had accounted for two thirds of the first run's failures.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Ran the message-level comparison between the stacks: recorded the new stack's full…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-89dc508fd4fe</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Ran the message-level comparison between the stacks: recorded the new stack's full test-suite traffic and diffed it against the current stack's reference captures under the documented masking rules. Thirteen modes are byte-identical; seven contain the same messages in a different order (the new transport is faster, so paired responses sometimes land swapped); the rest differ only within the same noise the current stack shows against itself run to run. One mode logs a single extra client message that raced the server's spam cutoff. No content drift anywhere.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The comparison surfaced four gaps in the masking rules that same-day reference runs could…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-5ca6e09ae898</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[The comparison surfaced four gaps in the masking rules that same-day reference runs could never expose: a store version counter, a weekday embedded in a test game name, a date-derived price field, and a timestamp hidden inside a byte-encoded blob. All four are now encoded with their reasons, and the differ gained composable rule files plus drop rules for the client status callbacks that legitimately differ between transports.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Wrote the hosting-requirements input for next week's production hosting decision: what…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-c6dc0b0a5099</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Wrote the hosting-requirements input for next week's production hosting decision: what the chosen servers must additionally support so the new networking stack lands on them later without revisiting the decision. Short version: room to run native Linux processes beside the launch-era Windows VMs, one extra port range during transitions, and a storage dataset per environment for the parallel test copy of the database.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Put the standing tripwire in place for mirror drift: the team ships weekly on the current…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-27006e2fd562</guid>
      <pubDate>Tue, 07 Jul 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Put the standing tripwire in place for mirror drift: the team ships weekly on the current server project files while the port compiles the same sources from derived file lists, and a file added to one side without the other still builds cleanly and silently loses behavior. A new checker evaluates both sides exactly as the builds do and diffs them (five project pairs, all in sync at introduction), and a nightly build-farm job now runs that check plus the full test-harness suite so drift is caught the next morning, not months later.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Ran an endurance soak (repeated full-suite runs against one long-lived cluster) and it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-76495e9ed1e4</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Ran an endurance soak (repeated full-suite runs against one long-lived cluster) and it caught a serious defect: after enough sustained traffic, whispers, chat channels, parties, and social presence started failing while every connection still looked healthy. A twenty-run reproduction showed failures correlating perfectly with the two test clients landing on different group servers, live thread dumps showed every process idle, and restarting a single server cleared it, which narrowed the fault to in-memory link state.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The root cause was a thread race in the new encrypted transport: taking a message's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-d11c6fab2629</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[The root cause was a thread race in the new encrypted transport: taking a message's sequence number and handing the message to the transport were two separate steps, so two server fibers sending on the same internal link could put messages on the wire out of sequence order. The receiver's strict ordering check then silently discarded everything after the gap, forever, while the link stayed up. The fix makes sequencing and sending one atomic step per channel, and an ordering violation now drops the connection loudly so the existing reconnect logic recovers, instead of leaving a healthy-looking link that eats messages.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The hunt left durable tooling behind: a host switch that turns on per-message logging…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-572da97005bd</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[The hunt left durable tooling behind: a host switch that turns on per-message logging across every generated server interface without a source edit, and a written triage guide covering this failure class's signature and the live thread-dump recipe.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Settled how shipping clients will trust the new stack's server identity: the server's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-82b207fee62b</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Settled how shipping clients will trust the new stack's server identity: the server's public key ships baked into the client per environment, as an ordered current-plus-next set, so a routine key rotation is a normal client patch instead of a flag day. This follows the same approach the current client already uses for its login key. The decision and its coupling to the client's self-integrity checks are recorded in the key-handling runbook, which also shed the certificate-authority language left over from a superseded internal-links design.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Opened the game-client phase of the replacement with a two-track code survey before…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-af10e9300975</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Opened the game-client phase of the replacement with a two-track code survey before writing any code, and it changed the plan for the better: the vendor networking library turns out to compile from source inside its own assembly (there is no vendor binary in the client at all), so the client can switch stacks with a single build flag while every consumer compiles unchanged, and regular test-shard builds keep shipping the current stack untouched. The survey also flagged two candidate wire-level gaps a real client might hit that the automated test bot structurally never could, and the phase now has its own written execution plan.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The client-side keystone compile then passed: with the new build flag set, the whole game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-39df89b25fb2</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[The client-side keystone compile then passed: with the new build flag set, the whole game client, its forked network framework included, compiles against the replacement networking facade instead of the vendor library, and with the flag unset the client builds exactly as before. The facade source moved into the client tree so the game and the test bot compile the identical file and cannot drift, three members the framework reads were added, and the facade's 66-check behavior proof still passes. A one-command script now builds both configurations headlessly, without the editor, for use as a standing gate.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Chased both flagged wire gaps to ground before touching the protocol, and both dissolved…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-5aceba853e07</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Chased both flagged wire gaps to ground before touching the protocol, and both dissolved against the game's actual code paths: the suspect type registrations turned out to be disabled code that never compiles, and remote-call payloads travel as opaque byte blobs the game serializes itself, so the new encoding never sees the suspect types. The strict encoding stays as designed, now with tests pinning that it refuses unknown type codes, and the client's disconnect timeout default was aligned to the current stack's value. The full 48-mode suite passed against the live local cluster with the change in.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Wired the client-side key and identity plumbing for the new stack: a per-environment key…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-64788f257db8</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Wired the client-side key and identity plumbing for the new stack: a per-environment key module that refuses to compile a live or QA client until real keys exist for it (which is also the moment the tamper-check constants get redefined, so the coupling cannot be forgotten), a startup hook that provisions every connection with the pinned key and the game's version identity, environment overrides available only in flag builds so a local test client can reach a local cluster without weakening the shipping server lock, a build-farm switch that produces the flag build, and a hygiene check that fails any player artifact carrying the new networking flag however the define might leak in.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Closed the client test harness's last login gap while preparing the first live…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-d3c6b386e12f</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Closed the client test harness's last login gap while preparing the first live flag-client run: an automated login on an account with no character now creates a default one through the same code path the game's functional tests already use and continues into the world (real players still get the normal creation and select screens), and the local cluster launcher gained the same offline-login option the old-stack launcher had, so a real client can log into the local replacement-stack cluster without the production account service.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Ran the first live client session on the new stack, and it passed twelve of twelve steps…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-ff4480c388a8</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Ran the first live client session on the new stack, and it passed twelve of twelve steps. A flag-built client (with the vendor networking library verified absent from the finished build) connected to the local seven-process cluster, created its character automatically, loaded the Solace Bridge starter scene rendered over the new transport, and ran through queries, location commands, an emote, and autorun movement with screenshots at each stage, no client errors, the whole networking path on the replacement code. The one server-side note was a missing local data file unrelated to networking. That completes the client phase of the port locally; the next milestone is the same client in front of invited testers on the test shard.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Re-planned the rest of the networking replacement end to end and adopted an accelerated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-e3f3e945e274</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Re-planned the rest of the networking replacement end to end and adopted an accelerated schedule as the plan of record: the parallel new-stack cluster goes up on the test shard's server immediately, beside the current one, with invited testers on a side channel; the test shard's players move to the new stack in late August behind a drilled under-an-hour rollback; the stack then soaks under real players for months while the large-battle fan-out work is built and certified next to it; live moves in the winter window after a thirty-day bake; and once the rollback window formally closes, an archive branch is cut and every vendor networking dependency is deleted from the project, client and server.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The re-plan's review pass caught three traps before they cost anything: a rollback needs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-ecc773831fa6</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[The re-plan's review pass caught three traps before they cost anything: a rollback needs the old database driver to be able to read what the new one wrote (write formats now get pinned and tested in both directions), the planned one-app pilot phase turned out to be impossible under the all-or-nothing client switch (its checks fold into the parallel-cluster gates instead), and the generated server code still depended on a single build machine (its output gets committed with a drift check so any machine can build).]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Made the new-stack server buildable from any fresh checkout, the completion plan's first…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-cc8797228239</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Made the new-stack server buildable from any fresh checkout, the completion plan's first item: the generated network-dispatch code that only one machine's toolchain could produce is now committed beside the sources, and the nightly server build gained a gate that fails if a regeneration ever diverges from the committed copy. The generator's per-build timestamp stubs stay untracked, so the snapshot is churn-free.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Closed a long-open cutover question for good: no player client can use the TCP fallback…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-7c1275903167</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Closed a long-open cutover question for good: no player client can use the TCP fallback, because the shipped client hard-compiles to UDP and the protocol setting never ships in the settings asset. Only the editor and a developer tunnel switch speak TCP. Conditional TCP support is now removed from the client cutover gates by construction rather than by observation.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Fixed the local cluster's character-select error from the first live client run: the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-4179cf5b400b</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Fixed the local cluster's character-select error from the first live client run: the server resolves its scene-lock and name-blacklist files against a doubled path under our launcher's layout, so the launcher now provisions both files where the server actually looks.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Stood the whole backend up natively on Linux for the first time and got it green: all…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-ba44b78f4094</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Stood the whole backend up natively on Linux for the first time and got it green: all seven services running as native Linux processes, encrypted internal links established, and the conformance bot connecting and authenticating over the new wire on Linux. This is the shape the servers will actually run in after the move off Windows. The full automated conformance suite then passed there too: all forty-eight modes, zero failures, the same result as on Windows, over the new wire on native Linux. Getting there fixed the real portability gaps the run surfaced: the ported server and the test bot both hard-coded Windows path separators for their credential, log, and fixture files (a Windows host accepts them, Linux reads them as literal filenames), swept across roughly ninety of them to the form both accept; and the deploy layout was missing a config the server assembles for itself, so the launcher now provisions it. Also added an editor-length keepalive soak to the client facade proof: the current editor talks to the old server over a different transport, so under the replacement the editor's minutes-long pauses ride the new keepalive for the first time; a ninety-second stall held the connection with no stray work and the session resumed cleanly (74 of 74 checks pass).]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Prepared the Linux leg of the parallel-universe bring-up: the local cluster launcher is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-96a68bacb32c</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Prepared the Linux leg of the parallel-universe bring-up: the local cluster launcher is now cross-platform (verified by rebuilding the Windows cluster with it and passing the bot probe), the production service definitions for the new stack are written (one template service per backend process, with a resource cage so load tests cannot starve the co-resident live services), and a new build-farm job stands the whole seven-service backend up natively on the Linux build machine from any fresh checkout, runs the conformance probe against it, and tears it down.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Stood the parallel new-stack cluster up on the test shard's server for real: all seven…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-929f09a5c4db</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Stood the parallel new-stack cluster up on the test shard's server for real: all seven services running natively on Linux beside the still-serving current stack, on their own port range, against a local copy of the database, with a snapshot taken first. A 22-mode conformance pass ran green on the box, and after the firewall opened, a probe from a workstation connected and authenticated over the public internet on the replacement transport.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Test-shard client builds now default to the new stack: the build farm's client jobs, the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-05d017f2b7cf</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Test-shard client builds now default to the new stack: the build farm's client jobs, the in-editor build tools, and the command-line build path all produce new-stack clients unless told otherwise, and the build hygiene gate fails a mis-flavored artifact in either direction (a new-stack build containing the vendor library, or a vendor build carrying the new-stack flag).]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The first real game client then connected to the parallel cluster from a home internet…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-7f39355394ef</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[The first real game client then connected to the parallel cluster from a home internet connection: full encrypted handshake and a login round-trip on the replacement transport, in the same packaged build testers will run.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Chased down the two faults that kept real password logins failing after that first…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-5caa2529dd65</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Chased down the two faults that kept real password logins failing after that first connection, both provisioning gaps in the new deploy. It had shipped a retired signing key for the login service, so every request the servers signed was rejected and logins died before the password was ever checked (the test bots kept passing on their separate credential path and never saw it). And the services advertised internal addresses, so an outside client could log in but was then directed to unreachable addresses for world entry. With the current key provisioned and an address mapping added to the deploy, the full scripted login now passes from an external connection end to end: authentication against the real login service, character creation, and world entry redirects an outside client can actually follow.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): A real player then played on it: logged in from a home connection with a normal account…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-496acaef066f</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[A real player then played on it: logged in from a home connection with a normal account password, created a character, ran the Solace Bridge tutorial with quests advancing, and zoned into Brittany, a full scene transition through the master's routing. Over twenty minutes of play on the replacement stack with zero server errors and no disconnects.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Made the new-stack test build turnkey for testers: the client flavor now bakes the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-e77d7358b09a</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Made the new-stack test build turnkey for testers: the client flavor now bakes the parallel universe's server identity key and its port band, so a tester runs the game executable directly with no launcher script or environment setup. Development overrides still take precedence for pointing a client at a local cluster, and the client's telemetry connection gained the override it was missing (it previously always dialed the current stack's telemetry port and logged connect errors in new-stack builds).]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Closed out the day's paperwork: the security posture table now declares the parallel…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-1a2b821f5374</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Closed out the day's paperwork: the security posture table now declares the parallel cluster's shifted port range (the pre-deploy check asserts it and carries a note to retire it at the test-shard cutover), and the roadmap's networking row reflects the live status.]]></description>
    </item>
    <item>
      <title>Telemetry: Added a Zone Load Times dashboard to the team log site. Every zone load a client performs…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-df158806f7d7</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Added a <b>Zone Load Times</b> dashboard to the team log site. Every zone load a client performs already reports a timing line with the total wait and a per-phase split (scene file load, activation, server join, decorations, avatar, finalize, garbage collection); the dashboard charts average and 95th-percentile load times over time and per scene, the phase breakdown, load counts, and memory after each load.]]></description>
    </item>
    <item>
      <title>Telemetry: Kept first-of-session loads out of the regular charts. The first load pays one-time…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-7d6f95151f72</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Kept first-of-session loads out of the regular charts. The first load pays one-time warm-up costs and runs far longer, so it is charted on its own row; mixing it in would mask real regressions in the everyday numbers.]]></description>
    </item>
    <item>
      <title>Telemetry: Typed the load-time and memory fields in the log store so they can be aggregated, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-fa59200d5e17</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Typed the load-time and memory fields in the log store so they can be aggregated, and re-rolled the existing daily log buckets to match, verifying entry counts before and after so nothing was lost.]]></description>
    </item>
    <item>
      <title>Telemetry: Documented the tooling pitfall found on the way: the log viewer caches a pattern's field…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-4c061b266bc3</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Documented the tooling pitfall found on the way: the log viewer caches a pattern's field list, so newly typed fields report as missing in every chart until that cached list is refreshed.]]></description>
    </item>
    <item>
      <title>Telemetry: Wired server metrics into the same log stack: every server process (master, game, scene…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-b839efdf3d65</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Wired server metrics into the same log stack: every server process (master, game, scene, group, social, logging) now reports its load every ten seconds, covering connected sessions, process CPU and memory, garbage collections, internal queue depths, bandwidth, the load-shedding level, and on the master the online player count and login-queue occupancy against its cap.]]></description>
    </item>
    <item>
      <title>Telemetry: Added per-request response times: every request type is timed where it executes and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-472c9b941c9e</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Added per-request response times: every request type is timed where it executes and aggregated inside the server before reporting (count, average, worst case, and a fast/medium/slow split per type each interval), so the reporting cost stays flat regardless of how busy the shard gets. Request types report by name through a generated lookup of about 1,100 entries; unknown codes fall back to the number.]]></description>
    </item>
    <item>
      <title>Telemetry: Built a Server Metrics dashboard with thirteen panels: sessions per service, requests per…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-fe1f1d6ef913</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Built a <b>Server Metrics</b> dashboard with thirteen panels: sessions per service, requests per second, latency average and worst case, slow-request buckets, a busiest-requests table, CPU, memory, garbage collections, queue depths, network throughput, the master's login-queue view, and load-shedding state.]]></description>
    </item>
    <item>
      <title>Telemetry: Typed the new metric fields in the log store up front, extended retention to the new…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-cad49e689bbe</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Typed the new metric fields in the log store up front, extended retention to the new stream, and gave the read-only viewer account access (which also fixed the item-audit stream having been invisible to it).]]></description>
    </item>
    <item>
      <title>Telemetry: Verified the path at every layer before deploying: 23 pure-logic checks in the server…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-53f5cd722eca</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Verified the path at every layer before deploying: 23 pure-logic checks in the server test harness (including a port of the ingest parser's exact rules and a number-formatting check under a hostile locale), a live capture of the publisher's real datagrams, and a synthetic ingest test on the shard. Deployed to the test shard end to end; the full readiness gate passed and metrics from all six services are flowing.]]></description>
    </item>
    <item>
      <title>Combat balance: Kicked off the combat skill balance pass: wrote up the methodology (how balance is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-39de83e4367a</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Kicked off the combat skill balance pass: wrote up the methodology (how balance is measured, what counts as balanced, and how changes ship safely) in the epic plan and roadmap, with the first targets set: bring Bard and Taming down, lift the schools crushed by undead resistances.]]></description>
    </item>
    <item>
      <title>Combat balance: Built a Balance Audit editor tool that evaluates every implemented combat skill's…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-edbb96c013d8</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Built a <b>Balance Audit</b> editor tool that evaluates every implemented combat skill's formulas (damage, damage over time, area radius, focus cost, cooldown, buff uptime) against standard character and target profiles and writes a ranked power table per skill and per school. All 163 implemented skills evaluate cleanly and twelve editor tests pin hand-computed values.]]></description>
    </item>
    <item>
      <title>Combat balance: First audit results: the Death school's damage against tier-5 undead computes to zero at…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-c7cc093b1f2d</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[First audit results: the Death school's damage against tier-5 undead computes to zero at grandmaster (stacked resistances absorb all of it), Air, Earth, and Water land near zero against undead, and Chaos and Bard sit at two to four times the median school's output on paper. Physical weapon schools are untouched by the resistance wall.]]></description>
    </item>
    <item>
      <title>Combat balance: Built a Balance Changeset tool: skill tuning changes are now reviewable JSON files…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-f04d5d86c382</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Built a <b>Balance Changeset</b> tool: skill tuning changes are now reviewable JSON files applied through the game's real formula parser, with old-value locks, a cap on how far a single change can move a number, automatic before-and-after reports, and one-command revert. Verified that a no-change file leaves assets byte-identical and that a real apply-and-revert cycle restores the original bytes.]]></description>
    </item>
    <item>
      <title>Combat balance: Measured what players actually master from 120k character records: among characters that…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-68c9a562a521</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Measured what players actually master from 120k character records: among characters that ever invested in Bard, 59.5% took it to grandmaster, rising to 68.7% among characters active in the last year. Taming holds the largest invested experience pool of any school. Both support the community's read on the outlier schools.]]></description>
    </item>
    <item>
      <title>Combat balance: Added population snapshot scripts that report per-school investment and grandmaster share…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-b173eaa36c68</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Added population snapshot scripts that report per-school investment and grandmaster share on demand, with an exact replica of the game's skill experience curve so reported levels match in-game levels.]]></description>
    </item>
    <item>
      <title>Combat balance: Gave the balance audit a visual report: a one-command generator turns any audit run into…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-a8aea79d8c6c</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Gave the balance audit a visual report: a one-command generator turns any audit run into a self-contained interactive page with the per-school damage ranking against the target band, a school-by-target damage matrix that makes the undead resistance wall visible at a glance, and the top skills with hover detail.]]></description>
    </item>
    <item>
      <title>Combat balance: Published the balance audit report to the team portal behind the team login, with its own…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-77bb9814f067</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Published the balance audit report to the team portal behind the team login, with its own portal card and a one-command publish script that verifies the deploy the same way the other dashboards do.]]></description>
    </item>
    <item>
      <title>Combat balance: Started tracking balance over time: every published audit run is recorded in a shared…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-a75cfe93bfb9</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Started tracking balance over time: every published audit run is recorded in a shared history, and the report gained a trend chart plotting each school's power against the cross-school median across runs, with the target band drawn in, so the effect of each tuning change shows up run over run.]]></description>
    </item>
    <item>
      <title>Client rendering: Cleaned up the main object shader family (the one nearly every item, player, and building…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-417aef649b37</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Cleaned up the main object shader family (the one nearly every item, player, and building renders with): removed a leftover debug flag that made every compiled variant of the batching shader ship unoptimized with debug info, deleted an unused forward-rendering code path and two dead helper functions, and stopped compiling lighting variants the family can never use. The two transparent shaders each dropped from 24,964 compiled variants to 12,484 and the color-swap shader from 308 to 178, with all eight shaders recompiling clean.]]></description>
    </item>
    <item>
      <title>Client rendering: Fixed a years-old lighting bug on draw-call-batched scenery: the batching shader read the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-712205d14308</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Fixed a years-old lighting bug on draw-call-batched scenery: the batching shader read the day/night sun value under a different name than the game sets (a historical misspelling became the real contract), so on batched objects the value was stuck at zero. Vertex tinting was forced to white, emissive materials never responded to day or night, and glow was pinned to its dimmest level. Batched and unbatched copies of the same object now light identically.]]></description>
    </item>
    <item>
      <title>Client rendering: Made undyed objects stop paying for the dye system. Every pixel of every object evaluated…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-a06ee8c17149</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Made undyed objects stop paying for the dye system. Every pixel of every object evaluated the full color-replacement path (two texture reads plus three animated gradient computations) and then multiplied the result by zero when no dye was applied, which is most of what is on screen. The shader now skips that work outright when a material has dye off. Verified pixel-identical output before and after on dyed, undyed, and color-shift materials (0 differing pixels of 262,144 in isolated renders).]]></description>
    </item>
    <item>
      <title>Client rendering: Built an experimental Ultima mode : a toggleable retro rendering style with flattened…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-950faaa7d2fb</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Built an experimental <b>Ultima mode</b>: a toggleable retro rendering style with flattened, banded lighting, dark ink outlines, posterized painterly color, and an optional chunky-pixel pass. One shader change restyles the whole scene (the game lights every solid object through a single lighting pass), the rest composes effects the project already shipped but never used. Runs from the developer console with every layer tunable live; verified pixel-identical when off, and absent from release builds. Before/after shots below.]]></description>
    </item>
    <item>
      <title>Client rendering: Wrote up the render mode and its console commands in the docs, and added it to the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-c2bdb1077b8b</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Wrote up the render mode and its console commands in the docs, and added it to the roadmap as an experimental epic pending an art-direction call.]]></description>
    </item>
    <item>
      <title>Client rendering: Captured before and after evidence renders for a long-standing lighting question found in…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-a4de6fff0a07</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Captured before and after evidence renders for a long-standing lighting question found in the same review: the main shader caps a grazing-angle reflection term, which removes the edge-of-light sheen on cloth, leather, and wood. Filed for an art-direction decision with the renders attached.]]></description>
    </item>
    <item>
      <title>Client rendering: Promoted Ultima Mode to a checkbox on the Video tab of the options window. The setting…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-a10daa4230c9</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Promoted <b>Ultima Mode</b> to a checkbox on the Video tab of the options window. The setting persists between sessions, stays in sync with the developer console toggle, and applies without a restart. Fine tuning of the individual layers stays on the console while the look is dialed in.]]></description>
    </item>
    <item>
      <title>Client rendering: While adding the new checkbox, restored the correct interface font on all 157 labels of…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-4b9f0ab153d6</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[While adding the new checkbox, restored the correct interface font on all 157 labels of the options window: an earlier save had baked the Chinese fallback font into every label. Chinese clients are unaffected; they swap fonts at runtime.]]></description>
    </item>
    <item>
      <title>Client rendering: Added five tuning sliders under the Ultima Mode checkbox, shown only while the mode is…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-62005b44bf9b</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Added five tuning sliders under the <b>Ultima Mode</b> checkbox, shown only while the mode is on: light banding, outline strength, color steps, pixel size, and saturation. Changes apply immediately and persist between sessions.]]></description>
    </item>
    <item>
      <title>Client rendering: Fixed the new option's label showing question marks around it (the marker the game puts…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-528f0a13741d</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Fixed the new option's label showing question marks around it (the marker the game puts on text missing from the translation tables), and removed the defunct GPU Occlusion setting from the video options along with its backing code.]]></description>
    </item>
    <item>
      <title>Client rendering: Localized all twelve Ultima Mode option strings (the checkbox, five sliders, and their…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-417898a821ff</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Localized all twelve <b>Ultima Mode</b> option strings (the checkbox, five sliders, and their tooltips) into German, Portuguese, Russian, and Chinese, with matching entries in the QA test language. The Chinese text uses the series name Chinese players know Ultima by.]]></description>
    </item>
    <item>
      <title>Client rendering: Moved those option strings into the translation pipeline's source database as well, with…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-5b7c72b4944b</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Moved those option strings into the translation pipeline's source database as well, with French, Spanish, and Italian translations added at the database level, so future language deploys carry them instead of overwriting them.]]></description>
    </item>
    <item>
      <title>Client rendering: Retired the old third-party translation platform for good: the AI translation pipeline…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-aee72ced65be</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Retired the old third-party translation platform for good: the AI translation pipeline that produced the German, Portuguese, French, Russian, and Chinese fills is now the standing system. Confirmed nothing on the current build infrastructure still runs the old platform's sync, and marked its legacy build steps as never-to-be-ported.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Made screenshots a standard part of this work log: any change with something visual to…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-d2f753641f25</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Made screenshots a standard part of this work log: any change with something visual to show (an editor tool, the game, a web page) now ships with a capture, and every image is reviewed for sensitive content before it is published.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Split this work log into one page per week. The front page carries the current week…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-d461ee56359e</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Split this work log into one page per week. The front page carries the current week, finished weeks live on their own archive pages, and every page links to the previous and next week at the bottom. The publish script rolls a finished week onto its archive page automatically on the first update of a new week.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Extended the pre-publish checks to the new layout: image references and deployed byte…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-944b5c8294d5</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Extended the pre-publish checks to the new layout: image references and deployed byte sizes are verified for every page and shared asset, and the pre-deploy security scan reads every blog page instead of just the front page.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-07</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-07-images</guid>
      <pubDate>Tue, 07 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/UltimaModeOff.png" data-full="https://catnipgames.net/blog/images/UltimaModeOff.png"
               data-cap="The same test diorama rendered normally: standard lighting and materials."
               alt="A blacksmith hut with barrels and a well rendered in the game's normal photorealistic style" loading="lazy">
          <span class="cap">Ultima mode off</span>
        
        
          <img src="https://catnipgames.net/blog/images/UltimaModeOn.png" data-full="https://catnipgames.net/blog/images/UltimaModeOn.png"
               data-cap="The experimental Ultima mode: banded lighting, ink outlines, and posterized painterly color."
               alt="The same blacksmith hut rendered with flattened banded lighting, dark outlines, and posterized color" loading="lazy">
          <span class="cap">Ultima mode on</span>
        
        
          <img src="https://catnipgames.net/blog/images/ZoneLoadTimesDashboard.png" data-full="https://catnipgames.net/blog/images/ZoneLoadTimesDashboard.png"
               data-cap="The Zone Load Times dashboard: warm loads and first-of-session loads charted separately, with per-phase and per-scene breakdowns."
               alt="Dashboard of zone load time charts split between warm loads and first loads of a session" loading="lazy">
          <span class="cap">Zone Load Times dashboard</span>
        
        
          <img src="https://catnipgames.net/blog/images/RoadmapPage.png" data-full="https://catnipgames.net/blog/images/RoadmapPage.png"
               data-cap="The public roadmap page, the first capture taken through the work log's new screenshot step."
               alt="The Shroud of the Avatar roadmap page showing the October 1, 2026 target date" loading="lazy">
          <span class="cap">Roadmap page</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-06</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-headlines</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The <b>Photon replacement</b> reached its biggest server milestone: the entire game server, every service, now compiles unedited on the replacement networking library. That confirms the compatibility layer is complete for the whole backend, not just the pilot pieces, and all six of the game's custom data types serialize correctly over the new wire.</li>
        <li>Worked down the client-side checklist from the plan review: captured reference traffic from the current stack and built the comparison tool for it, restored the server clock the game reads from timestamps, and closed the connection-startup and keep-alive gaps flagged for the client swap. Two full reference runs of the same current-stack server now match each other message for message on the deterministic flows, which is what makes the comparison trustworthy.</li>
        <li>Audited the <b>Photon replacement</b> plan against everything built so far and re-based it. The build phases finished about a quarter ahead of the written schedule, so the plan now tracks the remaining work as a per-gate checklist, with reference traffic captures from the current stack at the top. The review also settled how backend servers will authenticate to each other and pulled the first test-shard rollout steps into this quarter.</li>
        <li>Built the matching client-side layer too, so the game and bot client code can move over the same way. A test drives it exactly as the automated test bot does and runs a full round of requests, replies, an event, and a clean disconnect against a real server on the new stack. Later in the day the test bot port was finished outright: all of its files compile with zero errors and its custom-type registration is proven on the wire in both directions.</li>
        <li>Ran the first real game service on the new stack too: the client logging server, the smallest backend application, boots unedited and answers a real client over a lossy connection through connect, news of the day, log submission, its spam cutoff, and the two-port split that separates player traffic from the internal admin tool.</li>
        <li>Moved the database layer to the current driver as part of that. The whole persistence layer builds against MongoDB driver 3.9 with small guarded changes, and a fidelity check against a real database confirms documents still read and write identically, including reading records written by the old driver, so live data survives the jump.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Stood up the client logging server, the first real backend application, on the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-0637658d96c0</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Stood up the client logging server, the first real backend application, on the replacement stack: the unedited application and its connection handlers boot on the new host across two ports and serve a real client over a connection dropping one packet in ten, through connect and its acknowledgement, news-of-the-day returning the loaded server messages, log acceptance, the hundred-messages-per-fifteen-seconds spam cutoff dropping the connection, and the port split that routes player connections and the internal admin tool to their separate handlers. It leans on the game's real generated message dispatch throughout.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Ported the database layer to MongoDB driver 3.9 (from 2.7): it compiles unchanged except…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-67207976e0b8</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Ported the database layer to MongoDB driver 3.9 (from 2.7): it compiles unchanged except for a couple of calls whose signatures moved, guarded so the old build still compiles too. A new fidelity check runs the real persistence classes against a live database and confirms real documents round-trip, the custom field formats keep their exact on-disk shape, and records laid out by the old driver still read back correctly, which is what lets the upgrade touch live data safely.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Compiled the entire game server, every service, unedited against the replacement…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-97f33fd33d32</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Compiled the entire game server, every service, unedited against the replacement networking library. This confirms the compatibility layer reproduces the full interface the backend was built on, not just the slice the pilot apps use. A handful of gaps surfaced and were filled in the compatibility layer, and one database call adjusted for the new driver, all without changing the game code. A runtime check then serialized all six of the game's custom data types over the new wire and read them back intact.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Built the client-side compatibility layer, the counterpart to the server one, so the game…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-20c67bd4beb0</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Built the client-side compatibility layer, the counterpart to the server one, so the game client's networking can switch over the same way. A test constructs and drives it exactly as the automated test bot does, its own connection object and per-frame pump, and runs twenty-five requests, their replies in order, a server event, and a clean disconnect against a real server application on the new stack. The full automated test bot, all three hundred-plus files, then compiles against it except for one custom-type serialization file that couples two buffer types, which is the last piece of that port.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Audited the whole replacement implementation against the plan, file and line, and…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-0ffc89288150</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Audited the whole replacement implementation against the plan, file and line, and re-based the plan around what the audit found. The build phases landed about a quarter ahead of the written estimates, so remaining work is now tracked as a per-gate checklist instead of time bands. Top of the checklist: recording reference traffic captures from the current stack while it still runs unchanged, so the new stack can be diffed against real behavior instead of assumptions.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Two decisions came out of the review. Backend servers will authenticate to each other…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-2f9d06632dc3</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Two decisions came out of the review. Backend servers will authenticate to each other with their own handshake keys on the same encrypted transport the game clients use, replacing the earlier certificate-based design. And the first rollout stages on the test shard move up to this quarter, while the main cutover waits until after the new-infrastructure launch settles.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The audit also corrected the test-bot record: the serialization file thought to block its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-0b0a1e5d677c</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[The audit also corrected the test-bot record: the serialization file thought to block its compile actually resolves fine, and the real remaining piece is a small adapter so the game's custom data types register at runtime. It flagged a handful of client-layer gaps to close before the game client switches over, including server time synchronization and a threading fix in the keep-alive path used during scene loads.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Finished the test-bot port the audit unblocked: the registration adapter landed (the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-4eca8821af77</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Finished the test-bot port the audit unblocked: the registration adapter landed (the client layer's stream-style custom-type registration now feeds the shared registry instead of silently dropping), a buffer constructor was fixed so deserializers can read the incoming bytes, and the client layer grew the traffic-statistics and network-simulation surfaces the ported code compiles against. The full bot, all of its files, builds with zero errors; its project file is committed and the spike harness now compile-checks it on every run so it cannot drift quietly. The end-to-end proof grew four cases covering the new registration path round-tripping a custom type in both directions on a live connection.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Built the traffic trace recorder, the top item from the plan review. When enabled it…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-5dcbbb7226ab</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Built the traffic trace recorder, the top item from the plan review. When enabled it records every message the test bot sends and receives, in order, with a stable rendering of each value, to a line-per-message file. The same recording code compiles into both the current-stack bot and the replacement-stack bot, so a run against the old server produces reference captures the new stack can be diffed against message by message.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Captured the reference traffic and built the comparison tool. Three full runs of the test…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-c76ba3170e84</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Captured the reference traffic and built the comparison tool. Three full runs of the test suite against a local current-stack server were recorded, all forty-seven modes passing, and a differ compares two captures mode by mode under a set of rules that mask the values which legitimately change between runs (timestamps, generated ids, session keys, a couple of counters). To prove the rules are honest they were derived by diffing two runs of the same server against each other: eighteen of the forty-seven modes then match byte for byte, and the rest differ only in message ordering at login and teardown or in the multi-bot modes, both written down as known exceptions rather than chased.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Restored the server clock. The client reads a server timestamp that gameplay leans on for…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-d1026748fec5</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Restored the server clock. The client reads a server timestamp that gameplay leans on for timed effects and message ordering, and it had been left as a local stopwatch. It now comes from a small ping exchange on the encrypted transport, built the same way the old system built it, so the value tracks the server and survives the counter wrapping around. Pinned with hand-checked cases and a live round-trip.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Closed three client-layer gaps before the game-client swap. The connection handshake now…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-e3b382b168a7</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Closed three client-layer gaps before the game-client swap. The connection handshake now carries the application name and patch version, bound into the handshake so it cannot be altered in transit, which also fixes how the server tells its own internal connections apart. Oversized unreliable messages are routed to the reliable channel instead of dropped, matching the old behavior, with a counter so oversized batches get noticed. And the scene-load keep-alive is now a true no-op that keeps the connection up without running game callbacks on the wrong thread, verified by stalling the main loop past the disconnect timeout and confirming the session survives.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Built how the backend servers authenticate to each other, one of the decisions from the…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-bf6b73cdb7f4</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Built how the backend servers authenticate to each other, one of the decisions from the review. Each server now carries its own handshake key; a server dialing another proves its identity as part of the encrypted handshake, and the receiving server only accepts keys on its trusted list. A wrong or unknown key is turned away before anything else happens, and a stand-in that presents a key it does not actually hold cannot complete the connection. Proven both as isolated cases and live over the network: a trusted backend connects and an operation round-trips, an untrusted one is rejected. This is new protection the old setup never had on its internal server links.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Finished the last client-layer item on the checklist: the in-game lag and packet-loss…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-1de5215da95c</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Finished the last client-layer item on the checklist: the in-game lag and packet-loss simulation controls used for testing now map onto the new transport's own simulator. The controls are wired and safe to leave in place; the actual effect only kicks in on a test build of the transport, exactly as the old simulator was test-build only. That clears the client-side facade checklist end to end.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Made the server-to-server authentication deployable. The process host now takes its…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-e307302a86b6</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Made the server-to-server authentication deployable. The process host now takes its trusted-key list and the address of any server it dials from configuration, validating each key up front and refusing to start on a bad one. That completes the internal-server-authentication work start to finish: the handshake, the server plumbing, the live test, and now the configuration to run it. What is left is the multi-server bring-up that uses it.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Started the deployment work for running the real backend services on the new host. Tried…</title>
      <link>https://catnipgames.net/blog/week-2026-07-06.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-06-370b0a92246e</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Started the deployment work for running the real backend services on the new host. Tried booting one of the actual services and traced through what it needs: each service has to be packaged together with the host so their shared components agree, and each carries its own runtime data files. Wrote the host support for loading a service's own libraries and documented the deployment recipe and the exact remaining gaps, so the multi-service bring-up starts from a known checklist instead of rediscovery.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-05</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-headlines</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The <b>buy order search</b> is live on the test shard: server and client shipped together as build 23, adding the Vendor Listings window's search field, All Zones and Buy Orders switches, and best-offer-per-unit sorting. Login smoke test and the full security check passed.</li>
        <li>Banning a player from your housing lot now removes them from the property when both of you are flagged for open PvP. Outside that case a ban keeps its old behavior, so it cannot be used to escape a fight.</li>
        <li>First optimized release client built with the <b>GM tools</b> compiled in and unlocked by account flags; the build's own hygiene check confirmed the still-restricted developer surface stayed out. A follow-up traced both the GM tools and the Oracle window coming up empty in the packaged client to optimization stripping the interface types they load at runtime, and fixed it.</li>
        <li><b>Simplified Chinese</b> is in the client: the full interface and every NPC conversation are translated and rendering, taking Chinese text coverage to about 99 percent. Player and place nameplates render Chinese too, and the test shard launcher now offers it in its language picker. Native-speaker review is the remaining step.</li>
        <li>The <b>Photon replacement</b> crossed from proofs to a working client and server: the replacement networking library now carries the game's real multiplayer room code, compiled unedited, serving clients over a lossy connection through joins, broadcast events, shared properties, and clean disconnects, booted by a new one-command process host. The client half is built inside the game engine as a drop-in for the old connection object, and an in-editor test connects it to the actual new server process and gets a ping answered through the room layer's real dispatch. The full proof suite also ran green on the Linux build machine, and the encryption stack passed its checks inside an optimized, code-stripped release client, closing the last crypto gate. The in-editor suite stands at 446 passing.</li>
        <li>Completed the tracker move from <b>Gitea</b> to self-hosted <b>Redmine</b>: all 164 issues imported with their history, and the in-game bug reporter and log triage now file there.</li>
        <li>Turned 18 months of the player <b>wishlist forum</b> into a live board on the team tracker: about 205 threads read, the roughly 100 decoration requests set aside, and the 93 gameplay, crafting, and quality-of-life asks filed one per entry with their forum link, community support, and area. Entries rank by votes, where a vote is watching one.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>GM tools: Added a permanent devoice option: the Players window's Voice action now offers blocking a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-f9383d5e523b</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Added a <b>permanent devoice</b> option: the Players window's Voice action now offers blocking a player's public chat for 12 hours or until manually revoiced, and the /devoice chat command accepts a perm option. Undevoice lifts either kind. The changed network operation was exercised end to end against a local server, and the never-expires marker was verified to store and read back intact.]]></description>
    </item>
    <item>
      <title>GM tools: Documented that the generated network operation codes hash the full method signature…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-a0db163424ba</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Documented that the generated network operation codes hash the full method signature; adding a parameter to an operation changes its wire code, so client and server carrying such a change must deploy together. The protocol documentation previously claimed the code covered only the name.]]></description>
    </item>
    <item>
      <title>GM tools: Added a voice moderation strip to the main GM panel: type any character name (offline…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-ae1c4e4d4e67</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Added a voice moderation strip to the main GM panel: type any character name (offline players included, using the same server search as the mail recipient picker) and devoice for 12 hours, devoice until revoiced, or undevoice, without opening the Players roster. A new editor test pins the panel's control names against the code that binds them.]]></description>
    </item>
    <item>
      <title>GM tools: Fixed the GM window devoice actions never resolving their target: the windows send only…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-8c15c84de884</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Fixed the GM window devoice actions never resolving their target: the windows send only the character's name while the server looked the target up by internal id alone, so every window-issued devoice would have come back "name not found". The server now falls back to a name lookup. The /devoice chat command was unaffected because it resolves the name first.]]></description>
    </item>
    <item>
      <title>GM tools: Fixed the /gm and /oracle windows never opening in a packaged client. Both load their…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-625b3225ed31</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Fixed the /gm and /oracle windows never opening in a packaged client. Both load their interface from a bundled file at runtime, and the optimized build stripped out the interface types they need, so the window built empty and closed itself while the command looked like it did nothing. The build now keeps those types, with an editor test guarding the regression. The cause was read straight from the client log; a rebuilt client goes to the test shard next.]]></description>
    </item>
    <item>
      <title>Economy: Shipped the buy order search to the test shard end to end: the game server and client…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-19616358d3ae</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Shipped the <b>buy order search</b> to the test shard end to end: the game server and client build 23 deployed together, so testers can now open Vendor Listings and search buy orders across every zone, sorted by the best offer per item, with the new search field, All Zones switch, and Per Unit column.]]></description>
    </item>
    <item>
      <title>Economy: Retired the old search index copy after the migration soak; a precondition check proved…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-2a0c24520edb</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Retired the old search index copy after the migration soak; a precondition check proved nothing still pointed at it, and searches were unaffected.]]></description>
    </item>
    <item>
      <title>Economy: Verified the search mirror across a server restart: orders the server cleaned up on boot…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-9af0d9df9648</guid>
      <pubDate>Sun, 05 Jul 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Verified the search mirror across a server restart: orders the server cleaned up on boot disappeared from the search results within seconds.]]></description>
    </item>
    <item>
      <title>Build pipeline: Ran the first optimized (IL2CPP) release client build with the GM tools shipping in it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-576f05cb1058</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Ran the first optimized (IL2CPP) release client build with the GM tools shipping in it; the build passed the updated hygiene check, confirming the crafting test mode and automation harness stayed out.]]></description>
    </item>
    <item>
      <title>Build pipeline: Corrected the hygiene check's success message, which still claimed the build carried no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-ff39fa5d72b8</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Corrected the hygiene check's success message, which still claimed the build carried no GM code; it now names the exact restricted symbols it verified absent.]]></description>
    </item>
    <item>
      <title>Build pipeline: Fixed the client build job failing after a successful build: the pipeline tried to put…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-dbe38dfee729</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Fixed the client build job failing after a successful build: the pipeline tried to put back an editor plugin folder that no longer exists now that the plugin comes from a package registry, so a finished build was thrown away. The check now only demands back what it actually took.]]></description>
    </item>
    <item>
      <title>Dev tooling: Removed the vendored in-repo copy of the Unity editor automation package and switched it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-d9ba39dbd9d1</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Removed the vendored in-repo copy of the Unity editor automation package and switched it to resolve from the package registry, which unblocked updating it to the latest release; the vendored copy had shadowed the registry entry and made package updates fail.]]></description>
    </item>
    <item>
      <title>Server networking: Fact-checked the Photon replacement plan against the codebase with three parallel review…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-5dfbaaa8a3f9</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Fact-checked the <b>Photon replacement</b> plan against the codebase with three parallel review passes and approved it. The architecture held on every load-bearing claim; the pass corrected the coupled-file counts, two configuration assumptions, and the channel-count premise, and folded in how the program sequences around the October go-live. The transport cutover itself remains a 2027 item.]]></description>
    </item>
    <item>
      <title>Server networking: Recovered the server build's one proprietary dependency from the retiring version-control…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-ccc0efc8f188</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Recovered the server build's one proprietary dependency from the retiring version-control system and preserved it in the new one, verified byte for byte; the client's mirrored subset was confirmed identical with no drift. This closes the plan's source-recovery gate.]]></description>
    </item>
    <item>
      <title>Server networking: Wrote the key-handling runbook skeleton for the new transport's encryption, covering…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-536864195272</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Wrote the key-handling runbook skeleton for the new transport's encryption, covering storage custody, routine rotation, and compromise response, so the operational story exists before the first key does.]]></description>
    </item>
    <item>
      <title>Server networking: Built and passed the concurrency-layer spike: a new work-scheduler on modern runtime…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-4b4dbee8859b</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Built and passed the concurrency-layer spike: a new work-scheduler on modern runtime primitives that reproduces the old library's behavior exactly. A shared test corpus runs against both the old component and the new one and every outcome matches, including the subtle cases that decide whether a stall becomes a freeze.]]></description>
    </item>
    <item>
      <title>Server networking: Built and passed the session-encryption spike: the new handshake and per-message…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-f4f13cc31954</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Built and passed the session-encryption spike: the new handshake and per-message encryption check out against the published cryptographic standards, plus reject-tampering, reject-downgrade, key-rotation, and no-nonce-reuse-under-load tests. It uses a portable library so the identical code runs on the server and inside the game client.]]></description>
    </item>
    <item>
      <title>Server networking: Built and passed the message-codec spike: a compact self-describing format for the game's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-af5eb8d1632b</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Built and passed the message-codec spike: a compact self-describing format for the game's binary messages that round-trips every value type, the special ID types, and the hot-path movement updates, and rejects malformed input before it reaches game code. The same source compiles into the client, proven by an in-editor test suite that runs green (437 of 437).]]></description>
    </item>
    <item>
      <title>Server networking: Built the walking skeleton: a client and server talking over a real network socket that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-cd83b4b52d09</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Built the walking skeleton: a client and server talking over a real network socket that run the whole new stack end to end, connect gate, encrypted handshake, per-channel message encryption, and the codec, holding up under a quarter of packets dropped. Reliable messages all arrive intact, unreliable ones decode with no replays slipping through, and tampered packets are refused. Recorded the protocol write-up alongside the code.]]></description>
    </item>
    <item>
      <title>Server networking: Cleared the biggest open question in the plan: whether the old load-balancing…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-2a7aef5d5509</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Cleared the biggest open question in the plan: whether the old load-balancing configuration still reads under the new runtime. Ran the real configuration files through the real config classes on the new runtime and they load with the exact right values, pick up a live edit, and fall back safely on a bad file. That gate is green.]]></description>
    </item>
    <item>
      <title>Server networking: Proved the new session encryption also runs inside the game client, not just on the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-d6cb5037a6b3</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Proved the new session encryption also runs inside the game client, not just on the server: the same crypto library loads and computes correctly under the client's runtime, verified by an in-editor test suite. The client-side test count went from 437 to 443, all passing.]]></description>
    </item>
    <item>
      <title>Server networking: Pinned the trickier networking rules the plan flagged: movement updates apply…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-f64a89d7f093</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Pinned the trickier networking rules the plan flagged: movement updates apply newest-first per object regardless of arrival order, an update that arrives before the thing it describes is created is held rather than misapplied, and an oversized batch is rerouted to a guaranteed-delivery channel and still arrives whole under heavy loss.]]></description>
    </item>
    <item>
      <title>Server networking: Proved the central bet of the whole effort: the game's message envelope rides the new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-ff56ca6b1da9</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Proved the central bet of the whole effort: the game's message envelope rides the new wire with no changes. Took the real, unedited envelope class from the server and ran it against a thin stand-in for the networking library plus the recovered shared library on the modern runtime, and every message shape - the movement hot path, logins, replies, events, nested payloads - encodes and decodes back to the same values. That is the "the networking library is a swappable bottom layer" claim, shown on the actual seam code rather than asserted.]]></description>
    </item>
    <item>
      <title>Server networking: Got the recovered shared library building on the modern runtime as part of that, which…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-f3c529c5290d</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Got the recovered shared library building on the modern runtime as part of that, which turned up two things to fix: a duplicate build-metadata clash, and a genuinely ambiguous call the newer runtime flags where the old one quietly picked one path. Fixed both without changing behavior and flagged a dormant bug in that same method for the owner rather than quietly altering it.]]></description>
    </item>
    <item>
      <title>Server networking: Stood up a working server connection object on the new stack, the shape the game's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-2b519ba15192</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Stood up a working server connection object on the new stack, the shape the game's hundreds of networking classes are built on. A real connection now takes an incoming request, runs it on that connection's own single worker so handling stays one-at-a-time exactly like today, reads it through the real message envelope, and answers with a reply and a separate broadcast event, all encrypted over a live socket with packets being dropped. Thirty requests in flight at once were each handled in order and answered correctly. This ties every piece built so far together under the same interface the existing code already uses.]]></description>
    </item>
    <item>
      <title>Server networking: Promoted the networking stand-in from spike code into a real library: the full…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-40466854ab02</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Promoted the networking stand-in from spike code into a real library: the full server-facing surface the game code compiles against, the listener and connection-accept stack with its pre-handshake connection gate, outbound server-to-server connects, and the logging and stats plumbing the applications expect. The low-level message framing moved into the source shared between client and server so the two sides cannot drift apart.]]></description>
    </item>
    <item>
      <title>Server networking: Compiled the game's real multiplayer room layer, unedited, against that library and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-d85d05fd468e</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Compiled the game's real multiplayer room layer, unedited, against that library and served live traffic with it: two test clients joined a room over a connection dropping one packet in ten, exchanged broadcast events through the real generated message dispatch, set shared room properties, and left, with the room reference-counting itself away after the last disconnect. The test subclasses the room code exactly the way the main game server does, so the seams the port depends on are the ones exercised.]]></description>
    </item>
    <item>
      <title>Server networking: Added the server process host: one program that loads a game application from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-7e2531df0150</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Added the server process host: one program that loads a game application from configuration and runs it on the new stack, ready for service management on the target platform. It booted the room layer unchanged and shut down cleanly, and the full spike suite now runs nine groups, all green.]]></description>
    </item>
    <item>
      <title>Server networking: Built the client half inside the game engine: a drop-in replacement for the old client…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-2fd0f0c8e6ce</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Built the client half inside the game engine: a drop-in replacement for the old client connection object with the same frame-by-frame operating model, callbacks, and status codes, so the game's connection sites can switch over mechanically. The message layout and value encoding moved into the source shared between client and server, so the two sides compile the identical serialization code.]]></description>
    </item>
    <item>
      <title>Server networking: Proved the two halves speak to each other for real: an in-editor test starts the actual…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-44effa0e0db4</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Proved the two halves speak to each other for real: an in-editor test starts the actual new server process hosting the actual room layer, and the new client connects from inside the engine, completes the authenticated handshake, and gets a ping answered through the room layer's real message dispatch. The in-editor test suite grew from 443 to 446, all passing, including a check that a client pinned to the wrong server key refuses to connect at all.]]></description>
    </item>
    <item>
      <title>Server networking: Closed the remaining crypto gate: built an optimized release client through the standard…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-9516aa154a71</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Closed the remaining crypto gate: built an optimized release client through the standard pipeline with a new one-flag diagnostic that runs the full encryption, encoding, and framing checks inside the finished, code-stripped executable. All seven checks pass and the diagnostic writes its report and exits on its own, so the gate can run unattended after any build.]]></description>
    </item>
    <item>
      <title>Server networking: Ran the entire server proof suite on the Linux build machine: every group passes there…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-4270f3bb0725</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Ran the entire server proof suite on the Linux build machine: every group passes there too, including the live config reload watcher (a flagged open question for the target platform), the real room layer serving traffic over the network, and the process host booting the application. Along the way fixed a project-file pattern that only misbehaves on Linux and logged that generated server source has to be staged for builds outside the old version-control system.]]></description>
    </item>
    <item>
      <title>Infrastructure: Added a Chaos Shard Launcher download card to the developer portal, backed by a stable…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-9f5e5728fb24</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Added a <b>Chaos Shard Launcher</b> download card to the developer portal, backed by a stable latest-version link on the patch host that every launcher release now refreshes. The launcher updates itself after the first install, so the link never goes stale.]]></description>
    </item>
    <item>
      <title>Infrastructure: Published the internal build server's console through the developer portal. The build…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-efb4287c3020</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Published the internal build server's console through the developer portal. The build machine keeps an outbound encrypted tunnel open to the portal host, so nothing on the build network accepts inbound connections; access requires the portal sign-in and then the build server's own account login. The portal's Build &amp; CI card now opens it.]]></description>
    </item>
    <item>
      <title>Infrastructure: Added the new endpoint to the pre-deploy security checks: certificate health, the sign-in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-4f5287752a35</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Added the new endpoint to the pre-deploy security checks: certificate health, the sign-in gate, and the tunnel's loopback-only binding are now asserted on every preflight run.]]></description>
    </item>
    <item>
      <title>Infrastructure: Fixed a first-setup ordering bug in the build machine provisioning: the tunnel service no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-861667359098</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Fixed a first-setup ordering bug in the build machine provisioning: the tunnel service no longer starts before its access key is registered on the far side, which had been triggering the intrusion-lockout protection and briefly blocking the office network. Also corrected a certificate-rollout sanity check that miscounted a comment as a configuration directive.]]></description>
    </item>
    <item>
      <title>Infrastructure: Fixed a test-shard lockout from yesterday's unified sign-in switch: game logins moved to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-12f07ced898a</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Fixed a test-shard lockout from yesterday's unified sign-in switch: game logins moved to the shared directory but existing accounts were never migrated into it, so their passwords stopped working and resets on the accounts page had no effect. The affected account is onboarded, and the accounts page now writes the directory directly: account creation, password resets, and deletes stay in step from one place, and a failed directory write is reported in the page instead of passing silently.]]></description>
    </item>
    <item>
      <title>Infrastructure: Confirmed the single sign-in works from one place: a password set on the accounts page…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-d6ffe693a8af</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Confirmed the single sign-in works from one place: a password set on the accounts page logs into both the game and the issue tracker, verified end to end. Also cleared a fault that had blocked the accounts page itself, traced to a shared key that had drifted between the portal and the tool.]]></description>
    </item>
    <item>
      <title>Infrastructure: Removed the internal portal link from the public work log's header, leaving the roadmap…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-eaa05501b61d</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Removed the internal portal link from the public work log's header, leaving the roadmap link, so the public page no longer points at the login-only developer portal.]]></description>
    </item>
    <item>
      <title>Infrastructure: Made the accounts page the single place to manage access. Creating an account now grants…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-871d257a05a3</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Made the accounts page the single place to manage access. Creating an account now grants the game, the dev portal, and the tracker together by default, and every account has an access row for granting or revoking portal and tracker membership. The directory sync behind it gained revoke and a read of current membership to drive the new access column.]]></description>
    </item>
    <item>
      <title>Infrastructure: Kept the game checking its own stored password rather than the shared directory, so…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-b3eb3bc9df62</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Kept the game checking its own stored password rather than the shared directory, so changing who can reach the portal or tracker can never affect who can log into the game.]]></description>
    </item>
    <item>
      <title>Infrastructure: Reorganized the site front door: the public work log now lives at the root address, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-8a2dd0f12787</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Reorganized the site front door: the public work log now lives at the root address, and the internal developer portal moved to /portal behind its login. The old /blog and /roadmap addresses still resolve.]]></description>
    </item>
    <item>
      <title>Infrastructure: Made the roadmap's dates clearly tentative: added a prominent note up top that every date…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-3d8bfead1ccf</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Made the roadmap's dates clearly tentative: added a prominent note up top that every date is a target and will change as the work progresses, and labeled the October date as a target rather than a fixed commitment.]]></description>
    </item>
    <item>
      <title>Infrastructure: Completed the bug and task tracker move to self-hosted Redmine : imported all 164…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-04d1286ec577</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Completed the bug and task tracker move to self-hosted <b>Redmine</b>: imported all 164 existing issues with comments and their open or closed state, switched the in-game bug reporter and log triage to file into it, and left the old <b>Gitea</b> issues in place read-only so existing links still resolve.]]></description>
    </item>
    <item>
      <title>Infrastructure: Gave the tracker a dark theme, written in-house rather than pulled from a third party, so…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-0c4c1e67c183</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Gave the tracker a dark theme, written in-house rather than pulled from a third party, so it reads comfortably in low light.]]></description>
    </item>
    <item>
      <title>Infrastructure: Finished the dark theme's coverage. The account sidebar, menus, pop-ups, calendar, error…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-18a9c12af64f</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Finished the dark theme's coverage. The account sidebar, menus, pop-ups, calendar, error pages, and code blocks were still drawing light backgrounds under light text; they now match the rest of the dark interface. The remaining light surfaces were found by reading the tracker's own base stylesheet rather than page by page.]]></description>
    </item>
    <item>
      <title>Infrastructure: Added a real vote button to the wishlist board. Each suggestion now has a Like button…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-98122d1f0886</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Added a real vote button to the wishlist board. Each suggestion now has a Like button anyone signed in can click, with a live count the board sorts by. Voting had been hidden behind the Watch control; existing watch-votes were carried over so nothing was lost.]]></description>
    </item>
    <item>
      <title>Infrastructure: Pinned the vote count as a default column on the wishlist issue list, so the whole team…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-ca161bbb45a9</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Pinned the vote count as a default column on the wishlist issue list, so the whole team sees it without changing their own view settings.]]></description>
    </item>
    <item>
      <title>Community wishlist: Swept the player wishlist forum for the last 18 months and wrote up the suggestions worth…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-a2d94afd7880</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Swept the player wishlist forum for the last 18 months and wrote up the suggestions worth acting on: about 205 active threads read, roughly 100 pure decoration requests dropped, and the 93 remaining gameplay, crafting, economy, housing, and quality-of-life asks captured with a source link, the community traction each drew, and a note on whether it fits the game. The write-up leads with the asks the developers have already answered, shipped, on the list, or declined, so they do not get raised again.]]></description>
    </item>
    <item>
      <title>Community wishlist: Turned that write-up into a live suggestion board on the team tracker, one entry per…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-f9ad5fdc42ba</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Turned that write-up into a live suggestion board on the team tracker, one entry per suggestion, grouped into eleven player-facing categories. A vote is watching an entry, and a scheduled job tallies watchers into a sortable count so the board ranks by demand; developer-answered asks were filed already closed or rejected. The board is staff-facing for now, and opening it to players is a separate step.]]></description>
    </item>
    <item>
      <title>Localization: Added Simplified Chinese as a selectable language and made the UI render it: a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-7583227b9c49</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Added <b>Simplified Chinese</b> as a selectable language and made the UI render it: a CJK-capable font now drives the menus, options, tooltips, and item text, replacing the missing-glyph boxes. A font check across the on-screen labels came back clean.]]></description>
    </item>
    <item>
      <title>Localization: Machine-translated the full in-scope corpus to Simplified Chinese: interface, item and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-4828df9b9538</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Machine-translated the full in-scope corpus to Simplified Chinese: interface, item and skill names, journal, help, loading tips, and all NPC dialogue, reaching about 99 percent coverage. Native-speaker review is still to come.]]></description>
    </item>
    <item>
      <title>Localization: Extended the translation pipeline with a lower-cost machine-translation model as a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-1cde67b1053f</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Extended the translation pipeline with a lower-cost machine-translation model as a pluggable bulk translator, chosen through a blind translation-quality comparison; it kept the in-game formatting tags intact.]]></description>
    </item>
    <item>
      <title>Localization: Added an in-editor language switcher for QA and automated tests covering the new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-cdd516ac3387</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Added an in-editor language switcher for QA and automated tests covering the new language's setup.]]></description>
    </item>
    <item>
      <title>Localization: Made player and place nameplates render Chinese. Nameplates use a separate text system…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-1a7177b8073f</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Made player and place nameplates render Chinese. Nameplates use a separate text system from the rest of the interface, with fixed character sets baked into its three fonts; a Chinese-capable font was registered as the shared fallback, so any character those fonts lack now draws correctly. Verified in the editor on all three nameplate fonts, with Russian rendering unchanged, and covered by automated tests.]]></description>
    </item>
    <item>
      <title>Localization: Added Simplified Chinese to the test shard launcher's language picker, shown in its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-d1982656b4eb</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Added Simplified Chinese to the test shard launcher's language picker, shown in its native script with the translation completion percentage, and shipped the launcher update. Installed launchers apply it automatically on next start; the update was verified end to end on a real install.]]></description>
    </item>
    <item>
      <title>Localization: Opened up the Chinese entry in the in-game language options to all players. It had been…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-8e311a43df06</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Opened up the Chinese entry in the in-game language options to all players. It had been limited to developer builds while the translation was pending; that restriction lifts with the next test shard client build.]]></description>
    </item>
    <item>
      <title>Client UI: Added a color for friends in the nearby-players list. Names of players already on your…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-d4bae09099f5</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Added a color for friends in the nearby-players list. Names of players already on your friends list now show green, alongside the existing party, guild, PvP, and developer colors, so you can tell at a glance who you have not friended yet. The list already recolors live when you add or remove a friend. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-72190-interface-nearby-players-list-color-coding.176872/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Client UI: Fixed the mouse wheel zooming the game camera while scrolling the Oracle window…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-071b8e5bbfdb</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Fixed the mouse wheel zooming the game camera while scrolling the <b>Oracle</b> window. Scrolling over the window now only scrolls its text. The window is a newer UI Toolkit panel that the camera's over-UI guard could not see, so its zoom kept firing underneath.]]></description>
    </item>
    <item>
      <title>Client UI: Added an Only craftable filter to the crafting station window. A checkbox on the recipe…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-99c414bb0874</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Added an <b>Only craftable</b> filter to the crafting station window. A checkbox on the recipe list dims the recipes you are missing an ingredient for and sorts them below the ones you can make, so a long list stops hiding what is actually available. It remembers its setting between sessions, and reads what you are carrying. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-49862-filter-crafting-station-recipes-by-available-ingredients.172432/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Gameplay: Stopped the jump key from cancelling a spell mid-cast. With Prevent Movement While…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-60f941524e14</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Stopped the jump key from cancelling a spell mid-cast. With Prevent Movement While Casting on, pressing Jump during a cast that locks movement now does nothing instead of interrupting the skill, so the cast finishes. Casts that already allow movement still let you jump. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-72042-prevent-jumping-while-casting.176095/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Gameplay: Fixed a major repair failing when a player's Crowns of the Obsidian were split across…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-9874a63189bf</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Fixed a major repair failing when a player's Crowns of the Obsidian were split across stacks. Gold Crowns granted from different sources did not stack together, so a player who held enough in total across a purchased stack and an earned stack could not combine them or complete the repair. Gold Crowns are now a single zero-value, tradeable currency that always stacks, and a database pass normalizes existing Crowns so they stack too. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-72122-unable-to-do-a-major-repair-coto-issue.176564/">forum report</a>.]]></description>
    </item>
    <item>
      <title>Gameplay: Added a Guild only choice for location sharing. The Multiplayer options now offer…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-a43289066ae6</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Added a <b>Guild only</b> choice for location sharing. The Multiplayer options now offer Everyone, Guild only, or No one in place of the old on/off toggle, so guildmates can see where you are in the friends and guild list and teleport to you while everyone else cannot. The server decides who sees a location per viewer by guild membership, and existing settings carry over. Covered by unit tests. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-65504-feature-option-to-share-location-with-guild.173817/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Gameplay: Added a way to find empty planter spots. A new key, default Ctrl-U, beacons any planter…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-bae3c36fbdaf</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Added a way to find empty planter spots. A new key, default Ctrl-U, beacons any planter that still has an open plant spot, the way Ctrl-W beacons plants that need water, so a missed spot is easy to find when planting a lot of seeds. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-72607-add-empty-plant-spot-s-to-show-unwatered-routine-ctrl-w.179779/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Gameplay: Added an Auto-Decline Party Invites option to the Multiplayer settings. When it is on…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-5b57eee20012</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Added an <b>Auto-Decline Party Invites</b> option to the Multiplayer settings. When it is on, incoming party invites are turned away without a popup, the way Auto-Decline Duels already works, and a short chat line notes who was declined. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/sota-72490-auto-decline-party-invites-in-multiplayer-options.178894/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Gameplay: Banning a player from your housing lot now teleports them just off the property if they…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-5cb7a21635d4</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Banning a player from your housing lot now teleports them just off the property if they are standing on it, with a message telling them why. This applies only when both the lot owner and the banned player are flagged for open PvP and the owner is present in the scene; in every other case a ban still just blocks re-entry, so flipping a ban on and off cannot be used to escape a fight. A player killed in their own house used to watch the attacker stay inside after the ban. From a player <a href="https://www.shroudoftheavatar.com/forum/index.php?threads/banning-for-a-house.179800/">forum request</a>.]]></description>
    </item>
    <item>
      <title>Images · 2026-07-05</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-05-images</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[<div class="gallery">
        
          <img src="https://catnipgames.net/blog/images/SimplifiedChinese.png" data-full="https://catnipgames.net/blog/images/SimplifiedChinese.png"
               data-cap="Simplified Chinese in the client: interface and NPC conversation rendering."
               alt="Simplified Chinese rendering in the game client" loading="lazy">
          <span class="cap">Simplified Chinese in the client</span>
        
        
          <img src="https://catnipgames.net/blog/images/PatcherLanguageChooser.png" data-full="https://catnipgames.net/blog/images/PatcherLanguageChooser.png"
               data-cap="The launcher's language picker, with per-language translation coverage."
               alt="Launcher language picker listing languages with coverage percentages" loading="lazy">
          <span class="cap">Launcher language picker</span>
        
      </div>]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-04</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-headlines</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Built a global <b>buy order search</b>, a community request open since 2023: the vendor listings window can now search every buy order on every vendor in every zone, best price per unit first. The server side is live on the test shard; the client build follows.</li>
        <li>Fixed the forum-reported <b>Tabula Rasa</b> PvP bug: the chaos specialization damage-over-time effect was invisible to its target and impossible to cleanse. The same fix makes specialization bonus effects on about fifty skills behave consistently in multiplayer, and Purify can now remove chaos DOTs.</li>
        <li>Made the in-game <b>GM tools</b> and <b>Oracle</b> window work on the ordinary release client for accounts flagged as developer or admin. Both were compiled out of optimized release builds, which left them dead for the team; they now ship in every build and unlock purely by account flags the server checks, so supporting players no longer needs a special build.</li>
        <li>Fixed the game launcher on the test shard patching slowly and then freezing partway through. It now downloads a file's changed pieces in parallel and drops a wedged connection instead of waiting on it forever, and it updates itself to the fixed version.</li>
        <li>Reworked fishing experience so a catch is worth about four times its old value and bigger trophy fish give more, replacing a flat per-location rate players reported as too low to be worth the time.</li>
        <li>Began moving the team's bug and task tracker off <b>Gitea</b> to a self-hosted <b>Redmine</b>, so everyone signs in with their own account rather than one shared login, with the in-game bug reporter and log triage set to file into it. Built and staged, ready to switch on.</li>
        <li>Set up a shared login directory for the test setup, so one username and password now signs a person into the tracker, the developer site, and the test game, with each person's access managed from one console.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Combat: Fixed a PvP bug reported on the player forum where the Tabula Rasa chaos specialization…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-3abf558bd817</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Fixed a PvP bug reported on the player forum where the <b>Tabula Rasa</b> chaos specialization damage-over-time effect was invisible to its target: the victim took the damage but never saw the debuff icon and had no way to remove it. Each player's game was evaluating specialization-gated effects against the wrong character's skill training, so the effect only ever existed on the caster's screen.]]></description>
    </item>
    <item>
      <title>Combat: The same fix repairs specialization bonus effects on about fifty skills that misfired in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-f18be8dc8824</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[The same fix repairs specialization bonus effects on about fifty skills that misfired in multiplayer, including knockdowns and stat debuffs that did nothing against other players.]]></description>
    </item>
    <item>
      <title>Combat: Purify and Purify Burst can now remove chaos damage-over-time effects. They previously…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-92e3d78bd2ba</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[<b>Purify</b> and <b>Purify Burst</b> can now remove chaos damage-over-time effects. They previously stripped only death, fire, and poison, which left chaos DOTs without a counter.]]></description>
    </item>
    <item>
      <title>Combat: Wrote up how combat effects replicate between game clients and the rule that combat…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-b2ed2e163dff</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Wrote up how combat effects replicate between game clients and the rule that combat formulas may only use inputs every machine agrees on, and filed a design task to review the DOT's damage numbers now that it can be seen and cleansed.]]></description>
    </item>
    <item>
      <title>Gameplay: Reworked how fishing grants experience, from a forum request. A catch is now scored from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-0d24e680e2be</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Reworked how fishing grants experience, from a forum request. A catch is now scored from the fish landed instead of a flat per-location value, and the old per-location number became a multiplier, so richer spots still pay proportionally more. A normal catch is worth about four times its old value, and trophy fish scale higher by their length.]]></description>
    </item>
    <item>
      <title>Gameplay: Added editor tests covering the new fishing experience formula, including the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-d488c3b807c9</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Added editor tests covering the new fishing experience formula, including the trophy-length scaling, the per-location multiplier, and the case where a location grants no fishing experience.]]></description>
    </item>
    <item>
      <title>Economy: Built a global search for vendor buy orders , requested on the player forum since 2023…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-dd62eacb0e09</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Built a global search for vendor <b>buy orders</b>, requested on the player forum since 2023. The vendor search index now also mirrors every buy order on player and public vendors in every zone, updated within seconds of an order being placed, filled, or expiring, with no game server changes.]]></description>
    </item>
    <item>
      <title>Economy: Added a Buy Orders switch to the Vendor Listings window with a new Per Unit price column…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-976a44694537</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Added a <b>Buy Orders</b> switch to the Vendor Listings window with a new Per Unit price column, sorted by the best offer per item first. Filling an order is unchanged: travel to the vendor and sell as before.]]></description>
    </item>
    <item>
      <title>Economy: Wired the Vendor Listings window's search field and new All Zones switch: typing narrows…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-a07161b5532f</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Wired the Vendor Listings window's search field and new <b>All Zones</b> switch: typing narrows the loaded list as before, and pressing Enter now searches the index, across every zone when the switch is on.]]></description>
    </item>
    <item>
      <title>Economy: Added editor tests for the new search result handling and offline self-checks to the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-d35c0d5bb9d8</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Added editor tests for the new search result handling and offline self-checks to the mirror service and the search endpoint, covering the buy order record format end to end.]]></description>
    </item>
    <item>
      <title>Economy: Deployed the server side to the test shard: migrated the search index to the new format…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-8f22d51a3483</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Deployed the server side to the test shard: migrated the search index to the new format with a full rebuild in about 35 seconds, moved the live search over in one atomic step with no downtime, and verified a test buy order becomes searchable in under a second and disappears within seconds of being removed. The in-game client build is the remaining piece.]]></description>
    </item>
    <item>
      <title>Client: The corner build label in test builds now shows the configuration (dev or release), the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-922f586b4827</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[The corner build label in test builds now shows the configuration (dev or release), the engine backend, the build number, and the date and time the build was made, at half its old text size. The version string the client reports to the server is unchanged.]]></description>
    </item>
    <item>
      <title>Client: Fixed the /gm and /oracle commands doing nothing in the optimized release client, even…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-8442e941d31a</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Fixed the <b>/gm</b> and <b>/oracle</b> commands doing nothing in the optimized release client, even for developer and admin accounts. The GM tool suite was compiled out of release builds by design; it now ships in every build and opens only for accounts the server has flagged as developer or admin, with the server still validating every privileged operation on its side.]]></description>
    </item>
    <item>
      <title>Client: Release clients now refuse to open the GM tools in offline play, where no server has…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-323e792963f0</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Release clients now refuse to open the GM tools in offline play, where no server has vouched for the account; the offline shortcut remains available for editor testing and internal GM builds.]]></description>
    </item>
    <item>
      <title>Client: Added editor tests that pin the new arrangement: the GM windows stay compiled in, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-2ec1f786058c</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Added editor tests that pin the new arrangement: the GM windows stay compiled in, the offline shortcut stays out of release, and the GM and Oracle window assets stay packed into the game's asset bundles.]]></description>
    </item>
    <item>
      <title>Launcher: Tracked down why the launcher patched slowly and then froze partway through on the test…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-29f01de9992c</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Tracked down why the launcher patched slowly and then froze partway through on the test shard. A large file's changed pieces were pulled one at a time, and every big file queued behind a single shared memory guard that was held for its whole download, so a client used roughly a fifth of the bandwidth the host could give it. A connection that stopped sending had no timeout and hung the patch with no way to recover.]]></description>
    </item>
    <item>
      <title>Launcher: The launcher now frees that memory guard before it starts downloading, fetches a file's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-1b1906611d26</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[The launcher now frees that memory guard before it starts downloading, fetches a file's changed pieces several at a time, and gives every transfer a stall timeout so a wedged connection is dropped and retried in seconds instead of hanging. Moved the launcher to build 9, which it installs by updating itself, and added tests for the new download path and the stall timeout.]]></description>
    </item>
    <item>
      <title>Game data: Fixed the Explorer's Shovel crafting pattern in the item catalog pointing at an asset…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-d36396006838</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Fixed the Explorer's Shovel crafting pattern in the item catalog pointing at an asset reference that no longer existed, and refreshed three dungeon room display names.]]></description>
    </item>
    <item>
      <title>Build pipeline: Tracked down why the in-game GM tools stopped opening in the editor. Release builds set…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-a1816494fabc</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Tracked down why the in-game GM tools stopped opening in the editor. Release builds set aside the file that switches on the developer and GM features while they build, and a build that was interrupted part-way never put it back, so the editor rebuilt itself without the GM window, developer console, and test harness, none of which gave any error.]]></description>
    </item>
    <item>
      <title>Build pipeline: The build pipeline now checks for that leftover on every editor reload and restores the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-fac964b28f21</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[The build pipeline now checks for that leftover on every editor reload and restores the file by itself, with a log warning saying what happened.]]></description>
    </item>
    <item>
      <title>Build pipeline: Recorded the test shard patch channel's move to build 11 in the repo's staging state.</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-6eeeb154f831</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Recorded the test shard patch channel's move to build 11 in the repo's staging state.]]></description>
    </item>
    <item>
      <title>Build pipeline: Added an opt-in GM build of the optimized release client for the internal test shard: it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-9c3dbed741b1</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Added an opt-in GM build of the optimized release client for the internal test shard: it compiles in the developer console, GM tools, and control harness while keeping the release optimizations, so the shard can be tested on a build that matches what players run. It is marked as a GM build, and the existing publish check keeps it off the public release channels.]]></description>
    </item>
    <item>
      <title>Build pipeline: The release build hygiene check now recognizes that opt-in GM build as intentional while…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-c9734646b34a</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[The release build hygiene check now recognizes that opt-in GM build as intentional while still proving it carries no debug symbols or internal addresses, and it still fails any ordinary release build that has GM code compiled in by mistake. Added editor tests for the build's config rules.]]></description>
    </item>
    <item>
      <title>Build pipeline: Exposed that same GM build option on the build farm's client jobs, so an optimized…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-6d9a15ef5a4e</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Exposed that same GM build option on the build farm's client jobs, so an optimized release client with the developer tools can be produced by continuous integration and not only from a developer's editor. It defaults off, and the resulting artifact is tagged so it is easy to tell apart from a clean build.]]></description>
    </item>
    <item>
      <title>Build pipeline: Updated the release build hygiene scan for the GM tools shipping in all builds: the scan…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-5e65fa9091b8</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Updated the release build hygiene scan for the GM tools shipping in all builds: the scan no longer treats the GM window code as leaked debug code, while still failing any release build that carries the crafting test mode or the automation harness.]]></description>
    </item>
    <item>
      <title>Infrastructure: Built the move of issue tracking from Gitea to a self-hosted Redmine tracker: a container…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-124b56040787</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Built the move of issue tracking from <b>Gitea</b> to a self-hosted <b>Redmine</b> tracker: a container deploy with nightly backups, a setup step for the project, categories, and milestones, and an importer that carries every open and closed issue across with its comments and history.]]></description>
    </item>
    <item>
      <title>Infrastructure: Wired the in-game bug reporter ( Oracle ) and the automatic log-error triage to file into…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-f5836a3d38a4</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Wired the in-game bug reporter (<b>Oracle</b>) and the automatic log-error triage to file into <b>Redmine</b> through a single setting, so turning it on or rolling back is one change. Nothing is switched over yet; the deploy and cutover wait on a go-ahead.]]></description>
    </item>
    <item>
      <title>Infrastructure: Stood the new tracker up on the server and confirmed it runs, fixing the one-time…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-b5b42b755291</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Stood the new tracker up on the server and confirmed it runs, fixing the one-time data-load step that was missing a startup key. It is running privately for validation; it is not public and nothing has moved off <b>Gitea</b> yet.]]></description>
    </item>
    <item>
      <title>Infrastructure: Configured the new tracker end to end (issue types, priorities, statuses, custom fields…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-3c40f04644cf</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Configured the new tracker end to end (issue types, priorities, statuses, custom fields, workflow, and a bot account) and rehearsed the full import from <b>Gitea</b>: all 163 existing issues copied into a throwaway project with their comments and open or closed state, zero failures. Fixed the import so closed issues arrive closed.]]></description>
    </item>
    <item>
      <title>Infrastructure: Brought the new tracker online at its own web address with a valid certificate, forced…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-7d6aed70c17d</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Brought the new tracker online at its own web address with a valid certificate, forced login, and sign-ups turned off, and secured the default administrator account. The team can start signing in; the existing bug and task data has not been moved over yet.]]></description>
    </item>
    <item>
      <title>Infrastructure: Stood up a small login directory and connected the tracker and the developer site to it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-c466b1ae5a26</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Stood up a small login directory and connected the tracker and the developer site to it, so a person signs into both with one directory account and their group membership decides what they can reach. The old shared site password still works as a fallback.]]></description>
    </item>
    <item>
      <title>Infrastructure: Connected the test game login to the same directory, so one account now signs a person…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-54fe077a94fb</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Connected the test game login to the same directory, so one account now signs a person into the game as well as the tracker and the site, creating their game character record automatically on first login. The change is limited to the test shard and turns off with a single setting; the live login is untouched.]]></description>
    </item>
    <item>
      <title>Documentation: Read a community forum thread of PvE balance suggestions and checked the main claims…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-852f477e49ef</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Read a community forum thread of PvE balance suggestions and checked the main claims against the game's own data, writing up which ones hold as input to the planned combat-balance work. Confirmed that spellcasters are at a disadvantage against undead, death magic most of all, because undead carry a broad resistance to magic damage on top of a death-specific one; and that a boss draws from a large flat pool of possible artifacts with no way to farm a specific one.]]></description>
    </item>
    <item>
      <title>Documentation: An early automated read of the creature-resistance data had it backwards; re-checked it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-521fcd4ecbf6</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[An early automated read of the creature-resistance data had it backwards; re-checked it three independent ways and added a test that pins the resistance values' numbering so a future code reshuffle cannot silently mis-map every creature's resistances.]]></description>
    </item>
    <item>
      <title>Documentation: Started a running balance change log: one place that records every balance-affecting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-04-4362f91db33e</guid>
      <pubDate>Sat, 04 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Started a running balance change log: one place that records every balance-affecting change to the game rules (combat, experience, loot, economy, and PvP) with the reasoning for why each was needed. Seeded it with the work so far, including two earlier fixes to the PVP experience bonus that had been paying the risk reward to players who were kept safe, and the recent review of community balance suggestions.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-03</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-headlines</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The <b>Quest Graph</b> tool finished its first full version and learned to edit. Double-clicking any quest step now opens that NPC's complete dialogue tree (keywords, responses, yes/no branches, and what each one does), and a new Edit mode changes dialogue text, gate conditions, and actions in place, with every save validated first and written so precisely that only the edited value's bytes change on disk. The quest view groups steps by NPC and shows story-wide flags as dimmed satellites, a new scene-data layer taught the validator about flags set by doors, chests, and triggers (cutting the warning list by a third), the remaining 174 hard errors are a reviewable checklist, and a new check runs on every build so no new quest wiring bugs can land unnoticed.</li>
        <li>Russian is now fully translated in the game. Every NPC conversation plus all the interface, item, skill, journal, help, title, and script text was filled in, taking Russian from 59% to 99.8% coverage and dialogue from 64% to 100%. It is the first language in a non-Latin alphabet to be completed, and the game's existing fonts already carry the full Russian alphabet, so it needed no art changes.</li>
        <li>Players can now choose their language in the launcher before pressing Play. The dropdown lists all seven supported languages with a translation-completeness percentage beside each, defaults to English, remembers the choice, and shares it with the in-game language setting so the two always agree.</li>
        <li>The team's server-side unit tests now run inside the game client. Around 290 automated checks covering crafting, itemization, loot, stats, tax, and shared math were brought into the client's test runner and pointed at the client's own copy of that shared code, so if the copy ever drifts from the server a test fails. New tests fill in client-only logic the server tests could not reach, and a nightly build-farm job runs the whole suite.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Quest tools: Added the conversation view to the Quest Graph window: double-clicking a quest step…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-51dd8eb561a9</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Added the conversation view to the Quest Graph window: double-clicking a quest step drills into that NPC's full dialogue tree, drawn as keyword cards leading to response cards (each showing its gate conditions and the actions it fires) and on to yes/no query branches and their chains, with include files shown as reference cards. A back button returns to the quest view.]]></description>
    </item>
    <item>
      <title>Quest tools: The quest view now draws each NPC's steps inside a labeled box, shows story-wide flags…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-619b4d3d30d8</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[The quest view now draws each NPC's steps inside a labeled box, shows story-wide flags (the virtue paths and similar) as dimmed per-step satellites so they stop visually gluing unrelated quests together, and can overlay the cosmetic quest-indicator assets that watch a quest's flags behind a toolbar toggle.]]></description>
    </item>
    <item>
      <title>Quest tools: Taught the validator about the rest of the world: a reader for the game's baked…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-45b1870da64a</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Taught the validator about the rest of the world: a reader for the game's baked scene-reference database now tells it which flags are set and read by doors, treasure chests, teleporters, tutorials, and other scene objects that conversations cannot see. Measured on the full corpus, the error count dropped from 184 to 174 and warnings from 1,224 to 876, with the stale-quest-indicator checks down 39 percent.]]></description>
    </item>
    <item>
      <title>Quest tools: Wrote the remaining 174 hard errors up as a reviewable triage document, grouped by…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-e0b277b4008a</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Wrote the remaining 174 hard errors up as a reviewable triage document, grouped by failure type, so the content team can decide fix-or-accept case by case; accepted findings get a suppression entry with a written reason.]]></description>
    </item>
    <item>
      <title>Quest tools: Quest validation now runs headless for the build farm: a wrapper script runs the checks…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-ea631e983af5</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Quest validation now runs headless for the build farm: a wrapper script runs the checks in a batch-mode editor and fails only when a rule produces more errors than the committed baseline, so legacy findings never block a build but newly introduced quest bugs do.]]></description>
    </item>
    <item>
      <title>Quest tools: The tool's editor test suite grew to 22 tests, covering the new conversation view, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-788ac1661236</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[The tool's editor test suite grew to 22 tests, covering the new conversation view, the scene-reference reader, and a guard that story-wide flags can only ever appear in a quest graph as satellites.]]></description>
    </item>
    <item>
      <title>Quest tools: Conversations are now editable from the tool: selecting a response, query, or talk offers…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-ce59a7f3765d</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Conversations are now editable from the tool: selecting a response, query, or talk offers an Edit mode for its dialogue text, gate conditions, item requirements, emote, and action list. Saves are surgical: the tool locates the exact value inside the raw file and replaces only that span, proves the whole file still parses with the game's own loader before writing a byte, and the automated tests assert that each save changes exactly one contiguous region of the file. Bad gate expressions and invalid actions are rejected with the reason shown inline.]]></description>
    </item>
    <item>
      <title>Quest tools: Text edits handle a subtlety that would otherwise make them invisible: in the built game…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-0a5e5e25c5bc</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Text edits handle a subtlety that would otherwise make them invisible: in the built game, response text comes from a per-NPC override file (which carries the clickable-keyword markup), not the main conversation file. The editor updates both in one save, keeping the markup in the override and a plain-text copy in the main file, so the change shows up in game and in every tool. The test count stands at 27.]]></description>
    </item>
    <item>
      <title>Quest tools: Reworked the dialogue-text inputs in the edit form: the label now sits above a full-width…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-cd4ec06f93e1</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Reworked the dialogue-text inputs in the edit form: the label now sits above a full-width multiline box instead of beside it, which had squeezed the editable text into a narrow column.]]></description>
    </item>
    <item>
      <title>Quest tools: Fixed the graph layout scattering parts of a quest several screens apart with nothing in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-38413ff381c6</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Fixed the graph layout scattering parts of a quest several screens apart with nothing in between. Cycle edges from repeatable quests were inflating the layer ranking, and empty layers still consumed screen width; the layout now detects those cycles, packs columns tight, and arranges disconnected pieces side by side. The largest offender went from a sparse multi-screen sprawl to roughly two screens wide. The toolbar gained an Auto Arrange button and a persistent column-spacing slider, and the test suite grew to 31.]]></description>
    </item>
    <item>
      <title>Quest tools: Conversation editing gained undo and redo, and saves got about ten times faster. Every…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-9ccad42f75cb</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Conversation editing gained undo and redo, and saves got about ten times faster. Every save is now recorded as a transaction (including edits that touch both the conversation file and its display-text override), Undo and Redo buttons plus the usual keyboard shortcuts walk the history, and each step verifies the files on disk still match what the tool wrote before changing anything, refusing cleanly if something else edited them. A save that fails part-way is now one undo from clean. Under the hood, the tool stopped rebuilding its entire index after each save; it re-reads just the edited conversation and re-derives the rest from cached data, taking the after-save refresh from about 5 seconds to under 0.6. Twelve new tests bring the suite to 43.]]></description>
    </item>
    <item>
      <title>Quest tools: Undo now also covers moving things around on the canvas: dragging nodes (or a whole NPC…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-4cff638c4dc6</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Undo now also covers moving things around on the canvas: dragging nodes (or a whole NPC box) and Auto Arrange each record one undoable step on the same history as file edits, so Ctrl+Z after a drag puts the nodes back. Entries for moves are dropped when the view re-lays itself out, since the positions they refer to no longer exist; file edits stay. The suite stands at 45 tests.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The client build jobs gained two opt-in checkboxes that chain a release off a finished…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-6fae7744b5ba</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[The client build jobs gained two opt-in checkboxes that chain a release off a finished build: one publishes the new build to the test shard, the other runs a full release that also deploys the server. Both hand off to the existing release job, reusing its version-downgrade guard, patch-ready check, and login smoke-test, and pin it to the exact build just produced so the publish always ships that build rather than whichever finished last. Off by default and wired only to the test shard.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Fixed a bug in that new wiring caught on its first real run: the release step asked for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-21084fb0c2f9</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Fixed a bug in that new wiring caught on its first real run: the release step asked for the client build by a selector name the build system does not have, so a full release failed right after the client build finished. The build itself was fine; corrected to the supported selector name and re-generated the jobs.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Made the test-shard publish accept the newest build no matter which platform's build job…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-3dd5045afb0a</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Made the test-shard publish accept the newest build no matter which platform's build job produced it. Client builds number their patch version from that job's own build counter, so a platform whose counter had fallen behind the channel could never publish to the test shard. Its release now advances the channel to the next number instead of refusing; the live and QA channels keep the strict no-downgrade guard.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Separated build health from deploy health on those chained releases. A client build that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-cc1570fc5b70</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Separated build health from deploy health on those chained releases. A client build that compiled and packaged cleanly but whose optional publish step failed was being marked as a failed build, which reads as broken code. Now it stays green when it built and deployed, shows yellow (with a pointer to the release run) when it built fine but the publish or deploy failed, and only shows red when the build itself broke.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The dev Windows client now builds and deploys to the test shard on its own. A new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-a3cb40fad8b6</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[The dev Windows client now builds and deploys to the test shard on its own. A new build-farm job watches the working branch every few minutes and, when a commit changes client or server code, refreshes the tree and runs the full build-publish-deploy so testers get the latest without anyone pressing a button. Commits that only touch docs, the blog, or build scripts are skipped, and it tracks the last deployed commit so it never repeats work.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Tracked down and fixed a build that shipped a client missing a chunk of its art. The…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-dcc03a784e1d</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Tracked down and fixed a build that shipped a client missing a chunk of its art. The Linux build machine treats file extensions case-sensitively, and the rule that stores big binaries outside normal source control was written for lowercase extensions only, so thousands of uppercase-named model and texture files (about 8,000 models) never downloaded their real contents on that machine and sat as tiny placeholder stubs. Unity couldn't read them, imported them empty, and a rebuild baked the gaps into the shipped bundles, dropping roughly 2 GB of houses, decorations, monsters, and characters. Fixed the rule to match any capitalization, restored the real files, and added a guard that fails the build if any placeholder stub is ever left behind.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Pulled the automatic build-and-deploy wiring back out for now. The job that watched the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-d08ab6b8caf8</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Pulled the automatic build-and-deploy wiring back out for now. The job that watched the working branch and rebuilt, published, and deployed the dev client to the test shard on each commit is gone, along with the per-build publish and full-release checkboxes on the client jobs. Builds and deploys are back to being started by hand through the existing release job. The change is reversible if we want it back later.]]></description>
    </item>
    <item>
      <title>Testing: Brought the server's unit-test suite into the game client's test runner. The client keeps…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-c3d739745d0a</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Brought the server's unit-test suite into the game client's test runner. The client keeps a byte-for-byte copy of the server's shared game code (crafting formulas, item and loot logic, stat and tax rules, shared value types), and that code had no client-side tests. About 290 in-editor tests now exercise it, reading the server test suite's own data files in place so the client parses the exact same bytes. Because both sides share the code, a check that passes on the server but fails here means the client's copy has drifted, which is the failure this catches.]]></description>
    </item>
    <item>
      <title>Testing: Added tests for client-only logic the server suite could not reach: the experience and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-12d94607f675</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Added tests for client-only logic the server suite could not reach: the experience and skill-level tables, damage-type classification, and the shared data structures, hashing, and JSON helpers.]]></description>
    </item>
    <item>
      <title>Testing: Wrote a headless runner and a nightly build-farm job that run the whole suite in a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-94d72ee63b35</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Wrote a headless runner and a nightly build-farm job that run the whole suite in a batch-mode editor, publish the results, and mark the build yellow if any test fails. Day-to-day runs use the editor's own test window.]]></description>
    </item>
    <item>
      <title>Localization: Filled every missing Russian line with the same machine-translation pipeline used for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-7c3b4c1958ea</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Filled every missing Russian line with the same machine-translation pipeline used for German, French, and Portuguese, taking Russian from 59% to 99.8% coverage and NPC dialogue from 64% to 100%. About 48,600 lines were translated and checked for formatting, then a second grammar-and-meaning pass corrected 151 more. Thirty conversation areas that had no Russian text at all now have full translations. The only untranslated text left is in-game books, which ship on a separate track.]]></description>
    </item>
    <item>
      <title>Localization: Confirmed Russian displays correctly before shipping it: the game's interface fonts and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-cd3a8bee92d0</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Confirmed Russian displays correctly before shipping it: the game's interface fonts and overworld name plates already carry the full Cyrillic alphabet, so Russian needed no new font work. Checked it against the font glyph tables and with a live rendering test in the editor.]]></description>
    </item>
    <item>
      <title>Launcher: Added a Language picker to the launcher, next to the existing graphics option. It lists…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-7ec7437e7bf1</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Added a Language picker to the launcher, next to the existing graphics option. It lists the seven shipped languages by name with each one's translation-completeness percentage (English is the source language), defaults to English, and saves the choice to the same file the game reads at startup and the in-game options menu writes, so a change in either place shows up in the other. It writes only when the player actually picks a language, so anyone relying on automatic system-language detection keeps it.]]></description>
    </item>
    <item>
      <title>Launcher: The percentages come from a small data file built into the launcher, regenerated from the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-8024d8e62a49</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[The percentages come from a small data file built into the launcher, regenerated from the live translation database by the existing coverage tool, which gained an option to print the numbers as data. Current coverage: German, French, Portuguese, and Russian at 99 percent, Spanish at 29, Italian at 27. A note beside the file and in the localization docs covers refreshing it when new translation work lands.]]></description>
    </item>
    <item>
      <title>Launcher: Published the updated launcher so installed copies self-update to it on next start.</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-03-7d5bb97cf639</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Published the updated launcher so installed copies self-update to it on next start.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-02</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-headlines</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:43 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The move to new infrastructure has a date: <b>October 1, 2026</b>. A full audit of everything the old build-and-release system did against what the new stack has produced a 26-item gap register, eleven new critical tasks with target dates working back from the cutover, a dated target on every roadmap epic, and a public roadmap page at <a href="https://catnipgames.net/roadmap/">/roadmap/</a> that players can follow.</li>
        <li>GM events are getting real tooling. A new in-game GM window suite opened all four of its planned panels in the dev client: a main panel with a one-glance ghost-mode button and live dev info; an event panel with scene time dilation, timed stat buffs for one player or the whole scene, and a weather picker; a <b>Players Online</b> window listing everyone on the shard with one-click teleport-to-player (arriving ghosted), message, mute, and summon actions; and a <b>prize Mailbox</b> that delivers reward items and gold straight to any player's mail — even offline players — with fuzzy search over recipients and the full item catalog.</li>
        <li>A new <b>Quest Graph</b> tool reads every NPC conversation in the game and cross-checks the quest system's invisible wiring: which dialogue sets each knowledge flag, which gates read it, and which journal tasks and rewards they connect to. Its first full validation pass over all 2,303 conversations found 184 hard errors in shipped quest content, from mistyped flag names that keep quests from advancing to task completions that name tasks which do not exist. By end of day it also sorted the game's 2,477 flags into 677 recognizable quests and opened its first visual canvas: each quest drawn as a node graph of flags, dialogue steps, journal entries, and rewards, with validation errors badged right on the offending node.</li>
        <li>The nightly server-report regeneration is back after nine months off. The per-scene data the game servers read town and player-housing information from had no working generator since the legacy build job was paused last fall — the root cause of June's vanished-houses incident. A new nightly job on the build farm regenerates it from current source, the release path consumes it automatically, and the first Unity 6 output was verified to carry every one of the 442 player-owned towns, including the one that vanished. Its first runs also flushed out a real engine-upgrade bug in the housing-plot validator.</li>
        <li>Vendor search is being rebuilt around a live, all-world index, and the data half is done. Instead of pulling a single town's listings through the game's rate-limited connection (minutes of transfer in the biggest markets before recent fixes), every listed item in every town now sits in a dedicated search service on the test shard: all 286,000 existing listings were loaded in about half a minute, a new listing is searchable within two seconds of being posted, and a sold or removed item disappears just as fast. A name search over the entire world answers in under 30 milliseconds. The game servers were not touched to make this happen.</li>
        <li>The in-game Oracle's knowledge base passed its first full fact check. All 38 help topics were verified claim by claim against the game's data files, dialogue, and code: 1,762 claims checked, 497 corrected, 36 unsupportable details removed. The Oracle also no longer answers from its language model's memory of the game; every fact it states must come from the knowledge base or recipe data it just looked up.</li>
        <li>French is now fully translated. Every in-game line outside the separate book pipeline, from NPC conversations to item names and menus, was filled through the machine-translation pipeline that already finished German and Portuguese, taking French from 53% to 99.6% coverage with all dialogue translated. A follow-up quality pass reviewed the flagged lines and corrected 146 of them.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Go-live planning: Set the go-live date for moving the live game onto the new infrastructure: October 1…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-7d01f7ebf85b</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:42 -0500</pubDate>
      <description><![CDATA[Set the go-live date for moving the live game onto the new infrastructure: October 1, 2026. Cross-referenced everything the legacy build system orchestrated (167 build configurations across builds, deploys, tests, scheduled reports, and backups), the old manual release runbook, and the recurring data artifacts the servers consume against what the new stack actually has, and wrote the result up as a 26-item gap register with priorities, sizes, evidence, and an explicit list of what will not make the date and ships after launch instead.]]></description>
    </item>
    <item>
      <title>Go-live planning: The critical-task list grew from 4 entries to 15, each with a target date: the live…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-16ab7f83786a</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:41 -0500</pubDate>
      <description><![CDATA[The critical-task list grew from 4 entries to 15, each with a target date: the live hosting decision, multi-environment release automation with a promotion gate and rollback, a cutover runbook with two timed rehearsals, push alerting so no scheduled job can fail silently, the remaining CI build jobs, live-scale load testing, an on-call and incident framework, a legal and compliance refresh, a player-support baseline, and TLS/DNS/secrets consolidation.]]></description>
    </item>
    <item>
      <title>Go-live planning: The internal roadmap now carries a target on every epic, a new top-level go-live epic…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-c92f42631beb</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:40 -0500</pubDate>
      <description><![CDATA[The internal roadmap now carries a target on every epic, a new top-level go-live epic with the month-by-month milestone table, and six newly tracked epics that the audit surfaced: client crash aggregation, player support systems, the localization pipeline rebuild, per-commit data validation in CI, host redundancy, and launch communications.]]></description>
    </item>
    <item>
      <title>Go-live planning: Published a public roadmap page at /roadmap/ : the player-safe rendering of the internal…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-6ac1af8b1919</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:39 -0500</pubDate>
      <description><![CDATA[Published a public roadmap page at <a href="https://catnipgames.net/roadmap/">/roadmap/</a>: the player-safe rendering of the internal roadmap, with the October 1 date, the road-to-launch timeline, and what comes after. It is served without a login next to this work log and ships with the same publish script.]]></description>
    </item>
    <item>
      <title>Vendor search: Started the replacement for the zone-limited vendor listings window. Listed items from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-2527c23e6bb3</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:38 -0500</pubDate>
      <description><![CDATA[Started the replacement for the zone-limited vendor listings window. Listed items from every town will live in a dedicated search index, kept current in real time by a service that follows the game database's own change feed (which also catches deletions made by expiry sweeps and admin tools that in-process hooks would miss), and queried by the client over the web instead of the game's rate-limited message channel. Wrote the full design into the plan of record, and stood up the first piece: the index service is provisioned on the test shard with least-privilege write/read accounts, locked to the game VM's private bridge, and its setup script proves the update-ordering and delete-tombstone guarantees on every run.]]></description>
    </item>
    <item>
      <title>Vendor search: Built and deployed the sync service that feeds the index. It runs beside the game servers…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-7641537f2fad</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:37 -0500</pubDate>
      <description><![CDATA[Built and deployed the sync service that feeds the index. It runs beside the game servers without touching them, streams every listing change from the database's change feed, and stamps each write with the database's own ordering so replays and races can never resurrect a sold item. It loaded the test shard's 286,321 existing listings in 34 seconds, and a synthetic listing showed up in search results 2 seconds after insert and vanished 2 seconds after delete, including changes made while the service was stopped (it resumes where it left off).]]></description>
    </item>
    <item>
      <title>Vendor search: Each indexed listing carries what the search list needs (name, price, quantity…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-c5e8acdff553</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:36 -0500</pubDate>
      <description><![CDATA[Each indexed listing carries what the search list needs (name, price, quantity, durability, the "+N" enchantment rating, town, vendor, seller) plus two stored payloads: a slim item for rows and the full item for tooltips. The rating and slim form are computed once when the item is listed, which is the fix for the earlier attempt that computed them per search and made things slower.]]></description>
    </item>
    <item>
      <title>Vendor search: The item names, enchantment scores, and zone names the indexer needs live only in the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e168c9af5e37</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:35 -0500</pubDate>
      <description><![CDATA[The item names, enchantment scores, and zone names the indexer needs live only in the game's asset data, so a new extraction script exports them (20,352 item names, 781 effect scores, 386 zones) as committed data files that deploy beside the service, with a self-test against known values.]]></description>
    </item>
    <item>
      <title>Vendor search: Three repair layers back up the live feed: a per-vendor count check every few minutes, an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-1d5ed83210e8</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:34 -0500</pubDate>
      <description><![CDATA[Three repair layers back up the live feed: a per-vendor count check every few minutes, an hourly refresh that catches vendors moving between towns, and a nightly full comparison of every listing id both ways. The first count check over the full index finished in half a second.]]></description>
    </item>
    <item>
      <title>Vendor search: Built and deployed the search endpoint the game client will call: a small query service…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-661da4bed791</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:33 -0500</pubDate>
      <description><![CDATA[Built and deployed the search endpoint the game client will call: a small query service in front of the index that accepts only a fixed set of parameters (search text, town, price range, a whitelisted sort), pages results with stable cursors, rate-limits per address, and holds a read-only credential, so no write path exists anywhere in the public-facing chain. World-wide searches require actual search text; grabbing everything at once is rejected.]]></description>
    </item>
    <item>
      <title>Vendor search: Locked the new pieces into the security posture the pre-deploy check enforces: the index…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-12517e0663c4</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:32 -0500</pubDate>
      <description><![CDATA[Locked the new pieces into the security posture the pre-deploy check enforces: the index and query ports are unreachable from the internet (verified from an outside vantage), reachable only from the game VM's private bridge and the web portal respectively, and the full security preflight passes on all the new assertions. The public web address for the search is staged and waits only on a DNS record.]]></description>
    </item>
    <item>
      <title>Vendor search: Wrote the team doc of record for the whole system (architecture, correctness model…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-d70d6d692e65</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:31 -0500</pubDate>
      <description><![CDATA[Wrote the team doc of record for the whole system (architecture, correctness model, operations runbook, measured numbers), marked the old zone-transfer performance doc as superseded, and added the Global vendor search epic to the internal and public roadmaps.]]></description>
    </item>
    <item>
      <title>Vendor search: Wrote the client side: the vendor listings window now pulls its rows from the search…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-7606625085f5</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:30 -0500</pubDate>
      <description><![CDATA[Wrote the client side: the vendor listings window now pulls its rows from the search service over the web when configured, with the original in-game download kept untouched as the automatic fallback. Rows arrive in a slim form (no per-item effect parsing, ratings pre-computed), a new Location column shows which town each listing is in, directions grey out for vendors in other towns, and hovering a row quietly fetches the full item for its detailed tooltip. Verified the whole data path against the test shard: an authenticated search returned a +16 two-handed sword with its rating riding along, and price/rating filters and paging all worked.]]></description>
    </item>
    <item>
      <title>Vendor search: Also confirmed the trickiest deletion path end to end: a test listing removed by the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-6ed25b1c8c59</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:29 -0500</pubDate>
      <description><![CDATA[Also confirmed the trickiest deletion path end to end: a test listing removed by the database's own timed cleanup (no game or sync code involved) disappeared from the search index on its own. Remaining before this reaches testers: the search box and all-towns toggle widgets in the window layout, a play-mode pass, and the usual gated client build.]]></description>
    </item>
    <item>
      <title>Vendor search: The public web endpoint for the search went live: name, certificate, and the proxy on the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-3a0822619014</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:28 -0500</pubDate>
      <description><![CDATA[The public web endpoint for the search went live: name, certificate, and the proxy on the web host, verified from the outside (secure redirect in place, searches without the client key are refused, a 50-row result page travels as about 8 KB compressed). The full hardening-header set is on, and the pre-deploy security check asserts all of it from now on.]]></description>
    </item>
    <item>
      <title>Vendor search: The first real in-game use surfaced a rate-limiter bug: fetching a town walks the results…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-ca3db1c26507</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:27 -0500</pubDate>
      <description><![CDATA[The first real in-game use surfaced a rate-limiter bug: fetching a town walks the results page by page, and the walk exhausted its own per-address request budget (made worse by the proxy chain making every player look like one address), so the search failed and correctly fell back to the old download. Fixed on both ends: the service now identifies real client addresses through both proxy hops, page continuations get their own generous budget while brand-new searches stay tightly limited, pages carry 500 rows instead of 200, and the client waits out a brief limit instead of giving up. Re-verified with a full walk of the largest market (13,766 listings, 28 pages, no refusals).]]></description>
    </item>
    <item>
      <title>Vendor search: The first run in a real (non-editor) client exposed the next bottleneck: the download…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e3d356115ad0</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:26 -0500</pubDate>
      <description><![CDATA[The first run in a real (non-editor) client exposed the next bottleneck: the download finished in 15 seconds, but building 13,766 result rows took another minute and a half, because in a built client every item asset load costs at least one frame through the async loading queue. The loader already had a fast synchronous mode it uses behind loading screens, so bulk callers can now opt into it; the vendor search does, behind its own loading spinner. Expected result is a big-town search in the twenty-second range in the real client, pending a rebuild.]]></description>
    </item>
    <item>
      <title>Vendor search: Profiling the search hitch frame by frame found the next layer: the client asked the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-22e8a36c3138</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:25 -0500</pubDate>
      <description><![CDATA[Profiling the search hitch frame by frame found the next layer: the client asked the asset system for each item type once per listing (13,766 requests that resolved to only about 1,000 unique types), and processed the whole batch inside a single frame. The loader now deduplicates bulk requests (which also speeds up plot decoration loading and the bank preload), and the search builds its rows in slices so no single frame carries the whole cost.]]></description>
    </item>
    <item>
      <title>Vendor search: A player found that the search only worked in the first zone visited: the window's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-3584a719994e</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:24 -0500</pubDate>
      <description><![CDATA[A player found that the search only worked in the first zone visited: the window's zone-change refresh relied on a marker that only the old download path recorded, so after an indexed search the next zone's window silently kept the previous zone's state. The search path now records the marker the same way, and a failed load no longer wedges the window shut until the refresh button is pressed.]]></description>
    </item>
    <item>
      <title>Quest tools: Started the Quest Graph editor tool. Quests in this game have no single quest object in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-431604775678</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:23 -0500</pubDate>
      <description><![CDATA[Started the <b>Quest Graph</b> editor tool. Quests in this game have no single quest object in code; each one is a chain of knowledge flags, journal tasks, dialogue gates, and reward descriptors spread across four separate authoring surfaces, connected only by string names that fail silently when mistyped. The tool reads every exported NPC conversation in the repository (2,303 conversations across 148 scenes) with the game's own parsers and builds the cross-reference index the game never had: which dialogue sets each flag, which gates read it, and which journal entries and rewards they connect to. A full index build takes about 4 seconds.]]></description>
    </item>
    <item>
      <title>Quest tools: Shipped the first working piece: a 16-rule validator over that index. It checks…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-4a38bfdb6492</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:22 -0500</pubDate>
      <description><![CDATA[Shipped the first working piece: a 16-rule validator over that index. It checks expression syntax, flags that are read but never written (with a did-you-mean suggestion for near-miss names), journal and task references, reward-descriptor resolution against NPC conversation prefabs, include-file integrity, and dialogue gates that can never pass.]]></description>
    </item>
    <item>
      <title>Quest tools: The first full run over live game data found 184 hard errors in shipped quest content…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-9ef7e06039b4</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:21 -0500</pubDate>
      <description><![CDATA[The first full run over live game data found 184 hard errors in shipped quest content: 105 task-complete actions naming tasks that do not exist, 51 flag reads that differ from their writers only by case or a one-letter typo (flag lookups are case sensitive, so those gates never open), 17 conversations with references that break the conversation load outright, and 9 malformed dialogue actions.]]></description>
    </item>
    <item>
      <title>Quest tools: Tuning the rules against runtime behavior mattered: duplicate keyword ids across shared…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-874172007526</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[Tuning the rules against runtime behavior mattered: duplicate keyword ids across shared include files are deduplicated by the game on purpose (2,537 initial warnings deleted as noise), while duplicate response ids make the game refuse to load the whole conversation (kept as errors). Reward descriptors turn out to bind to conversations through fields on the NPC prefab, not the prefab file name, which cut another 775 false alarms once read correctly.]]></description>
    </item>
    <item>
      <title>Quest tools: Verified the tool against the documented two-NPC reference quest with 16 automated editor…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-6f734a391277</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[Verified the tool against the documented two-NPC reference quest with 16 automated editor tests, including one that asserts the tool reproduces that quest's full flag, journal, and reward wiring exactly.]]></description>
    </item>
    <item>
      <title>Quest tools: Validation also runs headless with a per-rule baseline, so continuous integration can…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-c6c28d6b1ae9</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[Validation also runs headless with a per-rule baseline, so continuous integration can fail on newly introduced quest errors without demanding the legacy backlog be fixed first.]]></description>
    </item>
    <item>
      <title>Quest tools: Wrote the plan of record for the remaining milestones (automatic quest clustering, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-a1eb9b06d4bb</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[Wrote the plan of record for the remaining milestones (automatic quest clustering, the node-graph canvas, scene-reference cross-checking, and eventually visual quest authoring with git as the source of truth) and added the Quest Graph epic to the roadmap.]]></description>
    </item>
    <item>
      <title>Quest tools: Built the clustering pass that turns the flat pile of 2,477 flag names into recognizable…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-f5f3291c19f0</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Built the clustering pass that turns the flat pile of 2,477 flag names into recognizable quests: name-stem grouping plus journal stitching discovered 677 quest clusters, with high-traffic story flags (the virtue paths, oracle state) deliberately kept from gluing unrelated quests together. The largest cluster is the starter-island quest chain at 191 connected pieces; the tool also exported all 314 non-trivial quests as reviewable graph files.]]></description>
    </item>
    <item>
      <title>Quest tools: Opened the first version of the visual canvas: a Quest Graph editor window with a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-78ea5ef65f11</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[Opened the first version of the visual canvas: a Quest Graph editor window with a searchable quest list showing per-quest error counts, an automatically laid-out node graph of each quest's flags, dialogue steps, journal tasks, and rewards, error badges pinned to the affected nodes, an inspector showing the underlying dialogue text and actions for any node, and a findings list that jumps the view to the offending node on double click.]]></description>
    </item>
    <item>
      <title>Quest tools: The editor test suite for the tool grew to 19 tests, including one that asserts the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-cc29c6949ffe</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[The editor test suite for the tool grew to 19 tests, including one that asserts the reference quest's discovered cluster contains exactly its own flags, journals, and NPCs and nothing else, and one that guards against the clustering ever collapsing into one giant blob.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The per-flavor client build jobs and the nightly server-report job wrote Unity's entire…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-2c2c9441735a</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[The per-flavor client build jobs and the nightly server-report job wrote Unity's entire output to a log file on the agent, so a successful build's console showed only the pipeline steps and the packaged-artifact line, and the log itself was overwritten by the next run. The jobs now stream that log into the build console while Unity runs: the Windows path tails the file by byte offset inside the existing exit-poll loop, the Linux path follows it with a background tail, and both handle Unity recreating the log on a licensing retry. The on-failure tail of the last hundred lines stays as a fallback.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Documented the new console behavior in the build-machine notes, including the plain-text…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-b20c344d54bd</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Documented the new console behavior in the build-machine notes, including the plain-text console view for very large full-build logs.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Reviewed the never-yet-run server-build and release jobs end to end and fixed what the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-984a24a55e34</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Reviewed the never-yet-run server-build and release jobs end to end and fixed what the review found. The server job never cleaned old zips out of its workspace, so every run would have re-archived its predecessors' packages, and the release job, which unzips the first zip it finds, could have deployed an old server build. It also built whatever happened to sit in the build tree; it now updates the tree to current source first (on by default), sweeps the assemble directory before packaging so removed files can't linger into future releases, and runs under a timeout so a hung compile can't occupy the build node indefinitely.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Hardened the release job the same way. The confirmation prompt for non-test channels used…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-cedc0b48fe3d</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Hardened the release job the same way. The confirmation prompt for non-test channels used to hold the node's only executor while waiting for a human answer, which would have frozen every other job sharing that machine; it now asks before taking the executor. The job also reads the build manifest inside each client package and refuses anything that isn't a successful full build (a quick build can carry a plausible version number but no asset bundles), routes each artifact to its own platform's patch channel instead of assuming Windows, and unpacks the multi-gigabyte client zip with the native unzip tool instead of the controller's slower built-in.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Added a dry-run option to the release job that rehearses the whole flow (artifact copy…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-d094d9c746be</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Added a dry-run option to the release job that rehearses the whole flow (artifact copy, unpack, manifest checks, argument wiring) without changing anything on the server or patch host, and ran it for the first time. The job side all passed, the manifest gate correctly flagged the only available artifact as a non-releasable test build, and the run surfaced one missing tool on the deploy machine (its PowerShell interpreter), which is now part of the machine's provisioning script.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Reviewed the last Windows client build's full log. The build itself passed cleanly (zero…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-c44a078a2371</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Reviewed the last Windows client build's full log. The build itself passed cleanly (zero compile errors, artifact archived), but the review found the console streaming above never actually rendered on the Windows agent: the console layer drops partial-line writes, and the tail wrote raw chunks, so a 51-minute passing build still showed an effectively empty console. The tail now emits whole lines and holds an unfinished line until its newline arrives.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The same log showed the Windows build agent gets nothing from the shared asset-import…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-28f0fd35ac60</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[The same log showed the Windows build agent gets nothing from the shared asset-import cache: the committed project settings point at a loopback address that only exists on the Linux build machine, so the build retried the connection the whole way through and reimported everything itself. Documented the per-node cache address override that fixes it and the log line that verifies the first connected build.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The nightly server-report job can hold the only Windows build slot for hours, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-df0ec050aeec</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[The nightly server-report job can hold the only Windows build slot for hours, and overnight its timer queued a second copy behind a still-running first one, jamming a client build and a server build in between. The job no longer queues a duplicate while one is running.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Headless server-report runs no longer pop editor dialogs. Every generator in the report…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e551c9f40a40</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Headless server-report runs no longer pop editor dialogs. Every generator in the report suite ended by opening a Success or Failure dialog, and in a headless run each one logs a warning plus a stack trace. The dialogs now route through a helper that prints a single log line when no editor UI exists and behaves as before in the editor.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Filed tracker follow-ups from the same review: the Unity licensing handshake race that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-4c6997bb5f12</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Filed tracker follow-ups from the same review: the Unity licensing handshake race that now hits every build on the Windows agent (a scripted retry currently masks it), and a spot-check that spline event hooks authored in scenes still serialize under the new engine's stricter serialization rules.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The nightly server-report job is live end to end (Gitea #140). Activating it meant…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-5cb05d9f59ca</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[The nightly server-report job is live end to end (Gitea #140). Activating it meant standing up the build farm's seed machinery for real: the job-generator seed job and a build-tree update job now exist on the controller, with the seed reading the CI scripts from the controller's local clone after every git-checkout approach failed against a repository this size. Getting the first green run took four fixes found by supervised runs: the Windows node refuses bare batch names from the working directory (an environment setting), backslashes in the job scripts needed escaping, the editor-automation plugin had to be stashed for the batch run the same way client builds do (an outside tool could otherwise reach into the CI editor mid-generation, and its shutdown noise failed the log scan), and the log scan itself now fails only on real failure signatures instead of any exception text.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Release wiring for the reports is in place on both paths: the release job copies the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-193d4e5f959d</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Release wiring for the reports is in place on both paths: the release job copies the newest report artifact and hands it to the server deploy, and a new fetch script pulls the same artifact into a working copy for hand-run deploys. The deploy scripts accept an explicit reports directory all the way down.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Validated the first Unity 6 report output against the June incident: the combined report…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-367af78654d0</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Validated the first Unity 6 report output against the June incident: the combined report carries 1,905 scenes and all 442 player-owned towns, including the town whose houses vanished on June 29 because the old reports had gone stale. The artifact-fetch path was verified end to end from a developer checkout; no deploy was performed.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The release job's version gate tripped on its first real run: every client package's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-7540ed02340f</guid>
      <pubDate>Thu, 02 Jul 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[The release job's version gate tripped on its first real run: every client package's manifest recorded build number 0, even though the number was correctly stamped into the client itself. The stamp rewrites the version source file on disk mid-build, but the manifest writer read the already-compiled constant from before the rewrite. The manifest now reads the stamped number back from the same file the client was built from, so the two can no longer disagree.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Provisioned the deploy machine for real releases: the interpreter the deploy scripts run…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-b4d335b63ff4</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Provisioned the deploy machine for real releases: the interpreter the deploy scripts run under is installed, and the release job's service account now holds the credentials it needs to reach the test shard and the patch host, verified with a login to each.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Rebuilt both release halves from current source so they ship as a matched pair (the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-5471c50859d9</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Rebuilt both release halves from current source so they ship as a matched pair (the previous server package predated this week's GM server changes), and the first rehearsal of the release job passed end to end: the version gate read the corrected manifest, and the deploy script resolved its keys and targets with no changes made.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The first real run then stopped at the report-combining step: the tool that merges the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-c4fa1612197f</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[The first real run then stopped at the report-combining step: the tool that merges the per-scene server reports is a Windows executable that had never been staged on the deploy machine. Staged it with its runtime, taught the refresh script to run it on non-Windows hosts, and folded both into the machine's provisioning script.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The release pipeline completed its first fully automated end-to-end run: fresh scene…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-d873c6cf0a83</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[The release pipeline completed its first fully automated end-to-end run: fresh scene reports combined and validated, the server shipped to the test shard and confirmed ready, the client published to the patch channel with unchanged files deduplicated against the previous build, the channel pointer flipped, and the closing login smoke-test passed. The public channel now serves the new build.]]></description>
    </item>
    <item>
      <title>Build farm / CI: The server half of the release then went out for real, and every safety net held: fresh…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-4634f200fb35</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[The server half of the release then went out for real, and every safety net held: fresh scene reports were combined and validated (1,905 scenes, all 442 player towns), the build shipped to the test shard, and the game service restarted and reported ready. The client half stopped in the publish script, whose transfer step assumed the Windows flavor of rsync when picking its login transport; it now uses the system one on Linux hosts.]]></description>
    </item>
    <item>
      <title>Build farm / CI: Caught the next missing dependency before it could fail a release: the client-publish…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-1b99d2f81bca</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Caught the next missing dependency before it could fail a release: the client-publish step builds and runs a small .NET tool, and the deploy machine's system packages only offer a newer runtime that cannot run it. Installed the correct one from the official installer, verified the tool builds under the release job's account, and added it to the provisioning script.]]></description>
    </item>
    <item>
      <title>Patch host: Added automatic build retention on the patch host. A daily job keeps the newest three…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-672c9b498f0e</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Added automatic build retention on the patch host. A daily job keeps the newest three builds per platform, plus any build a channel pointer still references, and deletes the rest; old numbered launcher executables are pruned the same way, keeping the three newest per family and whatever the launcher pointer names. Deleting an old build cannot strand a player: the updater syncs a client against its own installed files, never against old builds on the host, so any prior version still converges to latest. The first run removed seven old builds and two old launcher executables, freeing about 75 GB.]]></description>
    </item>
    <item>
      <title>Patch host: The publish script now applies the same keep-three rule to its local staging area after…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-79ae22cbd8c7</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[The publish script now applies the same keep-three rule to its local staging area after each successful push, and the retention policy is documented in the patcher notes and marked resolved in the replacement plan's open items.]]></description>
    </item>
    <item>
      <title>Launcher: Added a Graphics option to the launcher, next to the Play button: DirectX 12 (the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-3d4455b96398</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Added a <b>Graphics</b> option to the launcher, next to the Play button: DirectX 12 (the default) or DirectX 11. The choice is saved with the launcher settings, remembered between runs, and applied to the game's command line every time it starts.]]></description>
    </item>
    <item>
      <title>Launcher: Compiled DirectX 11 support back into the Windows client so the new option has something…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-c884b61a491f</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Compiled DirectX 11 support back into the Windows client so the new option has something to switch to on machines where DirectX 12 misbehaves; DirectX 12 stays the default renderer.]]></description>
    </item>
    <item>
      <title>NPC barks and voices: Right-clicking an NPC that barks now offers a Mute option (and Unmute to undo it). Muting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-8500ad467854</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Right-clicking an NPC that barks now offers a Mute option (and Unmute to undo it). Muting silences that character's ambient barks for you: the overhead bubble, the chat-log line, and the spoken bark all stop, while deliberate conversations still work and speak normally. The list is stored with your local client settings and covers every copy of a generic NPC, so muting one town crier mutes them all.]]></description>
    </item>
    <item>
      <title>NPC barks and voices: Added three checkboxes to the Audio options tab: NPC Barks turns off all ambient barks…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-65c5b7b9f1bc</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Added three checkboxes to the Audio options tab: NPC Barks turns off all ambient barks, NPC Attack Barks turns off just the combat and aggro callouts, and NPC Spoken Dialog turns off all NPC voice audio (dialog text is unaffected, and a line already playing stops immediately). All of these filter only what your client shows and plays; bark behavior for other players and the servers is unchanged.]]></description>
    </item>
    <item>
      <title>NPC barks and voices: The NPC voice cache is now player-managed. Voice clips already download once and replay…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-2c8697d41c6c</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[The NPC voice cache is now player-managed. Voice clips already download once and replay from disk; a new Voice Cache Size dropdown in the Audio options caps that cache (256 MB to 8 GB or Unlimited, default 1 GB), and when the cache grows past the cap the client deletes the least recently played clips in the background.]]></description>
    </item>
    <item>
      <title>NPC barks and voices: The Audio options also show the voice cache's current file count and size on disk…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-3fd642c41114</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[The Audio options also show the voice cache's current file count and size on disk, updated live, next to a Clear button. Clearing asks for confirmation first and explains that clips will download again as NPCs speak.]]></description>
    </item>
    <item>
      <title>NPC barks and voices: The audio settings outgrew their window with these additions, so the Audio tab now clips…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-06491f4e41ae</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[The audio settings outgrew their window with these additions, so the Audio tab now clips and scrolls like the video and controls tabs, wheel and scroll bar included.]]></description>
    </item>
    <item>
      <title>NPC barks and voices: Wrote up the full recipe for adding a client option (settings flag, options-screen…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-95717bb80d70</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Wrote up the full recipe for adding a client option (settings flag, options-screen binding, and the checkbox row in the options window) in the team docs, including the persisted-list pattern the mute feature uses, and extended it with the dropdown row, action-button-with-confirmation, and tab scroll view patterns from the cache manager work.]]></description>
    </item>
    <item>
      <title>Options menu: Went through the entire Options menu and gave every setting a hover tooltip. The Audio…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-0d7571b0de9a</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Went through the entire Options menu and gave every setting a hover tooltip. The Audio and Video tabs previously had almost none; their 41 sliders, checkboxes, and dropdowns now describe what they do, including the performance cost of the graphics settings.]]></description>
    </item>
    <item>
      <title>Options menu: Rewrote the 65 existing tooltips from one-line labels into two or three sentences that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-3eb77fea4d09</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Rewrote the 65 existing tooltips from one-line labels into two or three sentences that cover the effect of turning each option on or off. Each keeps its translation id, so existing translations stay attached and only the new English needs a follow-up pass.]]></description>
    </item>
    <item>
      <title>Creature audio: Fixed a warning flood from the Redthorn flower: its shared plant sound controller only…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-8fc99f124c08</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Fixed a warning flood from the Redthorn flower: its shared plant sound controller only knew the man-eater skeleton's root bone, so every Redthorn spawn failed to attach its three audio sources and logged about 70 warnings per session on the test shard. The controller now falls back to the Redthorn's own root bone; the man-eater plants still attach as before.]]></description>
    </item>
    <item>
      <title>GM tools: Started a single in-game GM tool for the dev/GM client to replace the pile of memorized…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-2415437042c7</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Started a single in-game GM tool for the dev/GM client to replace the pile of memorized chat commands used during events. A <b>/gm</b> command (or a bindable key) opens a set of draggable, resizable windows; typing in a tool field no longer moves the character, and window positions are remembered per machine. Two windows shipped first; the players-online roster and the prize-mail window follow with their server-side operations.]]></description>
    </item>
    <item>
      <title>GM tools: The main panel leads with a large two-state ghost-mode button that always shows the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-00c8aa5b9a6f</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[The main panel leads with a large two-state ghost-mode button that always shows the current state (it stays in sync with the chat command too), plus a fly-mode toggle and an info block with the current zone, position with a copy button, frame rate, time scale, game time, and account flags.]]></description>
    </item>
    <item>
      <title>GM tools: The event panel covers the common event verbs: scene time dilation with a slider and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-53cebc71c0f8</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[The event panel covers the common event verbs: scene time dilation with a slider and reset, timed stat buffs for a single player or everyone in the scene (with a confirmation step), and a weather picker. Player, stat, and weather fields all use a new fuzzy-search autocomplete. Scene-wide time-of-day controls are visible but disabled until the server-side support lands.]]></description>
    </item>
    <item>
      <title>GM tools: The tool only exists in GM builds, and the release-build hygiene check now also scans…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-2e510a851b36</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[The tool only exists in GM builds, and the release-build hygiene check now also scans finished release output for the new tool's code and fails the build if it ever leaks in.]]></description>
    </item>
    <item>
      <title>GM tools: Added three server operations for the tool, each re-checked server-side for GM access: an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-5f296df4cda8</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Added three server operations for the tool, each re-checked server-side for GM access: an online-player roster (character, account, zone, time online), a prize-mail operation that creates reward items and gold directly in a recipient's mailbox (recipient can be offline, inbox limits honored, every granted item logged), and a character search that matches character or account names, offline players included.]]></description>
    </item>
    <item>
      <title>GM tools: Shipped the Players Online window on top of the roster: a filterable list of everyone on…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-d3fe28937440</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Shipped the Players Online window on top of the roster: a filterable list of everyone on the shard with per-row actions — teleport to the player (turning ghost mode on first so you arrive unseen, across zones too), send a customer-service message, mute or unmute their chat, and summon them to you.]]></description>
    </item>
    <item>
      <title>GM tools: While wiring the client side, found that the client's copy of the generated…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-575ec68dc652</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[While wiring the client side, found that the client's copy of the generated network-interface file carries a few hand-added operations the server's generator no longer produces; merged the new operations in surgically instead of replacing the file, and noted the drift for a future reconciliation.]]></description>
    </item>
    <item>
      <title>GM tools: Shipped the prize Mailbox window, completing the four-panel set: pick a recipient by…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-87fa89f36fb9</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Shipped the prize Mailbox window, completing the four-panel set: pick a recipient by character or account name (offline players included), stage up to twenty items from a fuzzy search over the full item catalog plus optional gold and a subject line, confirm, and the prizes land in the recipient's mailbox without ever touching the GM's inventory. Failures such as a full inbox are reported in plain words.]]></description>
    </item>
    <item>
      <title>GM tools: The event panel's time-of-day controls went live: a GM can now set the hour for everyone…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-9a47a8f2f4c9</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[The event panel's time-of-day controls went live: a GM can now set the hour for everyone in the scene and freeze or unfreeze the day/night cycle there, using the same scene-property mechanism as the weather override. The server only accepts the change from GM accounts, players arriving mid-event see the overridden sky immediately, and Clear returns the scene to the server clock.]]></description>
    </item>
    <item>
      <title>GM tools: Fixed a crash lurking in the existing time-of-day console commands: they assumed the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-71d26406fa00</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Fixed a crash lurking in the existing time-of-day console commands: they assumed the scene has a sky system, which the login/menu scenes do not.]]></description>
    </item>
    <item>
      <title>GM tools: Wrote the team reference for the whole suite: every window, the server operations behind…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e5e9407e1e3a</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Wrote the team reference for the whole suite: every window, the server operations behind them, the deploy coupling, and the build-stripping guarantee, plus the sharp edges found along the way.]]></description>
    </item>
    <item>
      <title>GM tools: First real-account test caught a lockout: the tool's open check required a legacy "GM…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-324c7cd92dd7</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[First real-account test caught a lockout: the tool's open check required a legacy "GM power" character stat that nothing in the project ever sets, so even dev and admin accounts were refused. The check is now the account flag alone (the server still verifies every operation), and a refused /gm says why in chat instead of failing silently.]]></description>
    </item>
    <item>
      <title>GM tools: Fixed the Players Online roster showing a stale zone after a player moved to a new scene…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-64bd7a377b14</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Fixed the Players Online roster showing a stale zone after a player moved to a new scene. The roster read the zone from the player's cached login record, which only refreshes on a full reconnect; it now reads the room the player is actually in, so a Refresh reflects the current zone.]]></description>
    </item>
    <item>
      <title>Release build hygiene: The first release-configuration build since the hygiene work started stripping the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-80e11531a127</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[The first release-configuration build since the hygiene work started stripping the developer define failed to compile: the test-harness auto-login referenced developer-only options without a guard, invisible in dev builds where the define is always on. Guarded it (and the harness's automation credential hook, which compiled in release but should never ship in one) to match their developer-only callers, and swept the codebase for other unguarded developer-only references - none remain.]]></description>
    </item>
    <item>
      <title>Release build hygiene: The rebuilt release client then passed compilation but tripped its own leak scanner on…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-8aea73ccc086</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[The rebuilt release client then passed compilation but tripped its own leak scanner on one finding, which turned out to be the scanner's bug: it matched forbidden developer symbols as substrings, so a legitimately shipping property whose name contains one (every player's client must handle a ghost-mode GM standing nearby) read as a leak. Both scanners (the in-build step and the standalone checker) now match whole names only, verified byte-level against the real build output; the actual developer-only symbols are confirmed absent, and the release build now passes hygiene end to end.]]></description>
    </item>
    <item>
      <title>Release build hygiene: Audited every app we build (the game client in all its variants, the server, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-83b593152677</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Audited every app we build (the game client in all its variants, the server, the launcher, and the bundled companion) for developer and debug code left in release builds. A compiler-options file carried over from the old workspace was adding the developer/GM define to every script compilation, so the whole GM tooling surface (developer console, GM commands, the automation control bridge) was being compiled into every client build, release ones included.]]></description>
    </item>
    <item>
      <title>Release build hygiene: The release build now removes that file for the duration of the build and puts it back…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-be4ccf0616fb</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[The release build now removes that file for the duration of the build and puts it back afterward, then scans its own finished output for GM symbols, developer-connection switches, and debug symbol files and fails the build if it finds any. Intent isn't trusted; the produced files are checked. Developer builds keep the tooling on purpose, which is also how the test-shard build now gets the control bridge without a special flag.]]></description>
    </item>
    <item>
      <title>Release build hygiene: A GM build can no longer be produced in the release configuration at all; the build…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-0cbce17b99ec</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[A GM build can no longer be produced in the release configuration at all; the build refuses the combination, and the build record now reports the tooling state truthfully instead of from the requested flag.]]></description>
    </item>
    <item>
      <title>Release build hygiene: Every build now strips the build machine's own network addresses out of the client's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-4f868ef4f66b</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Every build now strips the build machine's own network addresses out of the client's startup config file. Unity writes one line per network interface into development builds, and those get published to the public patch host for the test shard, so they were shipping internal addresses to anyone who downloaded the client.]]></description>
    </item>
    <item>
      <title>Release build hygiene: Release client builds no longer ship the companion app's debug symbol files, and the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-1b67daf06179</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Release client builds no longer ship the companion app's debug symbol files, and the publish step drops all symbol files and refuses to send anything but a clean release build to a player channel.]]></description>
    </item>
    <item>
      <title>Release build hygiene: Added a standalone build-hygiene scanner and wired the same checks into the pre-deploy…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-8788b4c9694b</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Added a standalone build-hygiene scanner and wired the same checks into the pre-deploy security preflight, which now also reads what each live patch channel is actually serving. Documented the policy and the four enforcement points, and filed follow-ups for two existing leaks on the host (an old build that shipped generated source and symbols, and the current test-shard build's address lines) plus a server rebuilt in release mode.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: The report job's first Unity 6 run caught a real engine-behavior change: asset…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e716d594e86e</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[The report job's first Unity 6 run caught a real engine-behavior change: asset enumeration in the editor now surfaces loaded prefab assets alongside scene objects, so the housing-plot validator saw the two "for sale" sign prefabs themselves (whose plot reference is empty by design at the asset level) and failed validation in all 69 housing-capable scenes. Worse, the non-validating path could have written scene plot data onto the prefab assets, and the plot-renaming utility could have renamed them. All four sweeps now consider scene instances only; the next report run came back with zero validation errors, including a duplicate-plot-name error that turned out to be the same artifact.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Fixed the console warning "the tree must use the Nature/Soft Occlusion shader" that fired…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-adb152d6146d</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Fixed the console warning "the tree must use the Nature/Soft Occlusion shader" that fired for four terrain tree types (two ficus variants, a bare trunk, and a thin tree) used as tree prototypes on more than 50 scene terrains across Novia, Hidden Vale, battlecamps, random encounters, and player villages. The engine only demands that shader when a tree prefab has no LOD group; the four prefabs now carry one, and the warning stops with no change to the trees' materials or appearance.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Finding the affected terrains took a byte-level scan of the binary terrain data, since…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-8206e6db7439</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Finding the affected terrains took a byte-level scan of the binary terrain data, since tree prototype references there are invisible to text search. The same tree prefabs are also placed directly in 46 scenes, so the new LOD group is set to never cull and those placements render exactly as before.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Cape cloth had gone slow and choppy under the new engine. Cloth is simulated on the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-b36482ef0542</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Cape cloth had gone slow and choppy under the new engine. Cloth is simulated on the physics tick, and the client's physics tick runs at 10 per second; the old engine hid that with a cloth sub-stepping setting that the new engine dropped, so capes were suddenly updating only ten times a second. Raised the physics tick to 60 per second so cloth simulates smoothly again, and removed the now-defunct cloth setting from the equipment code.]]></description>
    </item>
    <item>
      <title>Security: Ran a security audit of how passwords, credentials, and access keys are stored and passed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-0edf71b65a07</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Ran a security audit of how passwords, credentials, and access keys are stored and passed around across the project's tooling and infrastructure. Wrote up the findings and a hardening plan in the internal docs; no changes applied yet.]]></description>
    </item>
    <item>
      <title>Localization: Filled French with the same machine-translation pipeline that finished German and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-914bffe4db1a</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Filled French with the same machine-translation pipeline that finished German and Portuguese, taking it from 53.0% to 99.6% coverage. All 55,668 missing lines were translated in a bulk pass, then re-checked line by line against the game's markup rules (keyword links, gender and plural selectors, formatting tags); anything that failed was re-translated automatically, and the last stubborn records were retried with their exact validation error fed back in. Every remaining gap is the separate book text, which ships on its own track.]]></description>
    </item>
    <item>
      <title>Localization: NPC dialogue, which was the largest hole, went from 55% to 100% translated: 45…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e748b1faffb5</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[NPC dialogue, which was the largest hole, went from 55% to 100% translated: 45 conversation zones that had no French at all now have full French. The 43 conversation files that were previously untranslated shipped as new client language data.]]></description>
    </item>
    <item>
      <title>Localization: Ran a meaning-and-grammar review over the machine-translated lines. Heuristics flagged…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-ae6d63263dfb</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Ran a meaning-and-grammar review over the machine-translated lines. Heuristics flagged 1,710 candidates for a closer look; the review confirmed most as fine and applied 146 validated corrections, with 27 lower-confidence lines set aside for a native speaker.]]></description>
    </item>
    <item>
      <title>Localization: Serialized the finished French into the client language bundles and deployed to the test…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-539b86718c6a</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Serialized the finished French into the client language bundles and deployed to the test shard. The coverage snapshot doc now records French alongside German and Portuguese as complete for the in-game deploy set.]]></description>
    </item>
    <item>
      <title>Localization: Researched Japanese language support and wrote the plan. Most of the machinery is already…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e7159350abe7</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Researched Japanese language support and wrote the plan. Most of the machinery is already in place: the machine-translation pipeline that filled French runs unchanged for Japanese, the UI already wraps Japanese text correctly, and chat, mail, and character names already accept it. The new engineering is a Japanese font (no font in the game carries the glyphs today) and live testing of Japanese text entry.]]></description>
    </item>
    <item>
      <title>Localization: The plan makes a politeness style guide and native-speaker review prerequisites for the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-1727c4a4d53c</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[The plan makes a politeness style guide and native-speaker review prerequisites for the Japanese translation pass, since machine translation is weakest at Japanese honorifics. Whether Japanese joins the October translation wave or lands later with the planned Asian shard is left as an open decision (Gitea #161).]]></description>
    </item>
    <item>
      <title>In-game Oracle: Hardened the Oracle assistant against answering from its language model's built-in memory…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-d732aecf6dc1</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Hardened the Oracle assistant against answering from its language model's built-in memory of the game, which can be outdated or simply invented. Its instructions now require every game fact it states (numbers, names, places, mechanics) to come from the curated knowledge base or the recipe data it looked up during that conversation, with no borrowing from the older game it may "remember" or from the Ultima series.]]></description>
    </item>
    <item>
      <title>In-game Oracle: Added a server-side safety net behind those instructions: a gameplay answer produced…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-28bc8cf87ce6</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Added a server-side safety net behind those instructions: a gameplay answer produced without consulting the knowledge base or recipe data gets sent back once with an order to look it up or admit the gap, and every logged unanswered question now records whether the answer was grounded in real lookups.]]></description>
    </item>
    <item>
      <title>In-game Oracle: Fact-checked all 38 Oracle knowledge-base topics claim by claim against the game's data…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-3dbcec7ad72d</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Fact-checked all 38 Oracle knowledge-base topics claim by claim against the game's data files, dialogue sources, and code: 1,762 claims checked, 1,229 confirmed, 497 corrected, 36 unsupportable details removed. Corrections ranged from combat math (Rapid Fire fires 8 arrows for 4.25 times weapon damage in a descending sequence) to lore (Arabella, wife of Lord British, is regent of New Britannia; the doc had named Ronin) to creature behavior (adult dragons have wing slap and wing gust attacks; the doc claimed they had none).]]></description>
    </item>
    <item>
      <title>In-game Oracle: Several magic guides described a smooth day-night power curve for Sun and Moon spells…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-159dd7fd9399</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Several magic guides described a smooth day-night power curve for Sun and Moon spells; the real bonus is simply on while the sun is up (or the moon in orbit) and off otherwise, and it works indoors. Attunement math, ward behavior, reagent consumption chances, the whole mounts guide, and the interact key (E; the docs said F) were corrected the same way.]]></description>
    </item>
    <item>
      <title>In-game Oracle: Every knowledge-base topic now has an internal source manifest recording which game files…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-e8856f903b6b</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Every knowledge-base topic now has an internal source manifest recording which game files its claims were verified against and when, plus a full audit report, so future edits get re-checked against data instead of written from memory.]]></description>
    </item>
    <item>
      <title>In-game Oracle: Mapped the next round of Oracle topics: a ranked 15-entry gap list (death and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-1c2c71e20d50</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Mapped the next round of Oracle topics: a ranked 15-entry gap list (death and resurrection, housing, travel, currencies, and pets lead it) went into the audit report, each screened against the content exclusions and paired with the game data it would be written from.]]></description>
    </item>
    <item>
      <title>Client UI: Nameplates over shrunken players no longer scale down without limit. The nameplate still…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-105ec4fd9d8f</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Nameplates over shrunken players no longer scale down without limit. The nameplate still shrinks along with the character, but it now stops at half its normal size, so names stay readable under shrink effects.]]></description>
    </item>
    <item>
      <title>Agent tooling: Rewrote the repo's AI-agent instructions (CLAUDE.md) and the agent's persistent working…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-02-f1098b9a66aa</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Rewrote the repo's AI-agent instructions (CLAUDE.md) and the agent's persistent working notes in a compact, directive-only format, roughly half the previous size, and added a standing style rule so future agent-facing notes stay that way. Team-facing docs are unchanged.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-07-01</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-headlines</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The plan for replacing the game's licensed, Windows-only server networking stack (Photon) is now written end to end and approved. The direction changed from the old draft: instead of re-implementing Photon's wire format byte-for-byte, the servers and the client's transport move together to a clean new protocol underneath the game's existing message layer, with the servers hosted natively on Linux. The plan covers feasibility spikes, a parallel test universe on the test shard, a staged cutover with timed rollback drills, and area-of-interest filtering as the final scale phase; it was fact-checked against the code and hardened by several rounds of engineering review before approval. Phase 0 starts now.</li>
        <li>Bug reports through the in-game Oracle can now carry a picture. When the Oracle confirms a bug it asks whether to include a screenshot of what you're seeing; say yes and the game captures the screen and attaches it to the team's issue automatically. The Oracle window hides itself for the shot, so the picture shows the bug rather than the conversation about it.</li>
        <li>Vendor search in large player-owned towns now loads in about fifteen seconds, down from the two to three minutes it used to take. The client builds the results list once when the download finishes instead of rebuilding it on every item as they stream in, the server does its per-item database lookups once per vendor instead of once per item, and page sizing was fixed so a batch that lands on several large items can't exceed the per-message limit and fail the whole search. A separate experiment to send a slimmed-down item record was tried and dropped: it cost more server work than it saved on the wire.</li>
        <li>Switched the Windows client to DirectX 12 as its only graphics API, replacing DirectX 11. A measured in-world benchmark put DirectX 12 and DirectX 11 within a few percent on frame rate, so the move is for engine capabilities we want next rather than raw speed; DirectX 12 was excluded from being a plain speed play by the fact that the client is bound by the main thread and the GPU, not by render-thread draw submission. Vulkan was left out because it isn't stable on the current content.</li>
        <li>A years-old pet-data leak that could permanently lock a player out of the world is fixed for good. Records for tamed pets were never cleaned up when their taming necklace was destroyed, sold, or traded away; once enough piled up on an account, the server could no longer send that character's pet data at all, the world never finished loading, and the account needed hand-edits to the database every month. The server now removes a pet's record the moment its necklace leaves the account, heals already-bloated accounts automatically on their next load, and support gained report and cleanup commands that retire the monthly manual fix.</li>
        <li>The automated client-control harness graduated from watching the game to playing it. A test client can now inspect its surroundings, inventory, and skills; target, interact, use skills and items, and equip gear; run an approved set of developer-console setup commands; and craft a recipe at a station end to end, ingredients to finished item. Everything rides the same code paths a real player drives, so game rules and the server's permission checks stay in force.</li>
        <li>A new <b>Recipe Studio</b> editor window puts the whole crafting-recipe workflow in one place, replacing raw Inspector work spread across several disconnected menus. All four planned milestones landed today: browse and search the roughly 3,300 recipes (by name, ingredient, result, school, or skill level), error-check the whole library in the background with checks the old validator never had, edit recipes in-window with live validation and duplicate-ingredient warnings, and create new recipes through a guided wizard that clones an existing recipe, handles naming and recipe-book placement, and reminds you when the server's recipe database needs regenerating.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Rewrote the Photon-replacement migration plan against the post-Unity-6 reality and got it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-aade3d555b07</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Rewrote the Photon-replacement migration plan against the post-Unity-6 reality and got it approved. The old draft assumed the shipped client could never change, which forced re-creating Photon's wire format byte-for-byte on the server; with the launcher now shipping client updates routinely, that premise no longer holds. The new plan moves server and client transport together to a clean new protocol beneath the game's existing message envelope, keeps the game code compiling unchanged behind a compatibility layer on each side, hosts the servers natively on Linux, and replaces the old weak wire encryption with a modern scheme. Cutover is staged: feasibility spikes first, then a parallel universe on the test shard, a low-risk pilot on the logging service, a full test-shard cutover with a timed rollback drill, and only then the live window.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): The plan went through several review rounds before approval: an adversarial pass that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-a22e8b7bdbc9</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[The plan went through several review rounds before approval: an adversarial pass that confirmed thirteen problems (among them two customer-service tools that also speak Photon and would have broken at cutover, and the fact that the live deployment spans multiple machines), and two rounds of engineer feedback that corrected the transport channel semantics, tightened the rollback data-safety story, upgraded the crypto section to a buildable spec, and fixed a wrong scheduling assumption about how this program competes with the render-pipeline work for the same client. All findings are folded into the plan with a ledger of what changed and why.]]></description>
    </item>
    <item>
      <title>Server networking (Photon replacement): Marked the old plan superseded, rewrote the roadmap epic to match, and extended the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-c3217e06ea4a</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Marked the old plan superseded, rewrote the roadmap epic to match, and extended the Photon API-surface reference with every consumer of the old networking stack beyond the game client (the bot-test client, the customer-service tools, a scheduled moderation job) so nothing breaks unnoticed when the wire changes.]]></description>
    </item>
    <item>
      <title>Rendering: Set the Windows player's graphics API to DirectX 12 only, dropping DirectX 11 and Vulkan…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-960b83295d46</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Set the Windows player's graphics API to DirectX 12 only, dropping DirectX 11 and Vulkan. Benchmarked all three in-world first, driving a test client through the control harness onto the overworld and a town: DirectX 12 matched DirectX 11 on frame rate, because the client is limited by the main thread and the GPU rather than by render-thread draw submission, which is where DirectX 12 is cheaper (two to four times less render-thread cost here). Vulkan was excluded because it did not reach the world on the current content. DirectX 12 requires Windows 10 or newer, so this drops any players still on older Windows; worth checking against the player base.]]></description>
    </item>
    <item>
      <title>Rendering: Raised the async texture-upload buffer from 9 to 64 MB across quality levels so a single…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-dc4b1f3002c5</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Raised the async texture-upload buffer from 9 to 64 MB across quality levels so a single large asset during a zone load can't overflow it under DirectX 12. This surfaced while benchmarking at very high frame rates, where the default buffer overflowed on a large asset; the bigger buffer clears it.]]></description>
    </item>
    <item>
      <title>Rendering: Wrote up the DirectX 11 vs 12 vs Vulkan evaluation with the measured numbers (frame rate…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-e120a0bfabc4</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Wrote up the DirectX 11 vs 12 vs Vulkan evaluation with the measured numbers (frame rate plus per-frame CPU and GPU timings on the overworld and a town) and the upload-buffer fix, and linked it from the docs index and the render-pipeline roadmap.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Fixed the recurring Ceto ocean teardown error (“Destroying object … is not allowed at…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-782a21e872be</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Fixed the recurring Ceto ocean teardown error (&ldquo;Destroying object &hellip; is not allowed at this time&rdquo;). On scene unload, play-stop, or quit, the ocean frees its wave render textures from inside <code>OnDestroy</code>; Unity forbids both <code>Object.Destroy</code> and <code>Object.DestroyImmediate</code> in that window and logs the error. The previous fix had switched the call from one to the other, which just moved the error — both are rejected there. The shared destroy helper now skips the managed destroy during teardown (the GPU surface is already released beforehand, and Unity reclaims the texture on its next unused-asset pass) and keeps the normal deferred destroy for mid-game buffer recreation. Also routed the overlay manager's one direct destroy through the same helper. Reproduced and verified in the editor: unloading a Ceto scene during play logged the error about ten times before and zero after, and a plain play-stop is clean.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Rewrote the root-cause section in the Unity 6 upgrade notes, replacing an earlier writeup…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-d32081d3ebe2</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Rewrote the root-cause section in the Unity 6 upgrade notes, replacing an earlier writeup that had the diagnosis backwards, so the next person doesn't try a fifth swap between the two destroy calls.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Fixed a follow-on bug from that teardown change. Skipping the destroy during a scene…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-fbb45443947a</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Fixed a follow-on bug from that teardown change. Skipping the destroy during a scene unload was right for the ocean's render textures, but the same helper also destroyed the projected-grid meshes and the underwater bottom mask, which are hidden root GameObjects Unity does not reclaim on its own. Those leaked into the next scene, kept a render callback registered in a static list, and fired it every frame against the destroyed water component, throwing a null-reference each time; entering Silverdale Market logged the error continuously. Split the cleanup: render textures still skip destroy during teardown, but those GameObjects are now destroyed and their callback removed from the static list first, and the projection callback returns early instead of throwing when its component is gone. The reflection, depth, and mask cameras were leaking the same way on every zone change and are destroyed now too. Compiles clean; the in-editor scene-transition check still needs a run in a live editor.]]></description>
    </item>
    <item>
      <title>Player vendors: Vendor search in a large town rebuilt the entire results list once per item as listings…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-2f4e57e6aee7</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Vendor search in a large town rebuilt the entire results list once per item as listings streamed in, an O(n&sup2;) cost that dominated load time on a big town. The list now suppresses those per-item updates during the download and builds once when loading finishes, on a new completion event. This pairs with the earlier server-side fix that collapsed the per-item plot lookups.]]></description>
    </item>
    <item>
      <title>Player vendors: Tried, measured, and dropped a slimmed item record for the results list (effect data…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-5f7e38001592</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Tried, measured, and dropped a slimmed item record for the results list (effect data stripped, a pre-computed quality rating in its place) meant to shrink the transfer. End-to-end it was slower, not faster: effects aren't the bulk of the average town item, so the transfer barely shrank, while building the slim record for every enchanted item cost real server time. Backed it out; the speedup comes from the list-rebuild and per-vendor-lookup fixes instead.]]></description>
    </item>
    <item>
      <title>Player vendors: Fixed a bug that could fail a large-town vendor search outright. The listings were sent…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-195e8ef6e085</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Fixed a bug that could fail a large-town vendor search outright. The listings were sent in fixed-count pages that ignored how big each item was, so a page that happened to hold several heavily-enchanted items could exceed the per-message size limit and error out the whole search. Paging is now sized by bytes, filling each page to a safe budget no matter how large the items are. It was data-dependent, which is why some searches went through and others didn't.]]></description>
    </item>
    <item>
      <title>Pets: Fixed the pet-data leak behind the scene-load “black hole” (Gitea #134). Taming a pet…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-de44b8e770b6</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Fixed the pet-data leak behind the scene-load &ldquo;black hole&rdquo; (Gitea #134). Taming a pet stores its custom name and behavior keyed to the taming-necklace item, but nothing removed that record when the necklace was destroyed, sold, or traded away, so the records accumulated forever. Once an account's pet data outgrew the per-message size limit, the server failed while sending it, the client waited on a reply that never came, and the scene never loaded. Affected accounts couldn't self-heal and were being fixed by hand-deleting database records every month.]]></description>
    </item>
    <item>
      <title>Pets: The server now drops a pet's record when its necklace is destroyed, fully sold to a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-389460b7db86</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[The server now drops a pet's record when its necklace is destroyed, fully sold to a merchant, or traded away, and reconciles oversized pet data against the items the account actually owns before sending or storing it. Accounts already past the limit heal on their next pet-data load with no manual intervention, and a record is kept whenever its necklace still exists anywhere the account holds items, including the bank, so nothing legitimate is lost. As a final backstop, a reply that is still too large after cleanup is trimmed to fit rather than allowed to fail, so this class of stuck login can't come back.]]></description>
    </item>
    <item>
      <title>Pets: The database maintenance tool gained two commands for support: a report ranking…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-09fb0ae0ff7a</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[The database maintenance tool gained two commands for support: a report ranking characters by pet-data size with warnings as they approach the limit, and a cleanup that removes orphaned records account-wide, dry-run by default. Together they replace the manual monthly query.]]></description>
    </item>
    <item>
      <title>Pets: Added regression coverage at both levels: unit tests for the reconciliation rules (orphan…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-4a2771dd2ebd</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Added regression coverage at both levels: unit tests for the reconciliation rules (orphan detection, spawner-reference cleanup, item-less pets never touched) and a new bot test that uploads deliberately bloated pet data over the wire and verifies the server prunes the orphans while keeping the real pets and their names. Verified end to end on a local server, including the cleanup commands against seeded data. (Gitea #134)]]></description>
    </item>
    <item>
      <title>Client UI: The in-game Oracle window (the one UI built on Unity's UI Toolkit rather than the game's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-90083f75911f</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[The in-game Oracle window (the one UI built on Unity's UI Toolkit rather than the game's NGUI) froze the avatar for as long as it was open. It claimed a dedicated input mode on show, and the player's movement reads only fire in the default control mode, so every movement key was dropped. It now claims that mode only while the question field has keyboard focus, mirroring how chat suppresses movement while you type: you can move with the window open, and typed w/a/s/d still won't drive the avatar while composing a question. Auto-focus on open is kept, and the window still releases the mode on close. Compiles clean; wants a play-mode check of the focus/movement handoff. (Gitea #147)]]></description>
    </item>
    <item>
      <title>Client UI: Added a rebindable key for opening the in-game Oracle window, so players don't have to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-1298b41394dd</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Added a rebindable key for opening the in-game Oracle window, so players don't have to type <code>/oracle</code> each time. It appears on the Options key-bindings page as <b>Toggle Oracle Window</b>, unbound by default (like Toggle Task List) so players pick their own key, and toggles the window open and closed; the <code>/oracle</code> and <code>/ask</code> chat commands still work. Compiles clean; wants a play-mode check of the binding. (Gitea #142)]]></description>
    </item>
    <item>
      <title>In-game Oracle: Added a Finding and Buying Recipes article to the in-game Oracle's knowledge base. It…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-20492e3a28bf</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Added a <b>Finding and Buying Recipes</b> article to the in-game Oracle's knowledge base. It covers how recipes are obtained (known by default, trainers, quests, discovery at a station, drops, and purchase), which crafting merchant carries a given craft's recipes and roughly where to look, how recipe pricing behaves, and how to search other players' vendors. Written from verified game mechanics and cross-linked from the crafting guides, with the Oracle's search index rebuilt. The exact nearest-vendor-with-current-price lookup needs live game data and is left as a follow-up. (Gitea #146)]]></description>
    </item>
    <item>
      <title>In-game Oracle: Gave the Oracle a crafting-recipe lookup so it can answer material-requirement questions…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-b4461fd4041e</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Gave the Oracle a crafting-recipe lookup so it can answer material-requirement questions. A build step extracts about 3,100 recipes from the game's own data into a compact dataset (recipe, craft, skill level, ingredients and quantities, and what it makes); the Oracle searches it by name and answers from that data instead of guessing. Ingredient names resolve to their real in-game names, and disabled, GM-only, and unreleased recipes are excluded. (Gitea #144)]]></description>
    </item>
    <item>
      <title>In-game Oracle: Fixed a deploy bug in the Oracle's web service: redeploying could drop its HTTPS…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-3ffd2ab34171</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Fixed a deploy bug in the Oracle's web service: redeploying could drop its HTTPS configuration and serve the wrong certificate, briefly making the in-game Oracle unreachable. The deploy now writes the full HTTPS config itself every time, so it can't silently regress.]]></description>
    </item>
    <item>
      <title>In-game Oracle: The Oracle now offers to attach a screenshot when it confirms a bug report (bugs only…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-f83d84352611</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[The Oracle now offers to attach a screenshot when it confirms a bug report (bugs only, never feature requests, and only if the player says yes). On consent the client hides the Oracle window, captures the frame, compresses the image under the tracker's attachment size cap, and uploads it; the server attaches it to the freshly filed issue as a native tracker attachment, falling back to a hosted image linked from an issue comment. The report still files even if the capture or upload fails, and the transcript reports the outcome either way. (Gitea #149)]]></description>
    </item>
    <item>
      <title>In-game Oracle: The screenshot upload is gated by a single-use, short-lived token the server mints only…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-cdda9f2c8531</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[The screenshot upload is gated by a single-use, short-lived token the server mints only when a player consents on a report they just filed, so the endpoint cannot be used to push images onto other issues; validation runs before the token is consumed, so a malformed upload doesn't cost the player their one shot. Old clients never see the offer (the server makes it only to clients that declare screenshot support), which lets the service side ship ahead of the next client build.]]></description>
    </item>
    <item>
      <title>Editor tooling: Started Recipe Studio , a dedicated editor window for working with crafting recipes…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-5c413d91734e</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Started <b>Recipe Studio</b>, a dedicated editor window for working with crafting recipes; until now, browsing meant a name filter in an old explorer tab and authoring meant raw Inspector work across several disconnected menus. The first milestone ships browsing: it indexes all recipe assets (about 3,300) with search by name or by ingredient/result item, filters for craft school, action type, enabled state, skill-level range, and whether a recipe is actually referenced by a recipe-book tab, and a detail pane showing ingredients, tools, results, and book membership, with a warning when a player-facing recipe is in no book and would be invisible in game. The index reads reference strings instead of loading the item assets they point to, so it stays fast on the full library. This is the project's first editor window built on Unity's UI Toolkit. Batch error checking and in-window recipe editing and creation land next.]]></description>
    </item>
    <item>
      <title>Editor tooling: Recipe Studio milestone two: library-wide error checking. The recipe validator that used…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-fd2893f26bbb</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Recipe Studio milestone two: library-wide error checking. The recipe validator that used to dump every problem into one modal dialog was extracted into a shared engine; the old menu item and the build pipeline keep their exact behavior, while the window runs the same checks a few recipes per editor tick so the editor stays usable during a full scan. New checks the old validator lacked: player-facing recipes missing from every recipe-book tab (invisible in game), missing recipe-book icons, empty display names, and stale stored ingredient hashes (the crafting lookup key). Results land in a filterable issues panel; clicking an issue jumps to the recipe, and problem recipes get error/warning badges in the browser. Verified against the live library (clean, matching the old validator) and against an injected duplicate recipe, which was correctly flagged on both the original and the copy.]]></description>
    </item>
    <item>
      <title>Editor tooling: Recipe Studio milestone three: editing without leaving the window. The detail pane now…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-5e443dcdd43c</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Recipe Studio milestone three: editing without leaving the window. The detail pane now embeds the recipe's full inspector, so the existing edit behaviors (ingredient-hash refresh, metadata sync, only-one-primary-ingredient) carry over unchanged, with a live error strip above it that re-validates a moment after each edit and warns when the ingredient set collides with another recipe's. Recipe-book placement is managed in the same pane: add or remove the recipe from any book tab, with a warning when a player-facing recipe is in no book at all. Editing an ingredient quantity was verified to update the crafting lookup hash and clear its duplicate warning.]]></description>
    </item>
    <item>
      <title>Editor tooling: Recipe Studio milestone four: creating recipes. A guided wizard clones an existing recipe…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-2091c0964d02</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Recipe Studio milestone four: creating recipes. A guided wizard clones an existing recipe (the common case, with a searchable picker that pre-fills the destination folder and naming) or starts blank, enforces the naming convention, checks for path collisions, and mints a fresh localization id for the display name so clones never share one. It also sets the new asset's archetype identity explicitly after finding that the existing import-time heal could apply out of order and leave a clone sharing its source's id. A banner in the window now counts recipes changed since the last server recipe-db export and regenerates it on click, closing the step that was easiest to forget when shipping a recipe.]]></description>
    </item>
    <item>
      <title>Editor tooling: Recipe Studio finishing pass: the detail pane's ingredient, tool, and result lists are…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-bc8998078c71</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Recipe Studio finishing pass: the detail pane's ingredient, tool, and result lists are now directly editable rows (item picker with icon, classification, quantity, and the primary/always-consumed/apply-effects flags, with add/remove and the only-one-primary rule enforced) instead of requiring the embedded inspector, which remains available in a collapsed foldout for the long tail of fields. Item references in recipes serialize as id-plus-path strings rather than normal object references; a new picker control writes that format through the game's own path resolver and reports bad picks inline instead of the old modal dialog. Also wrote up the tool and the full recipe data pipeline in the docs tree and linked it from the docs index.]]></description>
    </item>
    <item>
      <title>Server operations: Triaged the chaos shard's error logs for the last 24 hours and traced the largest cluster…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-ab908d76ecc7</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Triaged the chaos shard's error logs for the last 24 hours and traced the largest cluster to a false alarm. A burst of login-authorization rejections, connection-retry warnings, and an hourly stale-record sweep looked like a login-capacity outage, but the login-token store and its expiry were healthy and the master never lost its heartbeat during the window; the rejection flood was one client stuck reconnecting with a login token that had already aged out after an earlier vendor-search request errored. Added a case study to the capacity/outage runbook so the pattern is read correctly instead of chased as an outage.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Documented the client-control harness end to end now that its automated launch, log in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-6ef90ff291c9</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Documented the client-control harness end to end now that its automated launch, log in, run a test, and exit flow works. The new writeup walks through how a freshly launched dev client is driven all the way to in-world, which is the involved part: a fresh client has to be taken through the main menu, credentials, the one-time agreement and notice dialogs, character selection, and the scene load. One dev-only setting carries the client from the menu straight into a chosen scene, and the agreement dialogs are auto-accepted only on that dev path, so nothing changes for real players. Also captured the one-time requirement that the test account already have a character, and the end-to-end result: the runner logs in by itself, lands in-world, runs its scripted steps with before and after screenshots, and exits clean.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Small cleanup: the game writes a couple of runtime id files into whatever folder it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-0281b0eb6e28</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Small cleanup: the game writes a couple of runtime id files into whatever folder it starts from, which had been landing in the tools directory. The runner now launches the client from the client's own folder so those files stay out of the source tree, and added them to the ignore list. Noted the character and dev-build requirements in the tool's readme too.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: The client-control harness gained three read-only query verbs: nearby entities and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-d9bd1eec4861</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[The client-control harness gained three read-only query verbs: nearby entities and interactable objects (names, kinds, dispositions, distances), the player's inventory (quantities, equipped slots, weight), and skill levels plus learned recipes. A test-driving agent can now find things by name instead of guessing at coordinates; results are filterable and capped so replies stay under the transport's frame limit.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Added the harness's first real gameplay verbs: target a named entity, interact with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-d7f3fb2ce574</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Added the harness's first real gameplay verbs: target a named entity, interact with objects and NPCs (the same E-to-use path a player triggers, with range checks), use a skill (returns the exact fail reason when it doesn't fire, e.g. not enough focus or no target), use an inventory item via the double-click path, equip gear, and follow or autorun for movement. All of them go through the same code the player drives, so combat rules and the server's account-permission checks still apply.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: The harness can now run a curated set of developer-console commands and read back their…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-ab8d4fb15e5d</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[The harness can now run a curated set of developer-console commands and read back their output. The console's execute logic had no callable entry point (it lived inside the on-screen console's input handler), so it was extracted into a shared method used by both. Only an approved list of test-setup commands is allowed (give item, learn recipes, set skill levels, crafting test mode, and similar); arbitrary code paths are refused, and the server still re-checks account permissions on anything privileged.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Finished the harness's crafting support: a craft command finds a matching station, opens…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-49ca369a27ff</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Finished the harness's crafting support: a craft command finds a matching station, opens it, pulls the recipe's ingredients from the backpack onto the table (the same auto-fill the recipe list uses), presses Craft, and reports each item's result and experience before closing the window so products return to the backpack. It drives the real crafting window rather than calling the server directly, because the crafting table is a server-side temporary bag whose safe cleanup lives in the window's close path, and the station's crafting bonus only applies while the window is open. Missing ingredients come back as an exact shortfall list, and the crafting test mode command gives deterministic, timer-free results for repeatable tests.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Wired the server-report regeneration job into the build farm end to end (Gitea #140). The…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-0fa6d8535e58</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Wired the server-report regeneration job into the build farm end to end (Gitea #140). The per-scene reports the game servers read town and player-owned-town data from were last regenerated by a legacy build job that has been paused since last fall; that staleness is what made a newly created town's houses vanish in June. The new nightly job updates its build tree first so it always reports on current data, regenerates the shared data-contract code, runs the headless report build, sanity-checks the output, and archives it; the release job picks that archive up automatically, and a small fetch script gives hand-run deploys the same fresh data.]]></description>
    </item>
    <item>
      <title>Game launcher: Removed the launcher's “Connections” control, which let a player change how many files…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-d3968ca3e3fc</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Removed the launcher's &ldquo;Connections&rdquo; control, which let a player change how many files download in parallel. It's now fixed at 4 for everyone. The parallel-download engine is unchanged, so distant players keep the multi-stream speedup, and the setting no longer persists to the launcher config.]]></description>
    </item>
    <item>
      <title>Game launcher: Laid the groundwork for macOS and Linux launcher builds: added the extra build targets…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-07-01-395e6c14786b</guid>
      <pubDate>Wed, 01 Jul 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Laid the groundwork for macOS and Linux launcher builds: added the extra build targets, guarded the Windows-only installer code (shortcuts, permissions, elevation) behind an OS check, and set the Unix executable bit when the launcher installs or self-updates. Windows behavior is unchanged (build clean, 43/43 tests, and the macOS/Linux binaries cross-publish). The macOS packaging and code-signing stage is deferred for now and tracked as a task.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-30</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-headlines</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>The client-control harness can now run a whole test from one command: it launches a dev client, logs it in, drives a scripted scenario or hands the live client to the assistant, and exits with a pass/fail code. Three new in-client controls (log in, change scene, quit) and a launcher script tie the lifecycle together.</li>
        <li>Cleared a Unity 6 deprecation warning across the entire art library by moving every 3D model off the engine's removed "External" material setting: 12,480 model importers switched to embedded materials with their existing material links preserved exactly. A new editor tool did it in about a minute by rewriting import settings instead of reimporting each model, and ran on a separate build machine so the working editor stayed free.</li>
        <li>Took apart the live deployment and automated-systems chain after the missing-houses incident and built permanent guardrails: the server now logs an error and alerts ops when a town's report data is missing instead of skipping the town, the deploy validates the report it ships and rejects a stale one, and a new reference maps every background job the running server depends on.</li>
        <li>New GM live-ops dashboard: a web page listing everyone online with account name, character, zone, time in zone, party, gold per hour and experience per hour, plus buttons to read a player's recent chat and to teleport to them with GM-ghost on by default. The roster is read from the game server; the teleport and ghost actions drive the GM's own client over the browser-control link.</li>
        <li>The in-game Oracle's skill help was describing the wrong effect for abilities across many combat and magic schools — it listed Thrust's bonus debuff as an armor cut when the skill actually reduces the target's healing. Re-checked every skill and spell against the game's own data, fixed the mislabeled effects and several wrong skill names across all the help guides, and switched the help text to the in-game term &ldquo;Specialization&rdquo; (formerly &ldquo;Mastery&rdquo;).</li>
        <li>Vendor search in large player-owned towns dropped from two to three minutes to seconds. Listing a town's vendors made the server repeat the same pair of database lookups for every item on a vendor; it now does them once per vendor and reuses the result, with identical output and no data changes. Deployed to the test shard.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Added an automated test runner for the client-control harness. One command launches the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-9742b78025f0</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Added an automated test runner for the client-control harness. One command launches the dev client, logs it in with test credentials from the environment, waits until it is in-world, then either runs a scripted scenario (a list of control steps with assertions, exiting with a pass/fail count and a saved report) or holds the running client for the assistant to drive live and quit when done. It is backed by three new in-client controls — programmatic login, scene change, and a clean quit — plus matching assistant tools and a shared connection module. Credentials are never stored in the scenario files. Compile-checked in the engine, the adapter's nine-tool test passes, and the runner's argument and exit-code handling is verified; a live run against a launched client is the remaining check.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Finished that automated login and verified the whole cycle live. Getting a freshly…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-5387cf23c66a</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Finished that automated login and verified the whole cycle live. Getting a freshly launched client to a logged-in, in-world state meant driving the entire front-end sequence: past the main menu, through credentials, the one-time agreement and notice dialogs, character selection, and the scene load. The one-time agreement/notice dialogs are now auto-accepted only on the dev/automated login path (a flag real players never set, so normal logins are unchanged); a single setting then carries the client straight from the main menu into the chosen scene. End-to-end result against a launched dev client: it logs in by itself, lands in-world on the overworld, runs the scripted steps — read state, print location, read chat, turn, and before/after screenshots the assistant reads back — and exits zero. Added a short settle after reaching in-world so screenshots show the rendered world rather than the final load frame. (Gitea #135)]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Migrated every model importer off Unity 6's removed "External" material location, which…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-bf35e7474e13</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Migrated every model importer off Unity 6's removed "External" material location, which logged an obsolete-API warning on each affected model at import time. A text search badly undercounts the scope, so the real importer values were read instead: 12,480 of about 15,800 model importers were still on the legacy setting. All were switched to embedded materials, with each model's external material files first captured into an explicit remap so the materials are preserved exactly; animation and no-material models just flip. 12,457 metadata files changed here — source models were untouched, so there is no large-file churn. Added the <b>MaterialLocationExternalSweep</b> editor tool (dry-run and fix menu items plus a headless mode) that writes the corrected import settings without a per-model reimport, turning a serial multi-hour pass into about a minute; the actual reimport happens per machine on the next editor open. The sweep ran headless on a separate build machine and the changed metadata was brought back. The model preprocessor only sets defaults on first import and never touches this field, so the fix is one-time and will not reappear.]]></description>
    </item>
    <item>
      <title>Server operations &amp; reliability: Wrote a single end-to-end reference for the live deployment and automated systems: how a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-a13e9b71022b</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Wrote a single end-to-end reference for the live deployment and automated systems: how a server is built, deployed, and run; a dependency-and-failure matrix listing every artifact the running server reads that a separate background job produces (server reports, the pledge report, database and item-log backups, schema indexes) and how each one fails when that job is skipped or its output goes stale; the scheduled-job inventory; and a prioritized gap list. Most of these failures were invisible: the server kept running and served wrong or empty data with nothing logged.]]></description>
    </item>
    <item>
      <title>Server operations &amp; reliability: Hardened the player-owned-town report path against the staleness that caused the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-a2bfe7794fa4</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Hardened the player-owned-town report path against the staleness that caused the missing-houses incident. The server now logs an error and alerts ops when a town's report entry is absent instead of returning early, and records how many towns each report load covers (a number to watch against the known town count). The test-shard report refresh now validates the combined report (well-formed, non-empty, contains town entries) and fails the deploy if it is bad; the deploy also refuses to ship a report older than the town-ownership data unless explicitly told to. Verified the server build compiles and the deploy scripts parse.]]></description>
    </item>
    <item>
      <title>Server operations &amp; reliability: Corrected the build-server retirement guide: the metrics and notification scripts it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-88f41bff4f34</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Corrected the build-server retirement guide: the metrics and notification scripts it listed as recoverable only from the old version-control server are already in this repository, so that part of the migration is not blocked on recovering them.]]></description>
    </item>
    <item>
      <title>Server operations &amp; reliability: Removed the temporary town-setup and house-load debug logging left in while chasing the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-6fd2c50a81ff</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Removed the temporary town-setup and house-load debug logging left in while chasing the incident, keeping the one real fix it proved out: a single bad lot marker no longer aborts a whole town's setup.]]></description>
    </item>
    <item>
      <title>Server operations &amp; reliability: Sped up vendor search in large player-owned towns, which could take two to three minutes…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-5994bea277d9</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Sped up vendor search in large player-owned towns, which could take two to three minutes. Listing a town's vendors pulls every item from every vendor, and for each item the server made two extra database lookups to resolve where that vendor sits — lookups that return the same answer for every item on the same vendor. Those are now computed once per vendor and cached for the listing, so a town with thousands of items no longer repeats thousands of identical lookups. The results are byte-for-byte the same as before and no stored data changes; verified the server build, then deployed to the test shard. The remaining client-side list-build cost and a real server-side search filter are noted as follow-ups.]]></description>
    </item>
    <item>
      <title>Server operations &amp; reliability: Added a scheduled build job that regenerates the server's per-scene reports headless…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-e7dc75ee9030</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Added a scheduled build job that regenerates the server's per-scene reports headless, replacing a paused legacy job. Nothing was regenerating that source data, so it could drift and a deploy would ship outdated town data; the new job refreshes it nightly and archives it for the deploy to pick up. The first run still needs an on-machine check since it opens every scene.]]></description>
    </item>
    <item>
      <title>Live-ops &amp; GM tools: Built a GM live-ops dashboard ( gm-dashboard ): a local web page that lists every online…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-a15805c3ddf1</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Built a GM live-ops dashboard (<b>gm-dashboard</b>): a local web page that lists every online player with account name, character, zone, time in zone, party, gold per hour and experience per hour, a button to view a player's recent chat, and a button to teleport to them with GM-ghost mode on by default. The in-client browser-control link only sees the operator's own zone, so the shard-wide roster and totals are read from the game server's database and a player's chat from the log store, while the teleport and ghost actions ride the browser-control link to the GM's own client (those move the GM's avatar). Per-hour rates and time in zone are derived by sampling the roster between refreshes, so no database schema change was needed. The browser talks only to a small local backend that holds the server access and the control token. Backend, page and the rate math are smoke-tested with mock data, 14 checks pass.]]></description>
    </item>
    <item>
      <title>Live-ops &amp; GM tools: Supporting changes for the dashboard: the group server now logs every social-channel…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-8c8e193a8f34</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Supporting changes for the dashboard: the group server now logs every social-channel message through the existing log pipeline so a player's recent chat is queryable by sender, and the in-client control link gained a focused GM-ghost toggle (GM-ghost is a console-only command the chat passthrough can't reach). The server build compiles, and all of the dashboard's reads are pinned to the test shard.]]></description>
    </item>
    <item>
      <title>Live-ops &amp; GM tools: Live-tested the dashboard's roster read against the running test shard: it works…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-c6089981ad38</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Live-tested the dashboard's roster read against the running test shard: it works end-to-end, and the first run found a bug — one fetch script's database parameter name collided with PowerShell's built-in debug switch, which had been aborting the query. Renamed it; the read now returns cleanly (empty right now because no character is logged in).]]></description>
    </item>
    <item>
      <title>Live-ops &amp; GM tools: Fixed two issues found on the dashboard's first live run. The Zone column showed a raw…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-f343f355ee1e</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Fixed two issues found on the dashboard's first live run. The Zone column showed a raw instance GUID; it now shows the readable scene name (for player-owned towns, the town name), with the raw id kept in a tooltip. The recent-chat popup was empty because it only queried the new server-side chat log that isn't deployed yet; it now also reads the existing client chat stream already in the log store, so a player's global and local chat show immediately. Both verified live against a logged-in player.]]></description>
    </item>
    <item>
      <title>Documentation: Corrected the in-game Oracle's skill and spell guides against the game's authoritative…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-8044a15265c4</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Corrected the in-game Oracle's skill and spell guides against the game's authoritative skill data. Most abilities had their secondary effect mislabeled: Thrust and Rend were described as cutting the target's armor when they actually reduce its healing, and polearm, bludgeon, ranged, shield, and many spells had the wrong effect type listed. Fixed across all 22 skill and spell guides — both the player-facing version the Oracle answers from and the engineering reference — along with several wrong skill names (Double Thrust is really Double Slash, Tumble is Evasion, Concentration is Tranquility).]]></description>
    </item>
    <item>
      <title>Documentation: Renamed “Mastery” to “Specialization” across the skill docs to match what the game calls…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-6c8ba2306fc5</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Renamed &ldquo;Mastery&rdquo; to &ldquo;Specialization&rdquo; across the skill docs to match what the game calls it, leaving the skills that are genuinely named &ldquo;Mastery&rdquo; (such as Blade Mastery) unchanged.]]></description>
    </item>
    <item>
      <title>Documentation: Added a verifier that reads each ability's real effects from the game data and its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-a904e0299b61</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Added a verifier that reads each ability's real effects from the game data and its in-game tooltip, so the skill guides can be checked against ground truth instead of by hand. It caught the original mismatch and confirmed every fix.]]></description>
    </item>
    <item>
      <title>Documentation: Started a database migrations log: a running record of every change that touches the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-30-6b85c05d9504</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Started a database migrations log: a running record of every change that touches the database — fields, collections, indexes, and one-off data fixes — so an existing data set can be carried forward into another test environment with a clear answer to what, if anything, must run against it. Added the first entry and linked it from the docs index.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-29</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-headlines</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Portuguese is now fully translated in the game. Every NPC conversation line plus all the UI, item, skill, journal, help, title and script text was filled in, taking Portuguese from 28% to 99.7% coverage and dialogue from 9% to 100%. It is now the most complete language we ship, just ahead of German. The only text still in English is the in-world books, which go out on a separate track. A two-model meaning-and-grammar audit then reviewed all 85,783 new lines and applied 2,398 fixes for mistranslations, wrong terms, and grammar.</li>
        <li>Fireball traps stopped creating and destroying an explosion object on every hit: the explosion now comes from a reuse pool, and two long-standing bugs fell out with the change. Explosions had been cut off at a fixed one second instead of playing their full effect, and every blast was throwing a discarded error from a reference the trap never filled in.</li>
        <li>Mapped where the project could be knocked offline by a denial-of-service or UDP flood and wrote the plan to handle one. The public game shard is a single box that forwards its game traffic with no per-source rate limit, exposes connection and login limits that are per-connection rather than per-source, and carries some obsolete policy listeners worth retiring; the web portal answers on a directly reachable address with no global request limits. The honest limit, stated up front, is that a truly large flood can only be absorbed upstream at the hosting provider or a content-delivery network, or sidestepped by repointing players to clean capacity. Because a few hours of downtime is acceptable, the plan leans on cheap preparation rather than always-on defenses. Nothing was changed; this is the playbook to act on if it happens.</li>
        <li>Generic NPCs that come in both a male and a female version no longer share one voice. The voice tooling had collapsed each to a single voice, so a bearded guild registrar could speak with a young woman's voice; every such NPC now gets its own voice per gender, fixed across 135 shared-dialogue character types.</li>
        <li>Fixed a regression in the object-pool warmup that could briefly fire combat effects, particle bursts and audio at the world origin during a map load. The pools build their starting objects off the main thread, and the new copies were active for a few frames before being switched off; they now build hidden and only come alive as the pool hands them out.</li>
        <li>Audited every place the server stores player-sent data and found 11 ways a player could send data that, once saved, jams the game at the storage layer rather than just cheating. A single record pushed past the database's hard 16 MB size limit can no longer be read or written, stranding that character, party, plot, or vendor. The confirmed cases sit in plot and scene data, the knowledge lists, party storage, and a vendor sale that can leave shelf items locked; all are written up with a fix plan and filed as a tracking epic with 13 tasks. No fixes have shipped yet; this pass is the audit and the plan.</li>
        <li>The in-game chat moderator now runs on our own hardware instead of a paid API, so chat content stays in-house at no per-message cost. It reviews messages in the background against a written policy we control and can pull a flagged one back from everyone's chat. The policy is written for a game: it allows fantasy combat talk like "I'll kill you in the arena" but removes real-world threats, doxxing, real-money trading, and scams. It now covers all the social chat channels and is being tested on the test shard, off by default, in watch-and-report mode first.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Client: Fixed a null-reference error logged at client shutdown. The options and login screens…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-56c748edf174</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Fixed a null-reference error logged at client shutdown. The options and login screens unsubscribed their save-to-file dialog handlers through a lazy accessor that recreates the dialog on demand; during teardown the dialog is already gone, so the accessor tried to rebuild it, failed to load, and the cleanup threw. Added a non-creating accessor that returns the existing dialog or nothing, and skip the unsubscribe when there is no dialog. (Gitea #136)]]></description>
    </item>
    <item>
      <title>Client: Pooled the fireball trap's explosion effect. The trap created a new explosion object and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-73a35d4ea5a0</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Pooled the fireball trap's explosion effect. The trap created a new explosion object and destroyed it on every impact; it now draws from and returns to a shared reuse pool, with the timed destroy replaced by a release back to the pool and a self-release on scene change. Keeps a fallback to the old path if the pool is unavailable.]]></description>
    </item>
    <item>
      <title>Client: Fixed the explosion length, which had been dead code: because a fresh object was created…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-cdf29f12f58b</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Fixed the explosion length, which had been dead code: because a fresh object was created each time, the code that measured the effect's real duration ran a frame too late and never applied, so every explosion was cut to one second. The duration is now computed before first use, so longer explosions play in full. This is a visible timing change, pending an in-game check.]]></description>
    </item>
    <item>
      <title>Client: Removed a back-reference on the explosion that the trap never set, which logged an error…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-dedaf46617a9</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Removed a back-reference on the explosion that the trap never set, which logged an error and threw a null-reference (caught and discarded) on every detonation. The projectile already resets itself, so the field was redundant.]]></description>
    </item>
    <item>
      <title>Client: Fixed the async pool prewarm so warmup objects never run live. The pools warm their…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-c48939cbd0a9</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Fixed the async pool prewarm so warmup objects never run live. The pools warm their initial instances off the main thread with the engine's batched async instantiate, but those copies integrate active and were only switched off in one end-of-batch callback, so across the roughly 2,050 prewarmed objects they sat active at the world origin for several frames during a scene load. A combat-effect prefab runs a physics overlap query every frame, and others play particles or audio, so the warmup could play effects and apply spurious hits. The batch now builds under an inactive holder, so nothing ticks until each instance is reparented into the pool, sent its create hook, and switched off, matching the old synchronous warmup. Verified in the editor.]]></description>
    </item>
    <item>
      <title>Client: Scoped the async-instantiate de-hitch work to the pool warmup and split the rest out. Its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-7aa3819b409a</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Scoped the async-instantiate de-hitch work to the pool warmup and split the rest out. Its other named targets do not fit that engine API: NPC spawn waves go through the networked spawn path, and plot-decoration loading is tied to synchronous per-item setup. Both were filed as separate follow-up tasks.]]></description>
    </item>
    <item>
      <title>Client: Added native-allocator metrics to the per-zone load logging. Each load already logged a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-9295d1682388</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Added native-allocator metrics to the per-zone load logging. Each load already logged a timing breakdown but never recorded the engine's native memory use, which is what a native allocator change actually moves. It now also emits a companion line with native reserved, peak and allocated totals, the allocated growth across the whole load and across the scene-load and avatar phases, and the Mono heap in use.]]></description>
    </item>
    <item>
      <title>Client: Reworked the load-timing line to measure the headline total from a monotonic clock and to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-1e4a5400fc1d</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Reworked the load-timing line to measure the headline total from a monotonic clock and to break out the per-load garbage-collect time and any span the named phases do not account for. The existing fields and key=value format were left in place so the log dashboards keep parsing it.]]></description>
    </item>
    <item>
      <title>Client: Added a per-build switch for the engine's new multithreaded native memory allocator, so…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-0e84193f64ef</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Added a per-build switch for the engine's new multithreaded native memory allocator, so its effect on multithreaded zone loads can be measured and kept only if it helps. The client reads which allocator a build was set to and labels each load with it, so on and off runs can be told apart in the logs.]]></description>
    </item>
    <item>
      <title>Client: Stopped the companion app from reopening the in-game chat box. With the chat box closed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-29407fb95c81</guid>
      <pubDate>Mon, 29 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Stopped the companion app from reopening the in-game chat box. With the chat box closed, sending a message or switching tabs in the companion browser or desktop app used to force the in-game window back open; the two companion-only paths no longer call show. While a companion is connected, incoming messages no longer auto-open the in-game box either, since the player is reading chat in the companion. Sending and tab-routing still work with the window hidden, because a hidden chat window stays active and only has its panel alpha and colliders turned off.]]></description>
    </item>
    <item>
      <title>Client: Left the in-game ways to open chat untouched: pressing Enter, Slash, or Shift+Alpha, or…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-a6bd12f929d6</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Left the in-game ways to open chat untouched: pressing Enter, Slash, or Shift+Alpha, or clicking the chat input, still opens the box as before, even while a companion is connected. When no companion is attached, behavior is unchanged. Compile-checked the client assembly; in-game verification pending.]]></description>
    </item>
    <item>
      <title>Client: Fixed /companion desktop failing to launch the desktop companion in a real build. The…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-f6acb9cce2f4</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Fixed <code>/companion desktop</code> failing to launch the desktop companion in a real build. The launch code was the only place in the client that started a process with shell-execute turned off, which the player runtime's process API does not handle, so the spawn threw before the app ran. Switched it to the same shell-execute path every other launcher in the client uses and gave the process a working directory instead of an empty one. The failure also now logs the full error and the resolved exe path. The bundled app ships self-contained, so this was the spawn call, not a missing runtime on the player's machine. Compile-checked; in-game verification pending on the next build.]]></description>
    </item>
    <item>
      <title>Client: Fixed the in-game /oracle command opening nothing: the command ran but no window appeared…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-266be9d3b6a8</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Fixed the in-game <code>/oracle</code> command opening nothing: the command ran but no window appeared and no error was logged. The Oracle window's UI document had lost the panel-settings asset it needs, so the UI Toolkit panel never built and the window-show code hit a guard and returned silently. The asset had been added with the window, then an engine-upgrade asset-reserialize pass dropped the asset file while leaving its meta behind, and a later orphan-meta cleanup deleted the stranded meta, so both were gone even though the prefab still pointed at them. Restored the asset with its original id, so the prefab reference resolves again. Verified in the editor that the window's panel settings and theme now load; takes effect on the next client build.]]></description>
    </item>
    <item>
      <title>Client: Fixed a load-screen hang when entering a player-owned town. If the player's spawn point…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-2cfb728f815d</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Fixed a load-screen hang when entering a player-owned town. If the player's spawn point sat on a lot that had not finished initializing, the check that decides it is safe to place the player kept waiting on that lot's contents and never cleared, so the load stuck near the end and the player never entered the world. It now skips lots that were never initialized, since they have nothing to load. Pinned it with temporary diagnostics and confirmed live that the player spawns and the town loads.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Added an automated moderator for global chat (the Universe and Universe-Trade channels)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-85608905d9e3</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Added an automated moderator for global chat (the Universe and Universe-Trade channels), which previously had no content moderation at all. Player messages send with no added delay; a small hosted language model reviews each one in the background, and a flagged message is pulled back from every client, including the sender's own copy, while the team is alerted. There is no pre-send gate, so chat speed is unchanged; the tradeoff is that a flagged line shows for the model's round-trip before it disappears. The prompt targets the abuse that generic safety filters miss: real-money gold/account selling, scams and impersonation, doxxing and threats.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Built the unsend path to reuse what already exists rather than add new networking: each…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-7caf46861678</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Built the unsend path to reuse what already exists rather than add new networking: each global message carries a client-generated id inside the normal chat payload, the redaction command is itself a message on the same channel (so it reaches players on other zone servers too), and removal reuses the existing chat-log rebuild. No new network message type or generated code was needed, and a message that has already scrolled off is simply left alone.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Shipped behind an off-by-default switch with a two-phase rollout: phase one observes and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-c4b0a01cd476</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Shipped behind an off-by-default switch with a two-phase rollout: phase one observes and alerts only, with no redaction, so the model's accuracy, latency and cost can be measured on real traffic; phase two flips one flag to enable the unsend once accuracy holds up. The model never blocks chat: any timeout or unparseable response leaves the message in place. Compile-checked both the server and the client.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Reworked the moderator to run on our own hardware instead of a paid third-party API: the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-66727896db43</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Reworked the moderator to run on our own hardware instead of a paid third-party API: the model now runs on a GPU workstation we already own, so chat content stays in-house and there is no per-message cost. It is an open-weight safety model that classifies each message against a written policy we control rather than a fixed built-in ruleset.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Wrote the policy around the distinction that actually matters for a game: fantasy combat…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-293ad3198799</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Wrote the policy around the distinction that actually matters for a game: fantasy combat and PvP trash-talk are allowed, while real-world threats, doxxing, real-money trading, and scams are removed. The policy is a plain text file shipped with the server, so it can be tuned without rebuilding, and the model reasons about each message against it.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Broadened coverage from the two global channels to all the social channels (universe…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-477680136894</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Broadened coverage from the two global channels to all the social channels (universe, trade, guild, party, noble); party chat got its own unsend path. Private whispers are watched and reported but not yet unsent. Proximity chat is sent peer-to-peer with no server relay, so it can't be moderated this way. Targeting the test shard first; both server and client compile clean.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Stood up the model end to end on our own GPU: installed the open-weight safety model on a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-1abbefd64d3f</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Stood up the model end to end on our own GPU: installed the open-weight safety model on a workstation GPU we already own as a background service that keeps it loaded, and connected it to the test shard over a private encrypted tunnel so the game server can reach it without exposing anything to the public internet.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Validated it against boundary cases on the real GPU: in-game combat threats ("kill you in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-9edf559912bf</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Validated it against boundary cases on the real GPU: in-game combat threats ("kill you in the next siege") are allowed, while real-world threats, gold-for-cash sales, and fake-reward links are caught, and legitimate in-game trades and trash-talk pass. Classifying a message takes a couple of seconds once the model is warm, which is fine since moderation runs in the background and unsends after the fact.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Deployed it to the test shard in watch-and-report mode: rebuilt and shipped the game…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-b352cd6b3e26</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Deployed it to the test shard in watch-and-report mode: rebuilt and shipped the game server, pointed it at the model over the tunnel, and confirmed the server loads the moderation policy on startup. It now classifies real chat across the social channels in the background and logs what it would flag; nothing is unsent yet. The deploy was kept isolated from an unrelated in-progress fix on the same shard.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Added a switch to also moderate GM/dev accounts (off by default so real staff…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-2587c930c053</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Added a switch to also moderate GM/dev accounts (off by default so real staff announcements are never touched, on for the test shard) since otherwise a developer testing on their own GM account is skipped and never sees the moderator act. Switched the test shard to enforce mode so flagged messages are actually unsent, and kept the model loaded in memory so a check comes back in a second or two instead of the cold-start delay.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Fixed a real miss found in testing: the model thinks before it answers, and on a longer…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-6e65f11455e6</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Fixed a real miss found in testing: the model thinks before it answers, and on a longer message its reasoning ran into the output limit so the final verdict was cut off, which made the check fail safe and let the message through. Raised the output limit well past what any check needs, set the model's context window to its maximum (still fits entirely on the card), and added a fallback that reads the verdict from the model's reasoning if the final line is missing. Re-tested with several gold-for-cash and real-world-threat phrasings and all were flagged in one to three seconds.]]></description>
    </item>
    <item>
      <title>Trust &amp; safety: Tightened the policy to also remove strong profanity (f-bombs) and any racist or…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-5f09e12b3104</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Tightened the policy to also remove strong profanity (f-bombs) and any racist or homophobic slur, on top of the existing real-world threats, gold-for-cash sales, scams, and doxxing. Mild trash-talk ("you're trash, uninstall") and in-game combat talk still pass. Since the policy is a plain text file the server reads, this went live by editing the file and reloading, no rebuild; verified the three new cases are caught and the allowed ones still pass.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Fixed the macOS client black-screening on launch. The build's copy step put the asset…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-6211a120bc1c</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Fixed the macOS client black-screening on launch. The build's copy step put the asset bundles, license files, and certificates in a Windows-style <code>&lt;Name&gt;_Data</code> folder beside the app, but a Mac build is a <code>.app</code> bundle whose data lives inside it at <code>Contents/Resources/Data</code>, so the running client found no bundles, hit a null reference in the asset-bundle loader, and never drew anything. The copy step now uses the <code>.app</code> layout for Mac builds and leaves Windows and Linux unchanged. Found by scanning the test-shard logs for the Mac tester's sessions, which showed four identical failed launches. Compile-checked the editor assembly; a rebuilt Mac build is still to be verified.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Noted from the same logs two more Mac-only gaps that do not block launch: the audio…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-fcc9463751e7</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Noted from the same logs two more Mac-only gaps that do not block launch: the audio (FMOD) and Steam native libraries are Intel-only with no Apple Silicon build, so they fail to load on the tester's M-series Mac and the client runs without sound or Steam. Both errors are caught; shipping Apple Silicon libraries is filed as a follow-up.]]></description>
    </item>
    <item>
      <title>Audio: Gave per-gender voices to generic NPCs. Many of them (guards, merchants, bankers…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-edc4f9b13076</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Gave per-gender voices to generic NPCs. Many of them (guards, merchants, bankers, registrars, trainers and others) ship as a male and a female prefab that share one dialogue file, so the offline voice casting treated them as one character and the opposite-gender version spoke with the wrong voice. The voice map now carries a separate entry per gender, and the client chooses by the speaking NPC's gender, falling back to the old single entry when no per-gender one exists.]]></description>
    </item>
    <item>
      <title>Audio: Kept the audio already generated and only added the missing voice. The casting step now…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-19fc2933eadc</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Kept the audio already generated and only added the missing voice. The casting step now preserves each NPC's existing voice rather than re-rolling it, so a re-cast never throws out or re-bills clips already made. Adding the second gender across 135 character types came to 6,568 new clips; nothing was removed from the voice host.]]></description>
    </item>
    <item>
      <title>Audio: Fixed the reported case: the Ardoris Guild Registrar, a bearded man who spoke with a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-3861da255853</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Fixed the reported case: the Ardoris Guild Registrar, a bearded man who spoke with a young woman's voice, now uses a gruff male voice while the female registrar keeps hers. Documented the cause and how to re-cast a single NPC's voice.]]></description>
    </item>
    <item>
      <title>Audio: Corrected the recorded gender on six named Ardoris NPCs (Erin the Castle Guard, Cai Lau…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-ac647b6e0384</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Corrected the recorded gender on six named Ardoris NPCs (Erin the Castle Guard, Cai Lau, Naoko Khan, Merrill, Parker, Sabine Eichner) whose prefab gender field disagreed with the voice a person had hand-picked for them. The voices already matched the characters, so the stale gender field was the bug; it also drives in-game pronouns, so fixing it corrects how the dialogue refers to them. No voices or audio changed.]]></description>
    </item>
    <item>
      <title>Audio: Restored cast sounds that went silent on a set of skills after the engine upgrade, where…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-b56d433fc4a5</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Restored cast sounds that went silent on a set of skills after the engine upgrade, where one skill (Light) made no sound while another (Heal) was fine. The two play their cast sound through different paths: the silent ones scheduled playback through an older delayed-play call that, on the new engine, no longer loads a sound clip unless it was preloaded, so the scheduled sound fired with no audio data. They now load the clip first and play it through the same call the working skills already use, keeping the short delay that lines the sound up with the cast.]]></description>
    </item>
    <item>
      <title>Audio: One change to the shared effect code covers all of the roughly two dozen affected…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-cab9a613c3a5</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[One change to the shared effect code covers all of the roughly two dozen affected effects, including partly-muted ones (Ice Fist layered a legacy sound on top of a working one); effects already on the newer path are untouched. Confirmed in the editor that the clip loads on demand and the play path is reached; the audible check rides the next build. Documented the two audio paths and the cause under docs/systems.]]></description>
    </item>
    <item>
      <title>Audio: Swept the rest of the code for the same delayed-play call and found one more use, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-2ee0fc459288</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Swept the rest of the code for the same delayed-play call and found one more use, the bird-flock scare sounds, where the same regression had silenced them (the flocks' idle and flight calls used the working path and were fine); fixed it the same way. The one other scheduled-sound spot, the player instruments, was checked and is safe because instrument notes are preloaded and decompressed up front, so their audio is ready the instant a note is scheduled.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Added prev/next open-issue navigation to the team's Gitea issue tracker, which has no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-4b1ac2bc6601</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Added prev/next open-issue navigation to the team's Gitea issue tracker, which has no such feature built in. Each issue page now shows Prev/Next buttons, n/p keyboard shortcuts, and a position count, so you can move through issues without going back to the list.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: By default the buttons follow the order of the issue list you came from (its current sort…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-74fba9b4c351</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[By default the buttons follow the order of the issue list you came from (its current sort and filters, captured across all pages); opening an issue from a direct link instead steps through the open issues by number. It reads the list over the existing browser session, so no token is embedded in the page.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Shipped as a small static script loaded through Gitea's custom-template hook, with no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-0aef34ece771</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Shipped as a small static script loaded through Gitea's custom-template hook, with no fork or rebuild of the server. The source is versioned in the repo and pushed by a new deploy script, with the mechanism and upgrade caveats documented under docs/operations.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Built the first slice of the client-control harness from yesterday's design. A new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-d807949e1d45</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Built the first slice of the client-control harness from yesterday's design. A new component in the client, active only when the game is launched with a <code>-clientcontrol</code> flag, opens a local-only, token-gated socket and answers four requests: read player state (scene, position, health and focus, frame rate, character name), take a screenshot, submit a chat or slash command, and a health check. It reuses the existing companion-app socket rather than adding a new in-client web server, and is off in a normal launch. Compile-checked in the engine; a live test against a launched build is still pending. (Gitea #135)]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Added the out-of-process adapter that exposes those requests to the assistant over the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-4422ea63ff0c</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Added the out-of-process adapter that exposes those requests to the assistant over the Model Context Protocol, including a screenshot tool that returns the saved image for the assistant to look at and keeps the file on disk as bug evidence. Wired it into the project's assistant-tool config and verified its tool list end to end with no client attached. The reflection-driven and avatar-driving control verbs from the plan are deferred to later phases.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Added an integration test for the adapter that runs it against a stand-in matching the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-d5919d9a5ace</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Added an integration test for the adapter that runs it against a stand-in matching the in-client side's exact message format, exercising all four requests including the screenshot returning an actual image. It passes, which also confirms the two halves agree on the wire format. The in-client half is compile-checked only; a test against a real launched build is still pending.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Restricted the client-control component to dev/GM client builds only (a compile-time…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-494ae74f5cdc</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Restricted the client-control component to dev/GM client builds only (a compile-time switch), so it is absent from the retail client entirely; it still also requires the launch flag and a local token. Added two more requests: read recent chat, and turn the avatar to face a world point or compass heading (the first of the look/move family). Confirmed teleport already works through the existing command path (<code>/teleport x y z</code>) given a dev account with GM power on, no new code. Screenshot, speak-into-chat, read-chat, teleport, and look are all in; "look at a named object" still needs a name-to-object lookup. Recompiled clean in the engine and the adapter's six-tool test passes.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Added a "GM client" checkbox (off by default) to the in-editor Build Chaos window, so a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-dd82b0c4ea1d</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Added a "GM client" checkbox (off by default) to the in-editor Build Chaos window, so a dev can build the GM/dev client themselves. The standard chaos build produces the normal client, which compiles the control component out; ticking the box compiles the player with the GM define on, pulling in the developer console, GM commands, and the control bridge. It is applied as a player-only define, so it never edits project settings or forces an editor reload, and the build is labeled GM in the dialog, the progress window, and its build record. Also wired the same option into the headless build command. Compiled clean.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Restored HTTPS on the in-game Oracle assistant's API endpoint, which had taken the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-f5017981cf03</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Restored HTTPS on the in-game Oracle assistant's API endpoint, which had taken the <code>/oracle</code> command down. The endpoint was serving the wrong TLS certificate, so the game client's connection failed its certificate check before any request reached the service. The correct certificate was already present; the web server had stopped referencing it after a redeploy rewrote the site config without the HTTPS block. Re-attached the certificate and reloaded; the command works again, with no client update needed.]]></description>
    </item>
    <item>
      <title>Dev infrastructure: Made the Oracle service's provisioning script re-attach HTTPS itself on every redeploy…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-b16cdfd0c867</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Made the Oracle service's provisioning script re-attach HTTPS itself on every redeploy, so rewriting the HTTP-only site config can no longer silently drop the certificate the way it did here. Updated the operations doc to match.]]></description>
    </item>
    <item>
      <title>Localization: Filled all 85,783 missing Portuguese lines with the same LLM pipeline used for German. A…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-69af2e2d39d7</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Filled all 85,783 missing Portuguese lines with the same LLM pipeline used for German. A bulk machine-translation pass ran over 2,996 batches, then a stricter repair pass re-did the lines that failed the markup and format validation gate. The final 10 records, which had broken markup in the English source itself, were hand-fixed to match the existing German versions.]]></description>
    </item>
    <item>
      <title>Localization: NPC dialogue went from 9% to 100% translated. 79 conversation scenes that had no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-a185f758395f</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[NPC dialogue went from 9% to 100% translated. 79 conversation scenes that had no Portuguese text before now ship one, each with a generated Unity meta file, and the rebuilt client string tables are staged for the chaos shard.]]></description>
    </item>
    <item>
      <title>Localization: Ran a meaning-and-grammar audit over all 85,783 new Portuguese lines, the German-style…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-940803cd44ad</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Ran a meaning-and-grammar audit over all 85,783 new Portuguese lines, the German-style pass that catches what the markup checker cannot: a fluent line that says the wrong thing. One model reviewed every line against its English source and flagged 7,233 as suspect; a second, stronger model independently re-checked the most serious flags and threw out about a quarter as false alarms. 2,398 fixes survived both judges and the markup checker and were written; the lower-confidence flags were set aside for a native-speaker pass.]]></description>
    </item>
    <item>
      <title>Localization: The fixes were real errors, not stylistic churn: surnames that had been translated as…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-daaba08a6869</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[The fixes were real errors, not stylistic churn: surnames that had been translated as words (Captain Jack "Price" had become "Preço"), invented terms put back to the established name, a clickable in-dialogue keyword that had been duplicated, and infinitive verbs corrected to the imperative the English used. Coverage is unchanged at 99.7% because these change quality, not count. Re-mined the terminology glossary from the corrected text and rebuilt the client string tables.]]></description>
    </item>
    <item>
      <title>Localization: Hardened the translation workflow so it can take an explicit list of batches and caps how…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-f86b273eed0d</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Hardened the translation workflow so it can take an explicit list of batches and caps how many sub-agents it launches at once, after the auto-discovery step over-counted at full scale and ran past the per-run agent limit. Updated the coverage snapshot and the per-language runbook.]]></description>
    </item>
    <item>
      <title>Design tools: Split the ConvoBuilder dialogue-authoring tool's 7,681-line MainForm, a single WinForms…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-58d38ece6e6a</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Split the <b>ConvoBuilder</b> dialogue-authoring tool's 7,681-line MainForm, a single WinForms class that mixed the editor UI with database, Perforce, and file-export logic, into partial-class files by concern: one each for the database connect/load/delete code, the Perforce calls, the JSON/HTML/XML export and serialization, and the nested data classes. About 5,400 lines of UI handlers stayed in the main file. Part of the oversized-script (over 5,000 lines) paydown.]]></description>
    </item>
    <item>
      <title>Design tools: The split relocated code verbatim with no edits, so behavior is unchanged. Confirmed by a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-7debc73b6444</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[The split relocated code verbatim with no edits, so behavior is unchanged. Confirmed by a before/after compile producing the same result (same single pre-existing warning, no new errors) and a line-by-line check that the trimmed main file equals the original minus the moved blocks.]]></description>
    </item>
    <item>
      <title>Server: Audited the server's handling of player-sent data for input that gets stored as-is and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-3329145d5328</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Audited the server's handling of player-sent data for input that gets stored as-is and could break the game at the database layer: a document grown past the database's hard 16 MB limit (after which it can no longer be saved or loaded), an over-long value in an indexed field, an uncaught duplicate-key error, an unescaped player search compiled into a database query pattern, a player string used as a document field name, unbounded list growth, and integer overflow. The sweep produced 106 candidate findings; a second checking pass discarded 32 that were already handled or wrong, leaving 11 confirmed game-blockers.]]></description>
    </item>
    <item>
      <title>Server: The confirmed cases sit in the plot and scene records that accept a client property bag…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-b58a6472edd2</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[The confirmed cases sit in the plot and scene records that accept a client property bag with no size or key check, the per-character and per-account knowledge lists, party storage, and a player-vendor sale where an overflowing price throws partway through and leaves the shelf items locked. Recorded the findings, the failure-mode taxonomy, and the fix approach (reject bad edits with a clear error, clamp only where data loss is harmless, enforce at both the request handler and the database-write layer) under docs/security, and filed a tracking epic plus 13 fix tasks. This pass is the audit and plan; no fix code yet.]]></description>
    </item>
    <item>
      <title>Test shard / data: Reseeded the test shard from a sanitized copy of the live game database: 8,798,757…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-a8a2b6887830</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Reseeded the test shard from a sanitized copy of the live game database: 8,798,757 records restored with zero failures, giving the server production-scale data to test against. Sensitive collections (payments, cached credentials, anti-cheat and hardware-tracking data) are dropped before the data leaves the build machine and again on the target, and per-record personal data (last login IP, hardware-fingerprint history, and the private notes players leave about one another) is cleared after the restore. Snapshotted the box for rollback first and re-ran the security check after, which stayed green with no exposed database ports.]]></description>
    </item>
    <item>
      <title>Test shard / data: Turned the run into a documented, repeatable procedure plus a separate live-safe restore…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-e745595e1b53</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Turned the run into a documented, repeatable procedure plus a separate live-safe restore runbook that covers any target up to production recovery, and committed the on-box worker script that performs it. Wrote down the traps that bit on the first attempt: the database restore tools the current server package no longer bundles and must be installed separately, the restore flag the newer tools require, rebuilding indexes from server code instead of trusting the dump, dropping the sensitive collections a restore won't remove on its own, and running the multi-step restore as a detached task so it survives a dropped admin session.]]></description>
    </item>
    <item>
      <title>Test shard / data: Added a way to log into the test shard as a specific restored player's account, so we can…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-5a983d369f30</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Added a way to log into the test shard as a specific restored player's account, so we can inspect a real player's characters and inventory in the client: pointing a test login at a chosen account's id makes the game load that account's data, with no extra data copied. Documented the recipe and how to reverse it.]]></description>
    </item>
    <item>
      <title>Test shard / data: Tracked down why a player-owned town on the test shard showed almost none of its houses…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-6b1c6062a1ea</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Tracked down why a player-owned town on the test shard showed almost none of its houses. The lot, deed, and house data was all intact; the cause was a server-side report that records each town's owner and size. The copy on the test shard was an old snapshot from the data restore that predated the town, so the server had no record the scene was a player-owned town, its town setup returned early, and the houses never loaded through that path. A client-side load hang (fixed separately) had made it look fully empty.]]></description>
    </item>
    <item>
      <title>Test shard / data: Wired that report's regeneration into the test-shard server deploy. The live environments…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-6b5d538112f6</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Wired that report's regeneration into the test-shard server deploy. The live environments rebuild it from current game data on every deploy, but the test-shard deploy had been shipping whatever stale copy was already in the build. The deploy now regenerates it from the current game assets when freshly built source reports are present, and warns with an age check when they are not, so a stale report can no longer ship unnoticed. The owner and size come from a committed game asset, so the test shard can build a correct report from its own checkout with no live account data. Added a standalone refresh script and a doc covering the generation pipeline; the scheduled job that rebuilds the source reports is currently paused, which was flagged rather than changed.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Stopped the patch publish from shipping Unity's "do-not-ship" build output. Every deploy…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-78c623188b13</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Stopped the patch publish from shipping Unity's "do-not-ship" build output. Every deploy copied the whole build tree, including the IL2CPP <code>SotA_BackUpThisFolder_ButDontShipItWithYourGame</code> folder (generated C++ source and debug symbols) and the Burst debug folder, which players were then downloading. Added a publish-side ignore filter that drops them before staging, so they are never copied, listed in the manifest, or pushed; the local build keeps them for crash symbolication.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Kept the new ignore separate from the existing exclude list, which is client-side delete…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-c82e86343ad2</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Kept the new ignore separate from the existing exclude list, which is client-side delete protection (it stops the updater removing player files but still ships the files). The ignore defaults to the two folders Unity marks do-not-ship, is wired through the publish CLI and the patch-publish script, and is covered by tests for copy and no-copy publishing.]]></description>
    </item>
    <item>
      <title>Security / DDoS readiness: Audited every spot exposed to a denial-of-service or UDP flood across the game shard and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-e8dd622c702a</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Audited every spot exposed to a denial-of-service or UDP flood across the game shard and the web/portal host, and ranked them by live versus latent risk. The top live exposure is the game's forwarded UDP traffic, which has no per-source rate limit and no kernel-level flood tuning on the host. Behind that: connection and login caps are per-connection rather than per-source, so one source can still wedge logins; the legacy cross-domain policy listeners are an amplification vector and look obsolete; and the inter-server registration ports are bound wide-open but, on this deployment, are not actually forwarded to the internet, so they are a latent hardening item rather than a live hole. The web host answers on a directly reachable address with no global request limits.]]></description>
    </item>
    <item>
      <title>Security / DDoS readiness: Turned it into a before/during/after plan weighted toward cheap preparation, since…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-beabf8f22d07</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Turned it into a before/during/after plan weighted toward cheap preparation, since several hours of downtime is tolerable and repointing players to clean capacity is therefore a real response. The headline prep is switching the client from a hard-coded server address to a name, so a move becomes a quick name-record change instead of a full client rebuild and re-patch. The rest is staging the hosting provider's edge firewall rules and a content-delivery network in front of the web tier without turning them on, ready-to-apply host and server hardening, and capturing a normal-traffic baseline plus alerting so an attack is distinguishable from a launch surge. Nothing was applied; filed as a roadmap item and linked into the ops docs and the pre-deploy security check.]]></description>
    </item>
    <item>
      <title>Planning / docs: Evaluated moving the Unity client's asset loading to Unity Addressables. The client is…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-ae9f61dee9c9</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Evaluated moving the Unity client's asset loading to Unity Addressables. The client is already on a custom asset-bundle system, not the older Resources-based loading the original task assumed, so the real choice is Addressables versus the existing bundles. The advantages are developer-side only: getting off a deprecated build API, deleting hand-written GUID-catalog and reference-counting code, and gaining Unity's bundle authoring and analysis tooling. There is no player-facing gain, because the patcher already ships only the changed bytes and the loader is already asynchronous.]]></description>
    </item>
    <item>
      <title>Planning / docs: Wrote a concrete prototype plan: a three-to-four-week spike behind the existing…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-347ca5c5d8d5</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Wrote a concrete prototype plan: a three-to-four-week spike behind the existing asset-load facade that builds one pilot category in parallel with the current bundles, behind a build switch and with a shippable fallback, and that must clear three gates — no regression in patch-download size, parity on load time and memory, and a demonstrated tooling win — before any larger migration. Left it deferred to run only on explicit go-ahead and filed it as a tracking task. (Gitea #137)]]></description>
    </item>
    <item>
      <title>Planning / docs: Designed a way for an automated tester or operator to control a shipped game client from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-1bd652bf2e99</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Designed a way for an automated tester or operator to control a shipped game client from outside the process: run scenarios, read game state, and take screenshots. The plan reuses the existing loopback chat bridge, which already runs in the shipped build with a local-only socket and a per-session token, rather than adding a new in-client web server, and puts a small out-of-process adapter in front so an agent can drive it. Phased from read-state and screenshots first up to driving the avatar last; filed as a roadmap item and a tracking task. (Gitea #135)]]></description>
    </item>
    <item>
      <title>Planning / docs: Settled the screenshot path, since seeing the client is the most useful part: a capture…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-5ee6a6430e48</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Settled the screenshot path, since seeing the client is the most useful part: a capture is written to disk as a file and the adapter hands the image to the agent to evaluate. The on-disk capture code already ships in the client, and saving every shot doubles as durable evidence to attach to a bug report. Noted it needs a windowed build with graphics, not a headless one.]]></description>
    </item>
    <item>
      <title>Planning / docs: Evaluated what it would take to fully replace the legacy web stack — the public site…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-e76cd21c5cbf</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Evaluated what it would take to fully replace the legacy web stack — the public site, forum, store, real-money payments, and the account/login, entitlement, and purchase-delivery services the game server still calls at runtime. It is the one large system left with no replacement built. Produced a project-wide what's-left ledger and a deep dive on the money-and-account path: checkout, delivering bought items into the game, and granting monthly and subscription rewards.]]></description>
    </item>
    <item>
      <title>Planning / docs: Recommended replacing it gradually rather than in one big-bang rewrite: stand up a new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-29.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-29-3a6aa9d30a94</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Recommended replacing it gradually rather than in one big-bang rewrite: stand up a new service that speaks the existing signed account and reward contracts in front of the current data, then retire the old surfaces one at a time, preserving years of purchase and account history in place. Decided to keep and modernize Stripe and PayPal and drop the two unused processors. Phased so each surface (login, purchase delivery, payments, store, account portal, forum) ships and is verifiable on its own; nothing built yet. Fleshed out the website-rebuild plan and updated the roadmap.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-28</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-headlines</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:41 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Finished game builds now come with a download link: the build server packages each player and posts it right on the build job page, instead of leaving it on disk to fetch by hand.</li>
        <li>Split the one big Unity build into separate jobs per platform and player type, each routed to run only where it's allowed (any machine can build a Mono player; an IL2CPP player builds on its own platform), plus a one-action deploy job that ships a build through the patch system and updates the game server. Now live on the build server, verified by building a Linux player through the new job in under a minute, and the Windows IL2CPP shipping client now builds green through CI too.</li>
        <li>Unlocked IL2CPP on macOS and Linux (it had been Windows-only) and moved the build definition into version control so the committed pipeline is what actually runs — then got the Mac build agent itself producing finished players, building both a Mac Mono and a Mac IL2CPP player green, after fixing why Mac jobs never started (a missing agent label), a too-low macOS file limit that crashed the build backend, and a build checkout on an external drive that broke Unity's asset importer.</li>
        <li>Filled in German across the whole game: every NPC conversation line and all menu, item, and skill text, taking German from 59% translated to complete apart from in-game book contents (~49,000 new lines), translated by the in-house LLM pipeline and gated against the in-game markup rules.</li>
        <li>Audited the new German for meaning, not just markup: a model review of all ~49,000 machine-translated lines, every suspect line re-checked by a second model before any change, applied 3,474 fixes — mistranslated names, wrong-sense words, grammar, and formal/informal address decided by context — with 2,154 lower-confidence calls left for a native-speaker pass.</li>
        <li>Pinned down why pressing Play in the editor is slow: every play pays a steady ~11-13s of engine overhead (the C# domain reload plus loading the startup scene), and the first play of a session adds a large one-time asset-load cost that caches away, so the game's own startup drops from ~50s cold to ~3s warm.</li>
        <li>Gave the whole game a voice: generated and shipped about 98,000 AI voice clips so every NPC across 134 areas now speaks its dialogue in a cast voice, gender-matched by character description, with relayed lines in the right speaker's voice, area names spoken correctly, and player-name lines voiced instead of going silent. Live on the CDN.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Reworked the Jenkins Unity build into one parameterized pipeline that fans out across…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-3852d1b2fc78</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:40 -0500</pubDate>
      <description><![CDATA[Reworked the Jenkins Unity build into one parameterized pipeline that fans out across three OS-specific agents and builds both the Mono and IL2CPP player for each platform.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Made finished builds package and publish themselves: each player is zipped and archived…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-eb3ff817eb37</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:39 -0500</pubDate>
      <description><![CDATA[Made finished builds package and publish themselves: each player is zipped and archived so it downloads straight from the build job page. Before, builds were left on the build box with no link.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Switched the job to run its pipeline from the committed file in the repo instead of a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-2d1d44e41375</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:38 -0500</pubDate>
      <description><![CDATA[Switched the job to run its pipeline from the committed file in the repo instead of a script pasted into the web UI, so the two can't drift.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Removed the old restriction that only allowed IL2CPP on Windows; macOS and Linux IL2CPP…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-7c8952aebf9b</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:37 -0500</pubDate>
      <description><![CDATA[Removed the old restriction that only allowed IL2CPP on Windows; macOS and Linux IL2CPP build now too, each using that platform's C++ toolchain.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Extended the post-build check to confirm the player actually landed on every platform…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-ccac00113830</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:36 -0500</pubDate>
      <description><![CDATA[Extended the post-build check to confirm the player actually landed on every platform, not just Windows, so a Mac or Linux build that fails partway can't still report success.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Folded the separate Windows debug-build job into a flag on the main job, and documented…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-54c62abdee29</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:35 -0500</pubDate>
      <description><![CDATA[Folded the separate Windows debug-build job into a flag on the main job, and documented per-agent setup (toolchains, licensing, seeded checkouts) in the build docs.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Stood up the macOS build agent: installed a JDK, connected it to the build server over…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-68695083914c</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:34 -0500</pubDate>
      <description><![CDATA[Stood up the macOS build agent: installed a JDK, connected it to the build server over SSH with its workspace on the external drive, gave it the Unity and repo paths, and confirmed it runs the build job.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Fixed a portability bug in the build's plugin-strip step. It used a GNU-sed form the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-0b6820da26b1</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:33 -0500</pubDate>
      <description><![CDATA[Fixed a portability bug in the build's plugin-strip step. It used a GNU-sed form the macOS agent's BSD sed skipped, which left an editor-only plugin in the player and broke the compile; replaced it with a portable approach that works on both.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Copied the gitignored Curvy spline plugin onto the Mac build checkout so the project's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-eb4a8cb4d946</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:32 -0500</pubDate>
      <description><![CDATA[Copied the gitignored Curvy spline plugin onto the Mac build checkout so the project's scripts compile there, the same asset-store seeding the Linux builder needed.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Brought the Windows build agent online on the dev workstation, with its build workspace…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-2f8decbfec01</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:31 -0500</pubDate>
      <description><![CDATA[Brought the Windows build agent online on the dev workstation, with its build workspace on a separate drive and the C++ toolchain in place, so it can produce both Windows Mono and IL2CPP players.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Added a second build executor on the Linux build box using a copy-on-write clone of the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-e3607662c7e4</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:30 -0500</pubDate>
      <description><![CDATA[Added a second build executor on the Linux build box using a copy-on-write clone of the checkout, giving it a second independent Unity workspace so it can build two players at once, and allowed the build job to run more than one build concurrently. Confirmed with two Linux builds running side by side.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Made the build's plugin-exclusion step non-destructive: it temporarily drops the vendored…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-be9656cd9854</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:29 -0500</pubDate>
      <description><![CDATA[Made the build's plugin-exclusion step non-destructive: it temporarily drops the vendored editor-only Unity-MCP plugin so it can't compile into the player, then restores the plugin and the manifest right after the build, so a build never leaves the plugin deleted in a checkout.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Fixed the new Windows IL2CPP build job, which failed every run even though the player…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-c79f072c49c4</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:28 -0500</pubDate>
      <description><![CDATA[Fixed the new Windows IL2CPP build job, which failed every run even though the player built fine. The build temporarily removes an editor-only plugin and used to restore it with a git checkout; a stale git lock on the build checkout (left by an out-of-band refresh or an open editor) made that checkout fail, which failed the whole job and discarded the finished build. Switched the restore to a plain file move that never touches git, so a stray lock can't wedge it, and made a genuinely failed restore fail loudly instead of leaving the plugin deleted.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Verifying that surfaced two more Windows-only failures, both from the build agent being a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-34aa6ba68fb2</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:27 -0500</pubDate>
      <description><![CDATA[Verifying that surfaced two more Windows-only failures, both from the build agent being a dev workstation with the editor often open. Unity's exit code wasn't read reliably (it's a GUI app, so the usual launch leaves the code empty or hangs on Unity's background import workers), which faked a "build failed" on a build that actually succeeded; and a build that died on a Unity licensing-startup race left a stale project lock that blocked the next run. Now Unity is launched through the .NET process API and waited on by just its main process for the real exit code, and a stale build-tree lock is cleared before each attempt. The Windows IL2CPP client now builds green end to end and uploads its zip; the same fixes went to all six client jobs.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Fixed client-windows-mono, which failed in under a second with an X display error. A full…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-17577d3f4075</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:26 -0500</pubDate>
      <description><![CDATA[Fixed client-windows-mono, which failed in under a second with an X display error. A full build renders the asset bundles and needs a graphics context, so the Linux build machine points Unity at a headless GPU display; that was only wired up for Linux-target builds, but the Windows Mono player is cross-built on the same Linux machine, so it got no display and died on startup. Pointed every non-Mac full build at the display. Verified: it now lands on the Linux machine and runs the asset-bundle pass under the GPU display instead of failing instantly, the same path the Linux builds already pass.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Recovered source files the vendored Unity-MCP plugin needs (its log-collector and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-f42db0e83e44</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:25 -0500</pubDate>
      <description><![CDATA[Recovered source files the vendored Unity-MCP plugin needs (its log-collector and log-storage types): the repo's generic Logs/ ignore rule had excluded the plugin's own Logs folder when it was vendored, so it was never in version control and a clean checkout couldn't compile the plugin. Restored the folder from the package registry and added a gitignore exception so it stays tracked.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Reworked the single parameterized build job into separate jobs, one per platform and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-e60adbfff619</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:24 -0500</pubDate>
      <description><![CDATA[Reworked the single parameterized build job into separate jobs, one per platform and player type (six client jobs), so each can be triggered and read on its own instead of one job with a row of checkboxes.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Encoded where each job is allowed to run: any agent can build a Mono player, but an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-781abb5401d2</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:23 -0500</pubDate>
      <description><![CDATA[Encoded where each job is allowed to run: any agent can build a Mono player, but an IL2CPP player must build on that platform's own machine because it needs the native C++ toolchain. Routing is by capability labels on the agents, and keeping one build slot per machine stops two jobs from sharing a checkout and corrupting each other's import cache.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Added a job that builds the C# server and archives the result, so a release no longer…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-77136ba568ef</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:22 -0500</pubDate>
      <description><![CDATA[Added a job that builds the C# server and archives the result, so a release no longer depends on a server build done by hand on a developer's machine.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Added a manual deploy job that takes a built client and server and runs the existing…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-0a1824304aac</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:21 -0500</pubDate>
      <description><![CDATA[Added a manual deploy job that takes a built client and server and runs the existing release flow: publish the client through the patch system and update the game server, the same path the in-editor Release button uses. It defaults to the test channel and pauses for confirmation before touching QA or live.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Made the jobs definition-as-code: one seed job generates every entry from a single list…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-d7c235eaa413</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[Made the jobs definition-as-code: one seed job generates every entry from a single list, with the shared build and deploy logic kept in one file, so adding a platform or changing a build step is one edit plus a re-run. Left the old combined job in place, marked deprecated, until the new jobs are verified on the farm.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Applied the new setup to the build server: installed the three Jenkins plugins it needs…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-226c712e7b4a</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[Applied the new setup to the build server: installed the three Jenkins plugins it needs, labeled the four build agents by what each can actually produce, and generated all nine jobs from the seed (no controller restart needed). Confirmed it works end to end by building a Linux player through the new job, which produced and archived a ~98 MB player in under a minute.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Brought the Windows build agent back online. The controller had the Windows node flagged…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-b77187b4bf5d</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[Brought the Windows build agent back online. The controller had the Windows node flagged offline from earlier troubleshooting, and an agent reconnecting doesn't clear that flag, so the node stayed offline even though the agent process was connected and healthy the whole time. Cleared the flag; the node takes jobs again.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Made the Windows agent survive a reboot. It had been a bare foreground process with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-c232de5e04ff</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[Made the Windows agent survive a reboot. It had been a bare foreground process with nothing to restart it, so a logoff or reboot would drop the node. Added a logon scheduled task that relaunches it in the user session, kept in the session rather than run as a system service so the per-user Unity license still resolves, with a committed installer and a secret-free launcher template.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Ran down why the agent had been crash-looping earlier: its Java runtime was older than…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-acfc72d7c42f</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Ran down why the agent had been crash-looping earlier: its Java runtime was older than the controller's, so it couldn't load the controller's classes and the connection flapped. The launcher was already moved onto a matching runtime; wrote the requirement into the build docs so it doesn't recur.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Hardened the Windows build against a Unity licensing startup race. A stale licensing…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-38396f24409c</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[Hardened the Windows build against a Unity licensing startup race. A stale licensing helper left from an earlier editor session can reject the current editor's newer handshake and fail the build before it starts. The build now retries once past that error, and the docs record the permanent fix.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Documented the failure modes in the build-machine ops notes: the offline-but-connected…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-2ed750b9672d</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[Documented the failure modes in the build-machine ops notes: the offline-but-connected flag, the agent runtime requirement, the licensing race, and a config issue where the Windows node builds the live developer checkout instead of a dedicated build tree.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Fixed that last one: pointed the Windows build node at its own dedicated checkout (a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-d8c136c097fe</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[Fixed that last one: pointed the Windows build node at its own dedicated checkout (a separate full clone with its own warm import cache) instead of the live developer working copy, so a build no longer collides with an open editor or briefly modifies the dev tree. Updated the docs to match.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Found why a full build (player plus asset bundles) had never actually run on the headless…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-e8c96487ab83</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Found why a full build (player plus asset bundles) had never actually run on the headless build server: building the bundles loads the game's terrains, which need a graphics device to render their splat materials, and the server runs with graphics disabled, so it crashed. Gave the full-build path a software graphics context (an off-screen X server plus a software GL driver) so the bundle pipeline runs without a card. It works but is slow without real hardware; a GPU is going into the box to make it fast.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Closed a false-success hole in the headless build entry point: when a build step failed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-95572dbd77be</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Closed a false-success hole in the headless build entry point: when a build step failed, it logged the failure but the editor still exited zero, so the job went green and archived an incomplete player. It now exits non-zero on any step failure, so a broken build fails the job instead of shipping. Compile-checked against the editor assembly.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Committed the Unity 6.5 project housekeeping the editor had left uncommitted: the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-94871f9291eb</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Committed the Unity 6.5 project housekeeping the editor had left uncommitted: the QualitySettings file reserialized to the new format, a refreshed package lock, and an orphaned settings .meta removed.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Tracked down why selecting a Mac build did nothing and the job hung on "no nodes with the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-559076fd7a92</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Tracked down why selecting a Mac build did nothing and the job hung on "no nodes with the label": the Mac build agent was online, but carried only its OS label, not the per-player capability labels the Mac jobs route to, so the jobs queued forever with nowhere to run. Added the labels; Mac builds now schedule and run on the Mac.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Raised the Mac agent's open-files limit, which macOS defaults far too low. The low cap…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-9454e9343e8b</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Raised the Mac agent's open-files limit, which macOS defaults far too low. The low cap starved Unity's native build backend mid-build, which Unity then reported as a misleading "scripts have compiler errors" with no actual errors. Set the limit high on the agent launch so the build backend has the descriptors it needs.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Moved the Mac agent's build checkout off an external exFAT drive onto internal storage…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-bc8b97813da2</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Moved the Mac agent's build checkout off an external exFAT drive onto internal storage. exFAT can't hold the file locks and metadata Unity's build backend and asset importer need, so a full build failed importing a scene-data asset it wrongly reported as corrupt; the identical code builds clean from internal storage.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Refreshed the Mac build checkout to current code (it was hundreds of commits behind) with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-ef44ee1e215f</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Refreshed the Mac build checkout to current code (it was hundreds of commits behind) with a LAN file copy of just the changed files from an up-to-date checkout, since a fresh clone of this large asset repo over the network stalls. Being behind had also kept Mac IL2CPP blocked, because the older build code still rejected it.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Confirmed both Mac players build green on the agent and package their own download: a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-77b3900f70dd</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Confirmed both Mac players build green on the agent and package their own download: a Mono player and an IL2CPP player. The Mac IL2CPP build compiled with the installed command-line developer tools, so no full IDE install was needed. Wrote the Mac agent setup and the limit, exFAT, and tree-refresh gotchas into the build-machine ops notes.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Sped up a stuck client patch upload that was crawling at about 1/100th of its normal…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-8eff7d6d549e</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Sped up a stuck client patch upload that was crawling at about 1/100th of its normal rate. It was routing through WSL's copy of rsync, which reads the multi-gigabyte build tree over the Windows-to-Linux file bridge and pushes it through a slow virtual network adapter. Installed native rsync on the Windows build agent and the same push finished at full speed in seconds.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Stopped the publish script from silently choosing that slow path again: its automatic…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-676b9519730e</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Stopped the publish script from silently choosing that slow path again: its automatic transport now uses native rsync only and fails fast with the fix to run when rsync is missing, instead of quietly dropping back to the WSL path. WSL stays available, but only when asked for by name.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Fixed a latent bug in the native-rsync path that would have failed the first real use: it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-d441aeaba6ba</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Fixed a latent bug in the native-rsync path that would have failed the first real use: it ran the transfer over the operating system's built-in SSH, which corrupts native rsync's binary stream and drops the connection at once. It now uses the matching SSH that ships next to rsync.]]></description>
    </item>
    <item>
      <title>Build &amp; CI: Caught a permissions regression in the same path during verification: native rsync had…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-059ad11b24c1</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Caught a permissions regression in the same path during verification: native rsync had uploaded the build without world-read access, so the web server couldn't read it and the download returned not-found. Pinned every upload to web-servable permissions, restored access on the affected build, and recorded the native-rsync requirement in the build-agent docs.]]></description>
    </item>
    <item>
      <title>Localization: Extended the German audit to the medium-severity flags: a second model re-judged all…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-e3a6d0fad56e</guid>
      <pubDate>Sun, 28 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Extended the German audit to the medium-severity flags: a second model re-judged all 2,534 with a context-aware register rule (the first pass had treated every informal "du" as wrong, but the game uses informal address in some contexts, like children or intimate speech), confirmed 2,029 and rejected 498, and applied the confirmed ones that still passed the markup checker. That brings the audit to 3,474 fixes across 106 files (grammar, register, mistranslations, duplications), with 2,154 lower-severity lines left for a native-speaker review. The du/Ihr cleanup is not complete; the quest-task convention still needs a native speaker to settle before any live push.]]></description>
    </item>
    <item>
      <title>Localization: Made the audit tool idempotent so re-runs don't rewrite already-fixed lines, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-84aa9472e409</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Made the audit tool idempotent so re-runs don't rewrite already-fixed lines, and confirmed the keyword glossary self-corrects: regenerated from the fixed text, the wrong "family = magic" entry flips back and the context-dependent keywords stop being treated as fixed terms.]]></description>
    </item>
    <item>
      <title>Localization: Ran a full meaning-and-grammar audit of all 48,942 machine-translated German lines…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-27659b3d87bf</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Ran a full meaning-and-grammar audit of all 48,942 machine-translated German lines, separate from the markup check (which only catches structural breakage). A first model flagged suspect lines with a severity and a suggested fix; a second model independently re-checked every high-severity flag (1,415 confirmed, 174 thrown out as false positives); only high-severity, double-confirmed fixes that still passed the markup checker were written: 1,426 across 94 files. It caught over-translated proper names (a character surname "Price" rendered as the word "Preis"), wrong-sense words ("Page" of an item translated as a pageboy haircut instead of a book page), informal "du" where the game uses the formal "Ihr", duplicated words, and grammar. The 4,205 lower-severity flags were queued for a native-speaker review pass. Test shard only.]]></description>
    </item>
    <item>
      <title>Localization: Hit a glossary bug while auditing: the keyword-term list mined from the original fill had…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-725e484b20ba</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Hit a glossary bug while auditing: the keyword-term list mined from the original fill had a few wrong "canonical" German words (it listed the keyword "family" as "magic"), and the translation step would have silently reimposed them, undoing the reviewer's fixes. The audit now writes the reviewer's wording as-is and skips that substitution.]]></description>
    </item>
    <item>
      <title>Localization: Re-audited the German fill line by line against the English source and fixed the output…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-7ca0241c30cd</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Re-audited the German fill line by line against the English source and fixed the output errors it surfaced: eight journal entries carried a literal "\n" where a paragraph break belonged, and one Oracle line had dropped a player-name token and repeated a word ("Ihr Eurem Eurem ..."). Corrected both, re-ran the markup checker on the changes, and regenerated the two affected in-game text files. The other ~49,000 machine-translated lines came back clean on the structural checks (markup, encoding, placeholders, record counts).]]></description>
    </item>
    <item>
      <title>Localization: Translated all ~48,900 missing German lines. The pipeline split the work into batches…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-2474583f37aa</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Translated all ~48,900 missing German lines. The pipeline split the work into batches that one model translated, reusing the same context human translators were given (where each line appears, what its parameters mean) plus a glossary mined from the existing human translations so place names, character names, and the clickable in-dialogue keywords stay consistent; the existing markup checker rejected any line that dropped or broke an in-game tag, and a stronger model re-translated the rejects under stricter rules. NPC dialogue went from 62% to 100% and the menu/item/skill/journal text to 100%; only in-game book contents remain, which ship on a separate track.]]></description>
    </item>
    <item>
      <title>Localization: Did it without the retired web translation tool and without an outside translation…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-439ab9a26da3</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Did it without the retired web translation tool and without an outside translation service: the models run in-house as part of the dev tooling. Thirteen edge cases where the English source itself had broken formatting were balanced by hand. Every machine translation is tagged so it can be told apart from human work, re-reviewed, or rolled back. This targets the test shard only.]]></description>
    </item>
    <item>
      <title>Localization: Reviewed the result and shipped it to the test shard: cheap checks surfaced ~840 lines…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-f995cc8bd8e2</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Reviewed the result and shipped it to the test shard: cheap checks surfaced ~840 lines that looked off (English left in, odd length, garbled characters), a review model judged each, and the 48 genuinely wrong ones (mostly English place names like "Beautiful Meadow") were corrected and re-checked. Then regenerated the in-game German text files so the new translations load, including the 32 conversation scenes that had no German at all before.]]></description>
    </item>
    <item>
      <title>Localization: Updated the localization docs to match: the coverage snapshot now shows German at the top…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-d8b39a294996</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Updated the localization docs to match: the coverage snapshot now shows German at the top (59% to fully translated), and the workflow writeup describes the as-built pipeline so it can be pointed at the next language.]]></description>
    </item>
    <item>
      <title>Localization: Wrote a per-language runbook and saved the reusable translate and audit scripts so the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-32147fe107b9</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Wrote a per-language runbook and saved the reusable translate and audit scripts so the same fill can be run end to end for the other five languages, with the gotchas we hit written down.]]></description>
    </item>
    <item>
      <title>Performance: Trimmed an unneeded step from every zone load: after a zone finished loading, the client…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-6a464c9ab9d2</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Trimmed an unneeded step from every zone load: after a zone finished loading, the client searched the whole scene for dungeon-building pieces and asked each one to return any misplaced decorations to the player's inventory, but that only does anything on a plot you own. Guarded the search so it is skipped entirely when you do not own the plot you are on, which is the usual case when visiting a town. Behavior is unchanged in the common case; verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Profiled how long Ardoris takes to load after login, in the editor and against an actual…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-0ac06bc612c9</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Profiled how long Ardoris takes to load after login, in the editor and against an actual client build. The editor number was misleading: about 88s, most of it editor-only asset-tracking overhead. The built client loads Ardoris in about 48s the first time and about 12s after. Roughly 36s of that first load is one-time, reading the zone's asset bundles off cold disk, which then caches. The recurring per-zone cost is about 12s, spent building the scene, rebuilding the pathfinding graph, and the network scene-join.]]></description>
    </item>
    <item>
      <title>Performance: Captured it with no code changes and no manual clicking: drove a remembered-login zone…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-4ee766e45a73</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Captured it with no code changes and no manual clicking: drove a remembered-login zone load from the editor, read the game's own per-phase load-time log line for the breakdown, and attached the editor profiler to a running development build for the real per-frame hotspots, which put the cold freeze on synchronous asset-bundle reads on the main thread. Wrote the method and the Ardoris numbers into the ops docs.]]></description>
    </item>
    <item>
      <title>Performance: Added two opt-in editor timers to measure why pressing Play takes so long: one times the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-8bdc331befe0</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Added two opt-in editor timers to measure why pressing Play takes so long: one times the compile / domain-reload / scene-reload phases of entering Play, the other times the runtime bootstrap up to the login screen. Both default off; toggle under Tools &rsaquo; Performance.]]></description>
    </item>
    <item>
      <title>Performance: Then added per-step marks through the startup sequence and timed cold versus warm plays…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-5e46ba049c10</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Then added per-step marks through the startup sequence and timed cold versus warm plays. Two cost groups fell out. Every play pays a steady ~11-13s of engine overhead: the C# domain reload (~5-7s) plus deserializing the startup scene (~6s), with another ~11s of script compile only after a code edit. On top of that, the game's own startup is asset-load-bound and caches hard: ~3s on a warm play, but up to ~50s the first time in a session, almost all of it loading the rune data, the startup data assets, and the localization text for the first time.]]></description>
    </item>
    <item>
      <title>Performance: The useful surprise: for repeated iteration the slow part is the engine overhead, not our…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-41c23760885b</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[The useful surprise: for repeated iteration the slow part is the engine overhead, not our code, and instantiating the UI manager (an early suspect) turned out to be cheap. Logged the full breakdown in the performance-pass plan with the next levers ranked: turn off the play-mode domain reload (needs the static game bootstrap made re-entry-safe first), use a lighter editor bootstrap scene, then warm the first-load asset path. Measure-only so far; no game behavior changed.]]></description>
    </item>
    <item>
      <title>Performance: Scoped the top lever: tried Unity's "skip the C# reload when entering Play" option and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-519d8be377bb</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Scoped the top lever: tried Unity's "skip the C# reload when entering Play" option and measured the entry time drop from ~13.6s to about a third of a second. But the game then silently didn't start, because our whole startup runs from a one-time static setup that doesn't re-run without the reload. Wrote up what it would take to make that startup safe to re-run (a wide sweep of one-time state and event hookups across ~100 files) and a phased plan, and reverted the setting.]]></description>
    </item>
    <item>
      <title>Performance: Started on the other half of the slow editor loop: the ~11s recompile after a code edit…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-8a1feb4a4c94</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Started on the other half of the slow editor loop: the ~11s recompile after a code edit. Almost the whole C# client builds as a single assembly, including ~110,000 lines of server-mirrored shared code that rarely changes, so every script edit recompiles all of it. As the first step toward moving that mirrored code into its own assembly (so a normal edit stops rebuilding it), untangled the one combat damage type that reached back into client classes: moved its entity-lookup accessors into a small client-side helper and stored its aggro tag as a plain byte. Behaviour is identical, the client and editor assemblies both compile clean, and the server's mirror copies were updated to match. The assembly split itself is blocked, though: the mirrored code turned out to be tied into the client's data and storage layer, so cleanly separating it needs a larger restructure, which we wrote up and filed for later.]]></description>
    </item>
    <item>
      <title>Performance: Cut a recurring per-frame memory allocation in NPC movement, found with the profiler: the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-065fd7a91c50</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Cut a recurring per-frame memory allocation in NPC movement, found with the profiler: the navmesh wall-avoidance step allocated two fresh scratch buffers each time it ran (for every nearby NPC, on a timer), making steady garbage for the collector. It now reuses one set of buffers per NPC. A model review of the change flagged a possible aliasing bug; checked the one caller and confirmed it's safe, then tightened the code and documented why. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Removed most of the per-frame garbage from the client's cooperative-task scheduler, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-caaa7963119c</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Removed most of the per-frame garbage from the client's cooperative-task scheduler, the largest live allocation the profiler showed at the time. It resumes many short background routines each frame, and each resume was capturing and restoring async thread-context the scheduler never relies on; the custom awaiter now uses the lower-overhead completion path that skips that capture. No behavior change, since the scheduler runs every routine on the main thread.]]></description>
    </item>
    <item>
      <title>Performance: Stopped a file-browser dialog from scanning the disk every frame, found in the profiler…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-6ba98f9c3c3e</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Stopped a file-browser dialog from scanning the disk every frame, found in the profiler. The save/load/import file list re-read its directory and hashed every filename on every frame to notice new files, so it allocated steadily even while the dialog was closed. It now checks twice a second, which is imperceptible for a file list, and the list still fills immediately when opened. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Cut a per-frame allocation in the Lua scripting manager: it pushed about a dozen player…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-e1f476d9219e</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Cut a per-frame allocation in the Lua scripting manager: it pushed about a dozen player values (position, health, time) into the script environment every frame whenever Lua was loaded, even with no script enabled to read them, boxing each value into garbage. It now does that only when at least one script is actually enabled. Running scripts behave the same. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Cut a per-frame allocation in the mouse cursor, found in the profiler under the targeting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-2c37d268e748</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Cut a per-frame allocation in the mouse cursor, found in the profiler under the targeting update. Player targeting refreshes the cursor every frame, and the cursor manager re-applied the cursor to the operating system each time even when its image hadn't changed, which allocated steadily. It now only re-applies on an actual change, which also stops a repeated texture allocation in the double-size-cursor mode; the reticle got a matching change-guard. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Stopped a VFX texture-scroller from instancing materials, found in the profiler's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-4dfd643d0c80</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Stopped a VFX texture-scroller from instancing materials, found in the profiler's LateUpdate. The script that scrolls flowing textures (water, lava, banners) asked Unity for a private per-object copy of the material, which gave each of the 72 scrollers in Ardoris its own material and stopped them being drawn together, adding to the frame's draw-call cost. It now scrolls the shared material through a per-renderer property block and only runs while the object is on screen. Same look. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Took another run at the per-frame garbage in the cooperative-task scheduler, the largest…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-83f6a495f897</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Took another run at the per-frame garbage in the cooperative-task scheduler, the largest steady allocation the profiler showed. A deep capture traced it to the async machinery re-capturing the thread's execution-context on every routine resume, allocating a runner, a delegate, and a call-context copy each frame; an earlier attempt to skip that via the lower-overhead completion path didn't help, because this runtime's task builder captures regardless of the await path. Suppressing the capture only around the resume loop also missed: the builder resumes each routine inside a call that restores the routine's own previously-captured context, so the next await captured a fresh one and the cost came straight back. The fix is to suppress execution-context flow once when the scheduler is created, before any routine starts, so each routine's first capture comes back empty and the builder reuses a single cached continuation with nothing to allocate after that. The scheduler runs every routine on the main thread and never relies on that context flowing across awaits. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Cut a per-frame allocation in the Lua manager's on-screen-GUI hook, found in the profiler…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-a1842e0e6ff4</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Cut a per-frame allocation in the Lua manager's on-screen-GUI hook, found in the profiler under GUI repaint. Because the manager defines an on-GUI method, the engine ran its automatic immediate-mode layout pass every frame and allocated a layout group and backing lists each time, even with no script drawing anything (about 368 bytes a frame). The Lua drawing API only uses fixed-rectangle calls, not the auto-layout ones, so the manager now switches the layout pass off. Scripts that draw still work. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Cut another per-frame allocation under player targeting: the cursor and reticle hit-tests…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-492c5dd3d627</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Cut another per-frame allocation under player targeting: the cursor and reticle hit-tests were handed their target-setter methods directly, and because those are instance methods that becomes a fresh delegate allocated every frame. Cached the two delegates once and reused them. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Cut a small per-frame allocation in NPC path-following: the line-of-sight check between…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-d4d97f8d0de7</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Cut a small per-frame allocation in NPC path-following: the line-of-sight check between two path nodes called the navmesh linecast without telling it which node to start from, so the navmesh searched for the nearest node and allocated a throwaway constraint object on every call. It now passes the node the NPC is already on as the start hint, which skips both the search and the allocation and is identical otherwise. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Centralized the UI kit's per-widget update tick, which the profiler showed as a large…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-8d528abf8adf</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Centralized the UI kit's per-widget update tick, which the profiler showed as a large pile of tiny per-frame engine calls. Every UI element (label, sprite, panel, and so on) had the engine call its update and late-update on its own each frame, a separate native-to-managed crossing per element per method, and a busy screen has thousands of them. A single manager now holds the live elements in one list and ticks them all from one update and one late-update, calling each element's work directly. The work each element does is unchanged, anchor ordering is preserved, and it sits behind a compile flag so it can be switched back. Verified it compiles.]]></description>
    </item>
    <item>
      <title>Performance: Set the shipping standalone build's compiled-code optimization to its highest setting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-802cc5ae0fd4</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Set the shipping standalone build's compiled-code optimization to its highest setting (Master), trading a longer build for faster runtime in the player.]]></description>
    </item>
    <item>
      <title>Voice-over: Generalized the Ardoris voice-over tooling to cover the whole game. One shared module now…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-212c227c487c</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Generalized the Ardoris voice-over tooling to cover the whole game. One shared module now does the text normalization and clip-naming for the generator, the cost estimate, and the casting; a regression reproduces all 17,016 existing Ardoris clips exactly, so the offline tool and the in-game client stay byte-for-byte aligned.]]></description>
    </item>
    <item>
      <title>Voice-over: Read every NPC's voice key, display name, role, gender, and home area from the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-0ad99b7bd89f</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Read every NPC's voice key, display name, role, gender, and home area from the conversation prefabs, covering 1,729 characters with gender resolved for all of them.]]></description>
    </item>
    <item>
      <title>Voice-over: Wrote the casting step that assigns each character one of 140 voices using the voices'…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-1d1405b49d95</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Wrote the casting step that assigns each character one of 140 voices using the voices' own descriptions for age, accent, and tone, keeps male and female characters on gender-appropriate voices, and spreads voices so two characters in the same area rarely share one. The hand-picked Ardoris lead voices are kept as-is.]]></description>
    </item>
    <item>
      <title>Voice-over: Measured the whole job with no API spend: about 99,000 unique clips and 7.8 million…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-83f6db9e766a</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Measured the whole job with no API spend: about 99,000 unique clips and 7.8 million characters of dialogue, roughly seven times the Ardoris pilot.]]></description>
    </item>
    <item>
      <title>Voice-over: Moved off the voice model the provider just discontinued to its current higher-quality…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-b2a99e69e639</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Moved off the voice model the provider just discontinued to its current higher-quality one, and made the generator refuse the retired model. The Ardoris pilot will be regenerated on the new model.]]></description>
    </item>
    <item>
      <title>Voice-over: Surfaced a few characters whose stored gender disagrees with their hand-picked voice…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-1e70a1a0d3aa</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Surfaced a few characters whose stored gender disagrees with their hand-picked voice (such as a female-named merchant marked male in the data) for a person to settle, instead of silently flipping either.]]></description>
    </item>
    <item>
      <title>Voice-over: Made relayed lines play in the right voice: when one NPC speaks another's words (333…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-5328dab7ec5e</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Made relayed lines play in the right voice: when one NPC speaks another's words (333 lines across 35 areas), both the generator and the in-game client now resolve the original speaker and use that character's voice, sharing one name-to-voice table so they can't disagree. It falls back to the host NPC's voice if the speaker can't be matched, so nothing regresses.]]></description>
    </item>
    <item>
      <title>Voice-over: Fixed how lines that name the current area are voiced: about 600 lines that say the place…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-b6448f237885</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Fixed how lines that name the current area are voiced: about 600 lines that say the place name now use each area's real display name (such as "Highvale Outskirts" or "Brittany Wharfs"), read from the scene data for 105 areas, instead of the internal folder id, so those clips match what the player hears in that zone.]]></description>
    </item>
    <item>
      <title>Voice-over: Wrote up the whole-game voice pipeline end to end in the tooling readme so it runs as one…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-483b3254c630</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Wrote up the whole-game voice pipeline end to end in the tooling readme so it runs as one ordered sequence: pull NPC data, build the voice attributes and casting, resolve area names, estimate cost, run the parity checks, generate, publish.]]></description>
    </item>
    <item>
      <title>Voice-over: Generated voice for the whole game on the new model: about 98,000 clips across 134 areas…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-6dc6a05e7ba4</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Generated voice for the whole game on the new model: about 98,000 clips across 134 areas staged locally (the Soltown pilot plus every remaining scene), in their cast voices. Relayed lines, area-name lines, player-name lines, and non-speakable machine text are all handled. Not published to the CDN yet.]]></description>
    </item>
    <item>
      <title>Voice-over: Player-name lines now speak instead of going silent: a line like "Welcome back, &lt;name&gt;"…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-5571ad4dea8f</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Player-name lines now speak instead of going silent: a line like "Welcome back, &lt;name&gt;" is voiced with the generic address "outlander" (the word the game already uses when it doesn't know your name). The generator bakes that word in, and the client maps whatever the line actually substituted, your character name or an NPC's own "friend"/"traveller" fallback, back to the same word so the clip matches.]]></description>
    </item>
    <item>
      <title>Voice-over: Published the whole-game voice set to the content delivery network: 97,951 clips uploaded…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-fb2b0090f33a</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Published the whole-game voice set to the content delivery network: 97,951 clips uploaded with no failures, and after refreshing the cached lookup file, every area's voices are live (the lookup grew from the Ardoris-only 169 entries to 1,726). Also fixed the publish tool's cache-refresh step, which was failing on a header-encoding quirk, to use a more reliable call.]]></description>
    </item>
    <item>
      <title>Voice-over: Wired up automatic cache-refresh for the publish tool: with the right account credential…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-70d8f22c03fd</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Wired up automatic cache-refresh for the publish tool: with the right account credential stored locally and a throttle added for the provider's rate limit, the publish step now invalidates the changed index files on its own (143 refreshed, none failed), so a future voice update goes live without a manual dashboard step.]]></description>
    </item>
    <item>
      <title>Voice-over: Ran the first whole-game voice generation as a one-town pilot (Soltown): 3,476 lines…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-b5b8403e4739</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Ran the first whole-game voice generation as a one-town pilot (Soltown): 3,476 lines voiced on the new model in about five minutes, with each voice fitting its character (an authoritative town guard, a child, a villainous skeleton). One non-speakable line, a run of dots left after removing the player's name, returns no audio from the model; those lines are now skipped up front instead of erroring, so they're simply silent. Clips are staged locally, not published yet.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Cleared the build warnings the Unity 6.5 upgrade surfaced: obsolete-API uses (CS0618)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-6cb5ede917c8</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Cleared the build warnings the Unity 6.5 upgrade surfaced: obsolete-API uses (CS0618), the new serialization-rules analyzer, and one member-hiding warning.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Fixed the ones worth fixing in code: the volumetric-lighting octree now marks its parent…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-220fc59c3256</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Fixed the ones worth fixing in code: the volumetric-lighting octree now marks its parent and child back-references non-serialized, which also stops a repeated runtime "serialization depth limit exceeded" message; deleted image-effect calls to a render-texture method that no longer does anything; moved the Gaia editor onto the current scripting-define API; and annotated about 22 of our own scripts whose runtime caches, dictionaries, and 2D arrays were never meant to serialize.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Suppressed the unavoidable third-party noise with a single path-scoped editorconfig…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-fda56b336373</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Suppressed the unavoidable third-party noise with a single path-scoped editorconfig rather than editing vendored plugin code: plugins that still rely on the deprecated Built-In Render Pipeline components (projectors, flare layers) keep compiling without warnings, while the analyzers stay fully active on our own code. Verified with a headless build that the listed warnings are gone, and wrote up the mechanism and its gotchas in the Unity 6 upgrade notes for the next pass.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Added a scene tool to clear the runtime "BoxCollider does not support negative scale or…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-345ecdffe9cb</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Added a scene tool to clear the runtime "BoxCollider does not support negative scale or size" warnings (Ardoris alone logged 24 on load) by removing what triggers them. It sets negative collider sizes positive, and for a collider flipped by a negative transform scale it bakes the mirror into a generated mesh and resets the scale to positive, so the object looks the same. Edits are made in the scene and recorded as prefab-instance overrides where the object comes from a prefab, so shared prefabs and their other instances are left alone. Scoped to negative-scaled objects that actually carry a Box/Sphere/Capsule collider, it covers the prefab-instance and parent-group cases the existing mirror-bake tool skipped. Menu: Maintenance &rsaquo; Negative Scale &rsaquo; <b>Fix Collider Warnings</b> (current scene or all scenes, dry run or FIX). First targets are the Ardoris Orn_el5 props, Guardpost wall cubes, and Ruins curbs.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Followed up on that warning cleanup after the warnings kept showing in the editor: the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-5f366e88486f</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Followed up on that warning cleanup after the warnings kept showing in the editor: the path-scoped editorconfig only silenced the obsolete-API (CS0618) and serialization-analyzer warnings for the IDE and the headless dotnet build. Unity's own compiler ignored it, so the Editor Console and the Unity and CI builds still listed every one of them. Unity skips a project-root editorconfig, and even an Assets-level copy, because the file name starts with a dot and the asset database never imports it.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Suppressed those warnings where Unity's compiler does read them: a file-scoped pragma on…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-6af29e28e6c5</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Suppressed those warnings where Unity's compiler does read them: a file-scoped pragma on each of the 26 affected scripts, the Built-In Render Pipeline projector, flare-layer, and deferred-path uses plus the vendored serialization flags, kept narrow so the analyzers stay active on the rest of our code. The server-mirrored SceneAdvertisement got the same pragma in both copies to stay byte-identical. Verified with a clean editor rebuild that read the console directly: no compile errors, and none of the 26 files warn anymore. Corrected the upgrade notes, which had said the editorconfig covered the editor too.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Cleared a further batch of 6.5 build warnings in vendored plugins with file-scoped…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-296fe1b4a8fd</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Cleared a further batch of 6.5 build warnings in vendored plugins with file-scoped pragmas: the leftover Built-In Render Pipeline deprecations (Projector, FlareLayer, the removed DeferredLighting render path, the dropped OpenGLES2 check) in the DCG water shader, Ceto, ImposterSystem, HxVolumetricLighting, the PostProcessing stack, and a Standard Assets image effect, plus one unused MoonSharp field. Scoped per file so the same deprecation warnings still surface on our own code.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Did the same for the new serialization-rules analyzer where it only flags third-party…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-dea1f1daefd1</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Did the same for the new serialization-rules analyzer where it only flags third-party code: Gaia, Heatmaps, and FinalIK go in version control. Curvy and DevTools live in the gitignored Packages folder, so those pragmas clear the editor console here but can't be committed; a project-wide compiler-response flag is the fallback if that set ever needs silencing on the build farm too.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Pragma'd two more vendored Gaia files the upgrade flagged: the deprecated Built-In Render…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-ed4897b893ec</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Pragma'd two more vendored Gaia files the upgrade flagged: the deprecated Built-In Render Pipeline flare layer in the camera-effects tool, and the deprecated NavigationStatic flag in the spawner (its replacement needs a NavMesh-builder rewrite). Both files are in version control. The matching Curvy fixes (an int-to-EntityId cast and a debug serialization field) sit in the gitignored Packages folder, so those clear the local console but don't commit.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Root-caused a recurring client-only error from the vendored Ceto ocean plugin…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-bd7ab8b8ac4c</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Root-caused a recurring client-only error from the vendored Ceto ocean plugin, "Destroying object … is not allowed at this time," that three earlier attempts hadn't stopped. The earlier guards keyed on Application.isPlaying, which is always true in a shipped client, so their corrective path only ever ran in the editor while the build kept making the deferred destroy call Unity forbids while a scene unloads or the app quits. It only reproduces in a player, so a headless compile never caught it.]]></description>
    </item>
    <item>
      <title>Unity 6 upgrade: Reworked it to key on actual teardown state and destroy the render textures synchronously…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-390bdf09ae01</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Reworked it to key on actual teardown state and destroy the render textures synchronously then, keeping the deferred destroy for normal mid-game buffer recreation, and routed every Ceto teardown destroy through one helper so the same error can't resurface from a sibling path (reflection/depth/mask cameras, projected-grid meshes, FFT and spectrum textures). Compiles clean against the Unity 6.5 assemblies; still to be confirmed in a client build. Wrote the root cause and fix into the Unity 6 upgrade notes.]]></description>
    </item>
    <item>
      <title>Oracle: Added a Lord British entry to the in-game Oracle's player-facing knowledge base, its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-6a16ca841173</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Added a Lord British entry to the in-game Oracle's player-facing knowledge base, its first lore page in a base that until now held only gameplay help. A player had asked the Oracle who Lord British is, the knowledge base had no answer, so the Oracle filed Gitea #105. Wrote the entry from the game's own dialogue (the king of New Britannia, his queen Arabella, their children Kinga and Ronin, his castles in Brittany and Mistrendur), rebuilt the search index, and restarted the service; the Oracle now answers the question.]]></description>
    </item>
    <item>
      <title>Oracle: Added a dragons entry to the Oracle knowledge base after a player asked about dragons and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-381195a8feed</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Added a dragons entry to the Oracle knowledge base after a player asked about dragons and got no answer (Gitea #98). Wrote it from the game's own journal, books, and ability data: where dragons appear (Ulfheim's high chief white dragon, the dragons over Jade Valley, the Wyrmsands), the kinds (fire, baby, Elder and Ancient, clockwork), their real attacks (Dragon Fire breath, Dragon Bite, melee Dragon Breath, the wyvern-style tail strike), aerial-versus-ground tactics, and what you can harvest (dragon teeth for the Ulfheim collector, dragon bones for ritual crafting). Drop rates and engine internals left out per the public-content rules. Rebuilt the search index on the box and restarted the service; the Oracle now answers dragon questions (the entry is the top knowledge-base hit for dragon queries).]]></description>
    </item>
    <item>
      <title>Stability / log triage: Stopped a client log flood from creature and pet attacks (Gitea #102). Combat telemetry…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-2839f8004915</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Stopped a client log flood from creature and pet attacks (Gitea #102). Combat telemetry reads a rune's display name on nearly every nearby cast, and a rune with no associated skill logged an error each time, about 2,500 errors a day on the test shard, mostly creature, NPC, and tamed-pet attacks. Those abilities aren't player-learnable skills, so the missing skill is expected, not a fault: the display-name lookup now warns once per distinct rune and falls back to the rune name without logging, leaving the real missing-localization check untouched. Clears on the shard after the next republish.]]></description>
    </item>
    <item>
      <title>Balance dashboard: Stopped the live Balance dashboard flashing on every refresh. The 3.5s auto-update was…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-551c71febf65</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Stopped the live Balance dashboard flashing on every refresh. The 3.5s auto-update was reloading each chart from scratch, which flashed the chart's loading overlay, replayed the draw-in animation, and rebuilt the summary cards. The background refresh now merges new data into the existing charts and writes the new numbers into the cards in place, so it keeps updating at the same rate with no flash and the chart's current zoom is kept. Explicit actions like changing a metric, range, or filter still show the loading spinner and redraw.]]></description>
    </item>
    <item>
      <title>Docs &amp; research: Investigated a tracker task to adopt the "TMP Advanced Text Generator" and found the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-28-ba290e3b8084</guid>
      <pubDate>Sun, 28 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Investigated a tracker task to adopt the "TMP Advanced Text Generator" and found the premise was wrong. The 10-40% text-CPU win is Unity's new Advanced Text Generator, which in 6.5 is the default backend for UI Toolkit text only; TextMeshPro and the legacy uGUI text keep their own unchanged generator, and bringing the new generator to those is a later opt-in. The win is also gated on an NGUI-to-uGUI UI migration the project hasn't started. Corrected the feature-adoption doc and closed the task as not-actionable, noting that the UI migration still has no roadmap epic despite being the top upgrade risk.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-27</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-headlines</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Gave Ardoris a voice: 17,016 AI-generated NPC lines now play in their own cast voices as you talk to townsfolk, streamed from the CDN and confirmed live in the editor.</li>
        <li>The build farm went fully autonomous: one Jenkins run now turns a cold checkout into finished Windows and Linux clients, license and all.</li>
        <li>Brought every terrain and every scene onto Unity 6's current format in one sweep, 475 terrains and all 448 scenes, clearing deprecated-format warnings game-wide.</li>
        <li>Killed the login server's phantom "max player capacity" wall that was turning players away while the shard sat empty.</li>
        <li>Rebuilt the test shard's entire database index set from the server's own definitions after a reload had stripped them.</li>
        <li>Taught the <code>/balance</code> combat recorder the whole pet story, damage, deaths, abilities, survivability, with their own live dashboards.</li>
        <li>Documented the entire text-localization pipeline end to end and measured how far each of the seven languages is translated, then started replacing the retired translation tool with an LLM pipeline that translates and self-reviews to close the gaps, German first.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Client / UI: Fixed rename dialogs (item/house) dropping the first character you type. The text field…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-c12c2825f104</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Fixed rename dialogs (item/house) dropping the first character you type. The text field threw away keyboard input on the same frame it auto-focused; that was harmless before but started eating the first keystroke after the engine upgrade shifted when the first character arrives. It now keeps that character.]]></description>
    </item>
    <item>
      <title>Client / UI: Removed the leftover CanvasRenderer the engine upgrade left on world-space 3D text…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-95448511c521</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Removed the leftover CanvasRenderer the engine upgrade left on world-space 3D text objects (the guild/name/title/health nameplate labels and a couple of others). The 3D text component renders through a mesh, not a canvas, so the extra component did nothing but make each object log a warning on load. Cleared 14 across four nameplate prefabs and one scene, and added a reusable editor sweep (SotA &rsaquo; Maintenance &rsaquo; TMP CanvasRenderer) to catch any that turn up later.]]></description>
    </item>
    <item>
      <title>NPC voice-over: Stood up a working NPC voice-over proof of concept in Ardoris. Every NPC there is cast to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-e659b7c05348</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Stood up a working NPC voice-over proof of concept in Ardoris. Every NPC there is cast to a distinct AI-generated (Inworld) voice: 79 main characters get a unique voice that is never reused, while rank-and-file guards, townsfolk, and children draw from small fixed voice pools. Generated all 17,016 spoken-line clips (about 482 MB) from the existing localized dialogue and staged them to the CDN rather than the repo.]]></description>
    </item>
    <item>
      <title>NPC voice-over: Built the client runtime that plays them. For each line an NPC speaks, a new voice…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-83f6df0513bd</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Built the client runtime that plays them. For each line an NPC speaks, a new voice manager picks the right clip from the NPC's voice and the line's text, pulls it from a local cache or the CDN, and plays it from a 3D audio source that fades out with distance. Confirmed in the editor by walking around Ardoris and talking to NPCs; lines that include the player's own name stay silent for now.]]></description>
    </item>
    <item>
      <title>NPC voice-over: Added the generation and publish tooling: a script that walks the conversation corpus…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-5729d7f6a80d</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Added the generation and publish tooling: a script that walks the conversation corpus, normalizes and de-duplicates each line, sends it to the text-to-speech service, and converts the result to OGG, plus a publisher that uploads the clips to the CDN and clears its mutable index files on each release.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Synced the full game project onto the new build machine. A normal clone of our repository…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-e5f01eee5dfe</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Synced the full game project onto the new build machine. A normal clone of our repository stalls because the server struggles to pack a tree this large, so the box does a shallow clone (just the latest revision) and then pulls the roughly 150 GB of large binary assets directly. About 440,000 files now live on the machine; a few thousand stragglers that the asset tooling skipped after a shallow clone were filled in by copying them from the local cache.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Got a build running end to end on it. The Jenkins job checks out the project and launches…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-7a967771245e</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Got a build running end to end on it. The Jenkins job checks out the project and launches the Linux and Windows (Mono) builds, and it now reaches the actual Unity build step, stopping there only because the editor still needs a license activated. That license is the one remaining piece before it produces finished builds.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Licensed it and got it compiling. Activated a free Unity Personal license on the machine…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-fc36784a4b3e</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Licensed it and got it compiling. Activated a free Unity Personal license on the machine without a screen attached, which took some doing since Unity removed the old offline activation method; found the right licensing-client command to assign the seat headlessly. The build now gets past licensing and compiles the whole project.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Cleared the two things that were breaking the player build: removed an editor-only…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-4336d4bed346</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Cleared the two things that were breaking the player build: removed an editor-only development plugin that shouldn't ship in a player build (on the Linux builder only; the Windows build still uses it), and supplied a third-party spline asset the repository doesn't keep under version control. After that the build moves on to importing the full asset library.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Stood up a local asset-import cache on the build machine's scratch drive so clean…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-e6526fc07e41</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Stood up a local asset-import cache on the build machine's scratch drive so clean rebuilds, and other machines, can skip re-importing assets from scratch. It runs entirely on the box with its connection to the vendor's cloud blocked, and the in-progress import now feeds it as it goes.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Installed Claude Code on the build machine and wired it up for use from VS Code over a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-26a327e90f45</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Installed Claude Code on the build machine and wired it up for use from VS Code over a remote SSH connection, so the project can be worked on there with AI assistance.]]></description>
    </item>
    <item>
      <title>Build machine / CI: The build machine now produces finished players. Once the first asset import completed, a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-a81165b6519b</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[The build machine now produces finished players. Once the first asset import completed, a single Jenkins run built both the Linux and Windows (Mono) standalone players end to end and both were confirmed on disk. The first import takes hours, but after that the cached import makes repeat builds fast.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Documented the legacy TeamCity build server end to end so we can retire it. It still…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-330b4254be6d</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Documented the legacy TeamCity build server end to end so we can retire it. It still drives the whole build, deploy, test, reporting, and website-publish pipeline off the old version-control system, and little of it was written down. Captured a complete read-only export of its configuration (7 projects, 167 build jobs, every step and script, the job-to-job dependency chains, the version-control roots, and the build agents) plus a per-project walkthrough.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Wrote a rebuild-and-retirement guide alongside it: each pipeline (server build, client…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-e22d6813f324</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Wrote a rebuild-and-retirement guide alongside it: each pipeline (server build, client and patcher builds, asset baking, deploys, functional tests, database backups, reports and metrics, localization, website publish) mapped to how it would be reproduced on the current build machine, with a power-off checklist and the outside systems that still depend on the box.]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: Taught the /balance combat recorder about pets. A pet's hits used to be dropped because…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-8ff29fd0781a</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Taught the <code>/balance</code> combat recorder about pets. A pet's hits used to be dropped because the recorder only watched the player's own attacks; it now also records the player's pets' damage, and that damage counts toward the player's own DPS and damage totals.]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: Added pet survivability and abilities: the recorder now captures damage taken by a pet…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-7735b6a9cf69</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Added pet survivability and abilities: the recorder now captures damage taken by a pet and pet deaths (including what killed it), plus the abilities a pet casts. Each event is tagged by whether it came from you or your pet, so the two can be split apart or combined. This also makes the previously empty "damage taken" charts work for the player too.]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: The session dashboard now shows pet charts on its own when a recording includes a pet…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-4de96cc464a6</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[The session dashboard now shows pet charts on its own when a recording includes a pet: pet damage over time, your damage vs your pet's share, a breakdown by pet type and creature, pet ability use, and pet damage taken. There's also a button to add them by hand.]]></description>
    </item>
    <item>
      <title>Dev tooling / log triage: Ran the recurring log-triage pass over the test shard and filed the new distinct problems…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-28f70cbcf00e</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Ran the recurring log-triage pass over the test shard and filed the new distinct problems as tickets: a large batch of missing-localization errors on creature and rune abilities, an audio clip trying to attach to a bone the plant prefab lacks, and a short cluster of database-selection timeouts during a restart window. Recurring ones were added as comments on their existing tickets instead of re-filed.]]></description>
    </item>
    <item>
      <title>Dev tooling / log triage: The log-triage tool now records the time window each run covered and can resume from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-8833139853be</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[The log-triage tool now records the time window each run covered and can resume from where the last run stopped, via a new <code>-SinceLast</code> option, so repeated passes tile the timeline instead of overlapping or leaving gaps.]]></description>
    </item>
    <item>
      <title>Dev tooling / log triage: Fixed a bug in that resume path: the saved cursor timestamp was read back in a format the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-46be08c811cd</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Fixed a bug in that resume path: the saved cursor timestamp was read back in a format the log search could not parse, which would have returned zero results with no error. It now round-trips correctly, and a malformed query raises an error instead of reporting an empty window.]]></description>
    </item>
    <item>
      <title>Repo conventions: Pointed the "work directly on" default and the work-blog requirement at the unity-6.5…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-8a3a5032fdf7</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Pointed the "work directly on" default and the work-blog requirement at the <code>unity-6.5</code> branch, where active work lives during the Unity 6 upgrade (they previously named <code>main</code>).]]></description>
    </item>
    <item>
      <title>Repo conventions: Added a Headlines callout to the top of every day on this work blog: 3-7 one-line…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-63b465624c86</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Added a Headlines callout to the top of every day on this work blog: 3-7 one-line highlights of the day's biggest items, above the detailed sections. Backfilled today's NPC voice-over work, which had only been logged as a plan, and made keeping the headlines current a standing rule in the contributor guide.]]></description>
    </item>
    <item>
      <title>Login / server: Fixed the login server turning players away with "the server has reached max player…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-aa7dbac39e57</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Fixed the login server turning players away with "the server has reached max player capacity" when nobody was online. The capacity check was counting stale login records left behind by earlier disconnects, not just active sessions, so the count could sit at the limit with the shard empty. It now counts only live sessions, and a background pass clears leftover records on a timer so they can't accumulate. A prior fix had addressed a different cause of the same message (no game servers registered), which is why this kept happening.]]></description>
    </item>
    <item>
      <title>Login / server: Put the login-queue count on the internal health panel, with a warning as it nears the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-7825ba61b07d</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Put the login-queue count on the internal health panel, with a warning as it nears the limit, so this failure is visible instead of hiding behind an otherwise all-green status.]]></description>
    </item>
    <item>
      <title>Test shard / data: Found the test shard's database had come back from its last bulk data reload with none of…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-98ad652c2331</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Found the test shard's database had come back from its last bulk data reload with none of its application indexes, only the default per-row key on each table. Without them, time-expiring records were never cleaned up on their own (a background safety net had been removing them by hand and logging a warning), and uniqueness rules weren't enforced. Rebuilt every index straight from the server's own definitions.]]></description>
    </item>
    <item>
      <title>Test shard / data: Changed the data-reload runbook so it rebuilds those indexes from the server code after…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-d952a967200b</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Changed the data-reload runbook so it rebuilds those indexes from the server code after every restore, instead of trusting the data dump to carry them across. The next time we copy fresh live data onto the test shard, it comes up fully indexed.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Stopped the water plugin from logging an error every time a scene unloads. It destroyed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-a365a3ff6dfd</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Stopped the water plugin from logging an error every time a scene unloads. It destroyed its render textures during teardown in a way the new engine no longer allows; it now uses the immediate-destroy call outside play mode, matching the plugin's own cleanup code elsewhere.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Removed a leftover render component from the floating chat text inside the nameplate…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-faa2a7df6b57</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Removed a leftover render component from the floating chat text inside the nameplate prefabs. The 3D text it sits on doesn't use that component, so the editor logged a warning for every nameplate on screen.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Removed duplicate right-click "Help" menu entries in the NGUI editor tools that the new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-bb0f06e26e7d</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Removed duplicate right-click "Help" menu entries in the NGUI editor tools that the new engine warns about. The same menu was registered on two methods; the kept entries still open the correct help page.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Reserialized every out-of-date terrain in the project (475 of 518) to the current format…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-e133fd840a2c</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Reserialized every out-of-date terrain in the project (475 of 518) to the current format, clearing the deprecated-save-format warnings game-wide. Terrains are referenced by ID, so no scenes changed; the update stayed isolated to the terrain data files.]]></description>
    </item>
    <item>
      <title>Unity 6 migration: Did the same conversion for the scenes themselves (the terrains are referenced by ID…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-070627cfa341</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Did the same conversion for the scenes themselves (the terrains are referenced by ID; scenes carry the serialization format directly). Converted all 448 scenes to the current format through the live editor and committed them in batches of ten. Older scenes get rewritten in full the first time the upgraded engine saves one, so converting them deliberately up front means a later edit to a scene shows only the real change instead of a whole-file format diff.]]></description>
    </item>
    <item>
      <title>Asset pipeline / Git LFS: Tracked down a batch of baked scene assets (combined meshes and occlusion data, 28 files)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-8f63a6645fa5</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Tracked down a batch of baked scene assets (combined meshes and occlusion data, 28 files) that the editor reported as corrupt. They were stored in large-file storage, but a text rule in the repo's attributes was keeping them out of it on checkout, so the working copy held a small pointer stub instead of the real file. Added targeted rules so they're stored and restored correctly, and pulled the real files down.]]></description>
    </item>
    <item>
      <title>Asset pipeline / Git LFS: Scanned every large-file-tracked asset in the project (about 95,000) for the same…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-907b2e20f1e2</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Scanned every large-file-tracked asset in the project (about 95,000) for the same pointer-stub problem and confirmed none remain. Added a script that re-runs the check on demand and reports, per bad file, whether the attributes route it correctly, and wrote it up in the LFS guide.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the text-localization system end to end in a new docs/systems/localization/…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-6857edf5d0fc</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Documented the text-localization system end to end in a new docs/systems/localization/ suite: the in-game runtime (the language manager's string-table databases, the localized-string types, the older NGUI text layer, and how the active language is chosen and stored per install), the out-of-game translation data plus the roughly 43 scripts that pull English source out of the project, send it for translation, bring it back, and bake it into the client. Seven languages ship today: English plus German, French, Spanish, Italian, Portuguese, and Russian.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote up the web translation tool the team used (a self-hosted Zanata, plus an earlier…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-cef062555dbf</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Wrote up the web translation tool the team used (a self-hosted Zanata, plus an earlier hosted service) and the import/export scripts that move strings to and from it. Flagged the whole pipeline as legacy: the scripts are Python 2 and tied to Perforce, and the translation server is long gone. Added a section on what a modern replacement has to preserve before any new language can be added.]]></description>
    </item>
    <item>
      <title>Documentation: Added a forward plan and a roadmap entry for the longer-term voice work: first fill in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-2ac90530765b</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Added a forward plan and a roadmap entry for the longer-term voice work: first fill in the missing English voice-over beyond the Ardoris prototype, then generate native-language voices for the languages we already translate, then add Mandarin (new text, fonts, and voice). Left the choice of speech engine open.]]></description>
    </item>
    <item>
      <title>Documentation: Measured how much of the game's text is actually translated into each language, read…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-d6baa1ea3f71</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Measured how much of the game's text is actually translated into each language, read straight from the translation database. Of 119,442 English lines, German, Russian, and French are 53–59% done and Spanish, Italian, and Portuguese 27–29%; the gap is almost entirely NPC dialog, since the UI/item/book strings sit near half-translated across all six. Added a small read-only script that prints the per-language and per-scene breakdown so it can be re-checked as translations land, and recorded a dated snapshot in the localization docs.]]></description>
    </item>
    <item>
      <title>Localization: Built the replacement for the retired web translation tool: a pipeline that fills the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-c757420c5dfd</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Built the replacement for the retired web translation tool: a pipeline that fills the missing translations with an LLM. One model translates each missing line, with the same context human translators were given, a second model reviews it for accuracy and fluency, and the existing markup validator gates both. A glossary mined from the translations humans already did keeps terminology consistent (place and character names, the clickable keyword links in dialogue). German is the first target; the tool handles the other languages too.]]></description>
    </item>
    <item>
      <title>Localization: Fixed a Python 3 bug in the localization file writer (it wrote bytes to a text-mode file)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-27-3e556f8d0e49</guid>
      <pubDate>Sat, 27 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Fixed a Python 3 bug in the localization file writer (it wrote bytes to a text-mode file) and confirmed that loading and rewriting a file leaves all 113 German files, about 71,000 records, byte-for-byte identical, so filling gaps can't disturb existing human translations. Machine translations are tagged so they can be filtered, re-reviewed, or rolled back separately. Also ported the step that bakes translations into the client off the old version-control system to plain Git. The actual translation run targets the test shard only.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-26</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-headlines</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Launched the Server Health panel: one live red/green view of the whole stack, with the game server now reporting its own status every 30 seconds.</li>
        <li>Stood up a brand-new Linux build machine from bare metal, RAID0 build volume, headless Jenkins, and the full Unity 6.5 toolchain.</li>
        <li>Built a community-sentiment dashboard tracking how players feel about Shroud of the Avatar and Richard Garriott across Reddit, in-game chat, and the forums.</li>
        <li>Rebuilt the companion app as standalone desktop and browser chat windows that talk only to your running client.</li>
        <li>Hardened the deploy pipeline so a broken shard can no longer pass itself off as a healthy deploy.</li>
        <li>Built tooling to load a sanitized copy of the live game database onto the test shard, stripping every payment and personal record first.</li>
        <li>Audited negative-scaled props across 60+ shipping scenes and built a mesh-rebake fix for them.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Build machine / CI: Set up a new Linux build machine for continuous builds. Striped its two main NVMe drives…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-457f62f9c14b</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Set up a new Linux build machine for continuous builds. Striped its two main NVMe drives into a RAID 0 array as the fast build volume (Jenkins working directory and build artifacts), installed Jenkins headless, and switched the box to boot to a console with no desktop to free up resources.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Before reusing a third NVMe drive as scratch space, found it still held about 700 GB of…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-d423a8cf8ce7</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Before reusing a third NVMe drive as scratch space, found it still held about 700 GB of old files. Copied all of it onto the RAID array and verified the copy file-for-file (every file accounted for) before reformatting the drive.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Installed the Unity 6.5 Linux editor with every build-support module usable on Linux…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-44f4d9f69470</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Installed the Unity 6.5 Linux editor with every build-support module usable on Linux: Linux, dedicated server, and WebGL, plus Windows (Mono) and Android support extracted by hand from their installers since Unity doesn't ship those as Linux packages. Confirmed the editor runs headless and that the RAID, scratch drive, and Jenkins all come back correctly after a reboot.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Wrote a runbook and a reproducible setup script for the box, and recorded the main…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-e496b19ce463</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Wrote a runbook and a reproducible setup script for the box, and recorded the main limitation up front: Unity's Linux editor can't cross-compile the Windows IL2CPP client, so producing that build will still need a Windows build agent.]]></description>
    </item>
    <item>
      <title>Build machine / CI: Finished the Jenkins setup and added a build job for the Linux and Windows (Mono)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-e014c279b22d</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Finished the Jenkins setup and added a build job for the Linux and Windows (Mono) standalone players, wired to the project's headless build entry point. Confirmed the pipeline runs end-to-end on the box; it now waits on getting the project synced to the machine and an editor license in place before a build can finish.]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: Fixed the in-game /balance connection bug: the client was posting to the wrong URL path…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-2fc1bce30516</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Fixed the in-game <code>/balance</code> connection bug: the client was posting to the wrong URL path, so every request to the analytics service came back "not found". Found it in the service's request log, corrected the client path, and switched the service to accept the game's data using the per-recording token it already hands out — so no shared key needs to ship in the client, and each recording is still protected from anyone posting under someone else's code. Lands with the next client build.]]></description>
    </item>
    <item>
      <title>Test shard / logging: Tracked down why the test shard's logs had gone dark for ~2 days: the game server had…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-e45ac29b54c5</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Tracked down why the test shard's logs had gone dark for ~2 days: the game server had stopped forwarding its logs to our central log store. The store itself was healthy; the server's log-forwarding config had been reset to an old, unreachable destination. Repointed it, restarted, and live logs are flowing again.]]></description>
    </item>
    <item>
      <title>Test shard / logging: Fixed the underlying cause: the test-shard server-deploy tool was overwriting that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-7790a8523c02</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Fixed the underlying cause: the test-shard server-deploy tool was overwriting that environment-specific forwarding config with the built-in default on every deploy. It now preserves that config the same way it already preserves the server's login config, so a redeploy no longer kills logging.]]></description>
    </item>
    <item>
      <title>Test shard / data: Added tooling to load a sanitized copy of the live game database onto the test shard for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-8dc2f8d0a1c1</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Added tooling to load a sanitized copy of the live game database onto the test shard for load/system testing. It drops the sensitive collections before anything leaves the build machine (payment, cached-credential, and anti-cheat/hardware-tracking records) and clears in-row personal data after the restore (last login IP, hardware-fingerprint history, and the private notes players leave about each other), keeping the bulk world/item/economy data so the server runs against realistic volumes.]]></description>
    </item>
    <item>
      <title>Test shard / data: Wrote the runbook for it: snapshot the VM for rollback, build the sanitized archive, send…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-f9e2bbfb22f0</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Wrote the runbook for it: snapshot the VM for rollback, build the sanitized archive, send it through the existing test-shard jump host, and drop-and-replace the test database. Documented why this is for load/system testing and not for logging in as live players: the test login server issues different account ids than the live data, so a restored character isn't reachable by its original owner, while the existing test account keeps working.]]></description>
    </item>
    <item>
      <title>Server: Added a server switch (off by default) to silence the team's internal chat notifications…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-ea1e3d27517b</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Added a server switch (off by default) to silence the team's internal chat notifications, so the test shard can run without pinging the team's channels. With the switch off the notification path does nothing, instead of needing per-message edits, and live behavior is unchanged unless it's turned on.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Started a Server Health panel for the dev portal: a live red/green view of the game shard…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-e658e1baf46a</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Started a <b>Server Health</b> panel for the dev portal: a live red/green view of the game shard and our web services, prompted by the dropped server connection and logging outage that both slipped by recently. First piece is the web-infrastructure half. It watches our internal services (source control, wiki, the analytics and AI helpers, the databases, the web server), TLS certificate expiry, disk and memory, and whether the game is reachable from the internet, then rolls it into one status with history. The game-shard half (player counts, server-to-server connections, database and response-time metrics) is next.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Built the game-shard half: a small read-only collector that runs next to the game…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-a18d776e10eb</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Built the game-shard half: a small read-only collector that runs next to the game server's logs and watches error/warning rates, a dropped server-to-server connection detector (the failure that got past us), a "logs went quiet" alarm that fires if the server stops reporting, players online, the host machine's load/memory/disk/storage-pool/bandwidth, and the game VM's CPU and memory. It's exposed to the portal over a locked-down internal channel reachable only from the portal box, so the panel's "Game shard" pane has data. Live numbers from the game server itself come next.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Finished it: the game server now reports its own numbers. Every 30 seconds it sends…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-43d32fce3624</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Finished it: the game server now reports its own numbers. Every 30 seconds it sends whether it's ready for players, its database connection state, and how many of its internal sub-servers are connected, over the existing signed, private server-to-web channel, shown on the panel. Verified live end-to-end: the panel shows the server ready, database connected, and all sub-servers linked. (The server-side piece was hot-swapped in with an automatic rollback if it failed to come back up; it folds into the next full server build.)]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Documented and registered it: wrote up the whole Server Health system (how it's built…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-386fba917b4b</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Documented and registered it: wrote up the whole Server Health system (how it's built, what it watches, how to deploy it), added it to the team's living roadmap, and registered its internal channel in our security baseline so the automated pre-deploy security check confirms it stays locked to the portal box.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Tested it end-to-end — including deliberately taking a service down to confirm the panel…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-d985e6db3cd3</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Tested it end-to-end — including deliberately taking a service down to confirm the panel turns red and then recovers — which caught two false alarms in the dashboard's own checklist (it was looking for the wiki's database under the wrong name). Corrected the checks so the board reads true green when everything is healthy.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Tracked down why the panel read no heartbeat after a server update: the build that landed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-4dd474b982b6</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Tracked down why the panel read no heartbeat after a server update: the build that landed on the test shard predated the 30-second health-push feature added earlier the same day, so it served players fine but never sent the data the panel reads — and restarting can't fix what a build doesn't contain. Rebuilt the server from current source and redeployed; verified the panel heartbeat, the database connection, and a test login all came back.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Hardened the server-deploy tool against two traps that surfaced. It now warns when the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-49df7549097a</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Hardened the server-deploy tool against two traps that surfaced. It now warns when the build being shipped lacks the health-push code, and it preserves the shard's own database-connection config instead of replacing it with the committed default on every deploy — that default points at an address the test shard can't reach, which had knocked out its database connection mid-fix until it was restored. Wrote up the deploy and heartbeat flow, and that the test shard is a self-contained environment, in the docs.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Ran down a report that the client couldn't connect to the test shard, showing "max player…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-6ec6b3f5b1f4</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Ran down a report that the client couldn't connect to the test shard, showing "max player capacity." That message isn't a real player cap: it's what the client shows when the master server has no game sub-servers registered to hand a login off to. The shard's master had been down in two windows earlier that day (during the deploy churn we were already fixing) and had recovered by the time we looked — confirmed it was serving again with a live test login, and confirmed the editor was pointed at the test shard, not a local server.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Made the server deploy refuse to report success until the shard is actually serving…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-b3ddf78e1cf6</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Made the server deploy refuse to report success until the shard is actually serving. After it restarts the server it now polls the shard's own health report until the master is ready with its game, scene, and group sub-servers all registered, and fails the deploy otherwise, instead of stopping at "the process is running" — the gap that let a broken shard pass as a good deploy.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Added an alert-only watchdog on the game host that reads the same health report every…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-655122f56fa4</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Added an alert-only watchdog on the game host that reads the same health report every minute or so and notifies us when the shard stops serving (after a few consecutive misses, so a normal restart doesn't page anyone). It never restarts anything on its own; it just catches an outage that happens between deploys instead of waiting for a player to report it.]]></description>
    </item>
    <item>
      <title>Observability / Server Health: Fixed a client-side trap behind the same symptom: the networking default still pointed at…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-606dca5b54ce</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Fixed a client-side trap behind the same symptom: the networking default still pointed at a local address as a fallback, so a connection path that skipped the locked server host would quietly connect to nothing and look exactly like "no server." Pointed the default at the real shard and noted the requirement so it can't drift back. Wrote a runbook for the whole "max capacity" / shard-down case.]]></description>
    </item>
    <item>
      <title>Deploy tooling: Added a Cancel button to the test-shard deploy window. It actually stops an in-flight…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-799b8e33fa26</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Added a Cancel button to the test-shard deploy window. It actually stops an in-flight upload now — the old stop only closed the launcher and left the transfer running underneath — and offers to remove the half-uploaded build from the patch host afterward, which is safe because a build only goes live at the very end once the upload completes. The cleanup refuses to delete whatever build is currently live.]]></description>
    </item>
    <item>
      <title>Deploy tooling: Reworked the client patch upload to use a native sync tool instead of routing it through…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-32d611a9a1dd</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Reworked the client patch upload to use a native sync tool instead of routing it through the Windows Subsystem for Linux, whose virtual network had been throttling the upload to a crawl. Needs a one-time install of that tool on the build machine before it takes effect.]]></description>
    </item>
    <item>
      <title>Community sentiment dashboard: Built a community-sentiment page on the dev control panel (behind the portal login). It…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-ca7d9d7373d7</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Built a community-sentiment page on the dev control panel (behind the portal login). It pulls the r/shroudoftheavatar and r/ultima subreddits, the live server's in-game chat, and the game's forums, scores each message, and tracks two subjects: how people feel about Shroud of the Avatar, and separately about Richard Garriott. For each subject it charts a smoothed sentiment line per source plus a combined line and a 7-day average, a per-day bar of how much the subject was talked about, and a few highlighted positive and negative comments per source. It runs from an internal machine because the live chat logs are only reachable on the internal network.]]></description>
    </item>
    <item>
      <title>Community sentiment dashboard: Sampled the live chat from only the public channels (global, trade, local, scene, guild…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-6bf25fcba49b</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Sampled the live chat from only the public channels (global, trade, local, scene, guild, emote), leaving private and party messages out. A message counts toward a subject if its venue is inherently about it or its text mentions it, so a general-Ultima post only counts toward Shroud when it actually names it. Backfilled 60 days so the trend lines start with history instead of a single point. Wrote the runbook, and packaged it as a Claude skill that pulls the data and curates the highlighted comments, to run nightly.]]></description>
    </item>
    <item>
      <title>Crown Store authoring tools (internal): Fixed two long-standing bugs in the in-editor tools we use to add Crown Store items. The…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-4bf2981ceb72</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Fixed two long-standing bugs in the in-editor tools we use to add Crown Store items. The "set thumbnail" image picker discarded your choice as soon as you closed it (and on an item with no picture yet it could error or wipe the existing one). It now keeps the picked image, never clears one by accident, and the item form's own thumbnail field is editable again.]]></description>
    </item>
    <item>
      <title>Crown Store authoring tools (internal): Fixed item edits and bulk tag/image "paint" actions not saving reliably: the store's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-f59a6563bf6d</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Fixed item edits and bulk tag/image "paint" actions not saving reliably: the store's lookup data was updated in memory but only written to disk on a full manual project save, so changes could revert and the related data files could fall out of sync with the item. Edits and bulk paints now save immediately, and again when you switch to another item.]]></description>
    </item>
    <item>
      <title>Crown Store authoring tools (internal): Wrote up a short proposal for further Crown Store authoring improvements: easier linking…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-fba3bebef2ad</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Wrote up a short proposal for further Crown Store authoring improvements: easier linking of the pictures we take to the right items, a less finicky item/tag entry form, one-click creation of a new subcategory with bulk move of existing items into it, and clearer in-game messaging when Crown Store purchases are paused until you update your client.]]></description>
    </item>
    <item>
      <title>Engine upgrade / editor console cleanup: Started a triage-and-burndown pass over the Unity Editor's warning/error console as part…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-d234e90371e2</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Started a triage-and-burndown pass over the Unity Editor's warning/error console as part of the engine upgrade, filing the new items as tracked issues and skipping the ones already covered. First fix: an internal Crown Store tool could throw a confusing low-level error when asked to build a store item's display data from an unsaved, in-memory item; it now stops early with a clear message naming the item, and the normal saved-item path is unchanged.]]></description>
    </item>
    <item>
      <title>Engine upgrade / editor console cleanup: Cleared a batch of compile warnings the engine's new serialization checker started…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-7da7331751ab</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Cleared a batch of compile warnings the engine's new serialization checker started raising: two internal UI helper base classes that hold saved data were missing the marker telling the engine to save them, which produced a dozen warnings on every compile. Added the marker (no behavior change) and confirmed the game code still builds cleanly.]]></description>
    </item>
    <item>
      <title>Engine upgrade / editor console cleanup: Repo hygiene: stopped version-controlling a local Unity client tempfile (a per-run…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-120ec903ef9d</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Repo hygiene: stopped version-controlling a local Unity client tempfile (a per-run process/status scratch file) that kept showing up as a spurious repo change — removed it from tracking and added it to the ignore list.]]></description>
    </item>
    <item>
      <title>Engine upgrade / editor console cleanup: Cleaned up a batch of build-time "missing tree" errors traced to non-shipping terrains…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-a408ba712a44</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Cleaned up a batch of build-time "missing tree" errors traced to non-shipping terrains (four old vendor demo scenes, a stray test terrain left at the project root, and two scratch scenes). Their tree placements all pointed at art that no longer exists, so they rendered nothing yet logged an error on every build. Cleared those dead placements (no visual change; it also shrank the files) and left the real content terrains for an art decision.]]></description>
    </item>
    <item>
      <title>Engine upgrade / editor console cleanup: Triaged the editor console and cleared another round of deprecated-API warnings from the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-115587bdb383</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Triaged the editor console and cleared another round of deprecated-API warnings from the engine upgrade, all in third-party/vendored plugins (pathfinding, popup UI, occlusion culling, a screen-resolution helper, and the networking layer). Swapped the handful with direct modern replacements (the 2D physics-body kinematic flag and the display refresh-rate field) and removed now-unneeded member-hiding keywords; no behavior change, and the game still builds clean. Left the larger group of render-pipeline deprecations (projectors, lens flares, the old deferred path) for the render-pipeline migration, since those have no drop-in replacement yet.]]></description>
    </item>
    <item>
      <title>Scene tools / negative-scale props: Added editor tooling for props that designers flipped by typing a negative Scale, which…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-3856ce609d15</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Added editor tooling for props that designers flipped by typing a negative Scale, which the engine upgrade surfaces. An audit lists and categorizes every mirrored object across the shipping scenes, and a bake step removes the negative scale by rebuilding the flipped mesh (reversed faces, recomputed normals) and resetting the transform to positive scale, so the prop looks identical. The generated meshes are shared and de-duplicated, and the risky cases (skinned characters, parented groups, prefab instances) are flagged rather than touched. Compiles clean; the project-wide bake is a later branch step that also needs a lighting re-bake.]]></description>
    </item>
    <item>
      <title>Scene tools / negative-scale props: Measured what negative scale actually costs before writing any fix. On a live test the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-e175f4070375</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Measured what negative scale actually costs before writing any fix. On a live test the engine still reports a correct bounding box for a flipped object and the physics overlap check ignores the flip, so the in-game systems that read bounds are unaffected; the real penalties are exclusion from baked lighting and batching, plus inverted surface normals. That is why the fix bakes the mirror into the mesh rather than patching gameplay code. A repo scan found flipped props in 60+ scenes, including major production maps.]]></description>
    </item>
    <item>
      <title>Scene tools / negative-scale props: Validated the mirror fixer end to end (the rebuilt geometry matches the original) and ran…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-13b30c5b855d</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Validated the mirror fixer end to end (the rebuilt geometry matches the original) and ran it across the shipping scenes, correcting 339 standalone props. Saving an old-format scene in the upgraded engine rewrites the entire scene file, so the result was a format-conversion diff rather than a clean fix, and it was reverted. Scoped the real prerequisite instead: a one-time, project-wide scene/asset format conversion as a planned migration step, gated behind the version-control cutover (the content team still authors in the old format); after that conversion the prop fix re-runs with a change-only diff. The remaining flipped props live inside reusable prefabs or parented groups and need their own passes.]]></description>
    </item>
    <item>
      <title>Security / pre-deploy hardening: Ran our pre-deploy security check across the test shard and the portal sites and fixed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-abf75208d511</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Ran our pre-deploy security check across the test shard and the portal sites and fixed what it flagged. Tightened the shard's public port-forwarding: an internal server-to-server admin/logging port was being forwarded from the internet to the game machine even though only in-house ops tooling ever uses it and our own docs say keep it private. Removed it from the live forward rules and the re-apply script; players are unaffected, since it's not a game-client port. Also taught the security baseline about the extra game-server instances we run for capacity, so the check stops flagging those known-good game ports.]]></description>
    </item>
    <item>
      <title>Security / pre-deploy hardening: Hardened the portal web sites: added the standard browser security-response headers…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-4bdf798d58e0</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Hardened the portal web sites: added the standard browser security-response headers (transport-security, content-type-options, frame-options, referrer-policy, plus a content policy on the static download host) to every portal site, and stopped the web server from advertising its version. Left the richer content policy to the apps that already set their own, and skipped it where a strict one would break an embedded dashboard. The pre-deploy preflight now passes: no sensitive ports exposed, certificates healthy, login/auth gates holding, the public blog leaking nothing, and 0 failures.]]></description>
    </item>
    <item>
      <title>Companion app: Restarted the companion app as a separate chat view that runs alongside the game and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-6e2656f7bb6b</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Restarted the companion app as a separate chat view that runs alongside the game and talks only to the running client, never to the game servers. Built the client-side bridge: a local-only connection the client opens for itself, reachable only from the same machine and gated by a per-run token, that mirrors incoming chat out and sends typed messages back through the game's normal chat path, so channels and slash commands keep working. Added a browser companion page that reads and sends chat, plus a <code>/companion</code> toggle to start it (off by default). Compiles with no errors; not yet runtime-tested.]]></description>
    </item>
    <item>
      <title>Companion app: Wrote up the design and as-built notes (message format, file map, how to run it), added…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-bbf2151d1b6a</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Wrote up the design and as-built notes (message format, file map, how to run it), added the app to the living roadmap, and recorded the next steps: confirming the local connection survives the optimized build, a live read-and-send test, a standalone desktop companion app, and hiding the in-game chat panel while it's popped out.]]></description>
    </item>
    <item>
      <title>Companion app: Built the desktop half: a standalone chat window (on the same UI toolkit as our game…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-de221583e199</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Built the desktop half: a standalone chat window (on the same UI toolkit as our game launcher) that connects to the running client the same local-only way the browser page does, shows chat in the in-game colors, and sends messages back. It can stay on top, remembers its size and position, and closes itself when the game exits. Launched with <code>/companion desktop</code>. Builds with no warnings.]]></description>
    </item>
    <item>
      <title>Companion app: Made /companion desktop find the desktop app when running inside the editor: it now also…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-aa19bbecd051</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Made <code>/companion desktop</code> find the desktop app when running inside the editor: it now also looks for the locally built copy in the repo, so it can be launched and tested in play mode without first pointing it at the file by hand. Verified the lookup resolves in the live editor.]]></description>
    </item>
    <item>
      <title>Companion app: Made the companion mirror the client's chat tabs. The client now sends the list of tabs…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-bf0228e6ceee</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Made the companion mirror the client's chat tabs. The client now sends the list of tabs and each tab's channel filter, and both the browser page and the desktop window show a matching tab bar that splits the stream per tab (any messages that always show, like system notices, appear in every tab). Picking a tab in the companion also switches the in-game send channel, so a reply goes where you'd expect.]]></description>
    </item>
    <item>
      <title>Companion app: Made the companion ship with the game build. The browser page already rode along inside…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-346a5eea7c33</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Made the companion ship with the game build. The browser page already rode along inside the build; added a post-build step that compiles the desktop window and drops it next to the game, so a patched client finds and launches it on its own. Players need nothing extra installed (the desktop window is self-contained); the build machine needs the dev toolchain, and if it's missing the step is skipped with a warning and only the browser page ships.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Fixed the new Oracle window not handling resize: dragging it bigger or smaller left the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-e5c947b21987</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Fixed the new Oracle window not handling resize: dragging it bigger or smaller left the conversation area stuck at its old size and the type-here box floating in place instead of staying at the bottom. The input box was being skipped by the UI's "only reposition things that are visible" optimization while it sat empty, so it never followed the window frame. The transcript and input now scale and stay pinned to the window edges at any size. Lands with the next client build.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Fixed the Oracle window's text box cutting you off at about 16 characters: it was built…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-231e0662c1ef</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Fixed the Oracle window's text box cutting you off at about 16 characters: it was built from the chat-tab rename field, which is capped short on purpose. Raised the limit and made a longer question scroll within the box instead of shrinking the text to fit. Lands with the next client build.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Fixed a leftover from when the Oracle briefly lived in a chat tab before moving to its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-46606a5311b3</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Fixed a leftover from when the Oracle briefly lived in a chat tab before moving to its own window: characters who ran that build had a saved chat tab pointing at a channel that no longer exists, which spammed errors on login and left the chat "send to" label stuck. The client now cleans up that stale tab on load and the tab keeps working as a normal one. Lands with the next client build.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Tightened what the Oracle files as a report. It used to turn almost anything a player…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-da437ec3e2dc</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Tightened what the Oracle files as a report. It used to turn almost anything a player typed into a tracker item, including test strings and off-topic or joke messages, which buried the real ones. Gave it a rubric: file genuine bugs and ideas after one confirmation, but decline gibberish, abuse, and favor or account/billing requests, and explain rather than file when a reported "bug" is actually working as designed. Added a server-side backstop that catches the obviously empty or test reports the model still let through, plus a log of what it declines so we can tune the line; declined messages no longer pollute the list of unanswered questions we use to grow its help articles.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Expanded the Oracle's player knowledge base from three articles to about thirty so it can…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-90f3337746b9</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Expanded the Oracle's player knowledge base from three articles to about thirty so it can answer gameplay questions instead of guessing. Added guides for keys and controls, the interface, combat basics, skills and advancement, and the crafting loop, plus detailed per-school writeups of all nine magic schools and every weapon, armor, and support skill line, with the in-game numbers and how abilities scale. Built it from our existing design docs, left out unreleased skills and anything internal, and verified the whole set parses and leaks no engine internals.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Added an enchantments article to the Oracle's knowledge base, from a player asking about…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-1567aa40318b</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Added an enchantments article to the Oracle's knowledge base, from a player asking about enchantments that the Oracle couldn't fully answer and filed as a tracker item. It covers every enchantment players can apply to gear: the universal attribute boosts that go on any item, and the nine gem schools, each with its attunement, the opposing-element resistance it grants, and its per-ability buffs, plus which enchants only roll on weapons or only on heavy armor. Built from the crafting catalog with the in-game stat names put into plain terms and engine internals left out. Goes live on the next assistant update.]]></description>
    </item>
    <item>
      <title>Test shard / login backend: Tracked down a flood of errors against the test shard's login backend, surfaced by a log…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-6e5df06d66bd</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Tracked down a flood of errors against the test shard's login backend, surfaced by a log triage: two internal endpoints (the server's keepalive heartbeat and the player reward-offer fetch) were returning HTML error fragments instead of JSON, so the game server logged every call as a failed web request. The login site's debug mode was forcing the language runtime to print its harmless deprecation notices into the response body, which broke the JSON parsing. Turned off showing errors in responses (kept the error log), and confirmed both endpoints now return clean JSON.]]></description>
    </item>
    <item>
      <title>Test shard / login backend: Made it stick and documented it: the login-server setup script now sets that flag when it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-906fc6497cd3</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Made it stick and documented it: the login-server setup script now sets that flag when it writes the site config, so a re-provision can't bring the flood back, and corrected the operations doc that had wrongly assumed those notices never reached responses.]]></description>
    </item>
    <item>
      <title>Docs: Wrote a worked walkthrough of the quest system: one real questline traced end to end…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-1cb0b9e80a6c</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Wrote a worked walkthrough of the quest system: one real questline traced end to end through every place its data lives, the NPC conversation scripts, the journal and task entries, the per-stage quest markers, and the player's saved progress flags, with two diagrams (a map of where each piece of quest data lives from authoring through the live server, and a step-by-step chart of the questline). Cross-linked it from the existing quest-system reference and the docs index. Documentation only, no code change.]]></description>
    </item>
    <item>
      <title>Docs: Documented the whole Episode 1 main story (the Path of the Oracle) as a single reference…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-8d08f044e9bb</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Documented the whole Episode 1 main story (the Path of the Oracle) as a single reference: the three-act arc from the Isle of Storms intro and virtue-path choice, through the Love, Truth, and Courage paths, to the Dire Prophecy endgame (gather the prophecy pages and the three lenses, assemble them at the Confluence, receive the Shroud). Traced act by act against the actual quest assets, journal entries, and conversation scripts, with the progress-flag spine, per-stage tables, and flowcharts. Pinned down a few things that are easy to get wrong: all three virtue paths are required to reach the finale, the starting-path choice is set in two steps (and not symmetrically across the three paths), and the per-account virtue values are numeric scores read only at the finale to pick the ending. Documentation only.]]></description>
    </item>
    <item>
      <title>Docs: Surveyed the gameplay features of the big Ultima Online community servers (Outlands…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-26-d2db5e17d726</guid>
      <pubDate>Fri, 26 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Surveyed the gameplay features of the big Ultima Online community servers (Outlands, Forever, Renaissance, Evolution, and others) and mapped them against what our game already has, tagging each feature as have/partial/gap. The takeaway: we already have the UO sandbox core, often in more depth; the real gaps are seasonal live events, recurring weekly play loops, structured/ranked PvP, and new-player retention. Wrote it up as a research doc, added four candidate epics to the roadmap (marked as ideas to evaluate, not committed work), and logged the rest as ideas on the tracker so they aren't lost.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-25</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-headlines</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Shipped a full player combat-analytics tool: <code>/balance</code> streams your fight data to a hosted dashboard you share with a 6-digit code, anonymized, with CSV export.</li>
        <li>Took the analytics service live over HTTPS with an auto-renewing certificate and a Balance card on the dev portal.</li>
        <li>Retired the single-sign-on experiment and put the developer portal back on one clean login.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: Built a combat-analytics tool for players: an in-game /balance command toggles streaming…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-8238ea96536d</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Built a <b>combat-analytics tool</b> for players: an in-game <code>/balance</code> command toggles streaming your combat data to a web app we host and gives you a shareable 6-digit code. Anyone with that code can open an interactive dashboard, build charts for any metric (damage per second, focus used, skills per second, and more), scrub a timeline of every skill use, and download a CSV of any slice they select. Charts are anonymized: your name never shows publicly. You appear only by your code, other players as pseudonyms, and monsters by name.]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: It captures detail per skill use (your level in that skill, the result, focus cost, your…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-6bc32b5fdc47</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[It captures detail per skill use (your level in that skill, the result, focus cost, your current stats, passives, and gear bonuses) plus any skill used near you or aimed at you, so the team gets balancing data while players keep a private, shareable view. Built and browser-tested end to end; the game-side code compiles clean.]]></description>
    </item>
    <item>
      <title>Player tools / combat analytics: Took the analytics service live (HTTPS with an auto-renewing certificate) and added a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-d00664258206</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Took the analytics service live (HTTPS with an auto-renewing certificate) and added a <b>Balance</b> card to the developer portal. Verified the pipeline on the live host: data streaming in, anonymized charts coming out, the admin "see the real names" view locked behind the portal login, and one-click delete of a session. The in-game <code>/balance</code> command rides the next client build.]]></description>
    </item>
    <item>
      <title>Infrastructure / accounts &amp; auth: Reverted the developer portal to a single login and retired the single-sign-on (SSO)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-1532520afbe0</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Reverted the developer portal to a single login and retired the single-sign-on (SSO) experiment: it had ended up making every internal tool demand its own separate login with no central place to manage accounts, the opposite of the goal. One login again covers the portal; the design tool is parked offline until it gets its own login.]]></description>
    </item>
    <item>
      <title>Infrastructure / accounts &amp; auth: Cleaned up the repo afterward: removed the now-dead SSO setup scripts and runbook…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-af5f90c60594</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Cleaned up the repo afterward: removed the now-dead SSO setup scripts and runbook, updated the infra docs and the security-posture baseline to match, and fixed a web-server config clash the rollback surfaced (a duplicate setting that had been blocking config reloads).]]></description>
    </item>
    <item>
      <title>Infrastructure / accounts &amp; auth: Refreshed the login passwords on a couple of internal game test accounts.</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-7e7388d25017</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Refreshed the login passwords on a couple of internal game test accounts.]]></description>
    </item>
    <item>
      <title>Stability &amp; bug fixes (log triage): Fixed a null-reference crash in the skill-advancement UI: toggling an elixir skill's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-abd221eead9e</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Fixed a null-reference crash in the skill-advancement UI: toggling an elixir skill's learn/maintain/unlearn mode could error for a character who had learned only one of the two paired elixir skills, because the code assumed the companion skill was always present. The companion lookup is now guarded, so the toggle is safe either way.]]></description>
    </item>
    <item>
      <title>Stability &amp; bug fixes (log triage): Hardened the game server's calls to our web backend: if the web side returns a non-JSON…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-25-e61cf7b89332</guid>
      <pubDate>Thu, 25 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Hardened the game server's calls to our web backend: if the web side returns a non-JSON error page (e.g. an HTML maintenance/error page) under an otherwise-OK status, the server now treats it as a temporary web failure and backs off, instead of throwing an unhandled error that dropped the player's store-offer/reward lookup. The unexpected response is logged (truncated) so the web-side fault is diagnosable.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-24</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-headlines</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Three multi-year epics crossed the finish line on the same day: the Unity 6 engine upgrade, the Perforce-to-Git migration, and Patcher v2.</li>
        <li>Launched the in-game Oracle, an AI assistant in its own window that answers gameplay questions and files high-context bug reports straight to the tracker.</li>
        <li>Fixed players falling straight through the world, built clients were shipping scenes with no terrain, and closed the entire binary-corruption class behind it.</li>
        <li>Shipped a parallel-download launcher that multiplies patch speed for players far from the server.</li>
        <li>Cut a no-change full client build from ~25 minutes to seconds with a content-signature skip.</li>
        <li>Opened the client-performance campaign the new engine unlocks: object pooling, cached cameras, and off-thread warm-up to kill frame hitches.</li>
        <li>Made every build regenerate the networked-action table from live code, so gameplay actions can never silently fall off again.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Milestones: Epic complete: Unity engine upgrade. The client is fully migrated onto Unity 6, off the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-cb747de2d698</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[<b>Epic complete: Unity engine upgrade.</b> The client is fully migrated onto Unity 6, off the long-retired 2018 line. The multi-year engine jump is done.]]></description>
    </item>
    <item>
      <title>Milestones: Epic complete: source-control migration. The team is fully off the legacy Perforce server…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-85ea5794efe4</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[<b>Epic complete: source-control migration.</b> The team is fully off the legacy Perforce server and onto Git.]]></description>
    </item>
    <item>
      <title>Milestones: Epic complete: Patcher v2. The new rsync-style game patcher and static patch host are…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-e1920044adc2</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[<b>Epic complete: Patcher v2.</b> The new rsync-style game patcher and static patch host are live and delivering updates without manual steps.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Started an in-game Oracle , an AI helper that lives in its own chat tab. Players can ask…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-1e7883d650dd</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Started an in-game <b>Oracle</b>, an AI helper that lives in its own chat tab. Players can ask it gameplay questions and get answers drawn from a curated, growing game-help knowledge base, or report a bug or request a feature in plain language. For reports it asks clarifying questions, checks the team's issue tracker for an existing match first, and files a ticket only when the report is new and the player confirms, with the player's account, character, location, and game build already attached, so the team gets a high-context report instead of "it's broken". The game never holds the AI key: the client talks to a small private server-side helper, and only that helper calls the AI model.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): The Oracle can only read the separate, curated player knowledge base (never any internal…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-d1bdf59ad89c</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[The Oracle can only read the separate, curated player knowledge base (never any internal or operational material), every auto-filed report lands in a triage queue for a human to review before it hits the active board, and there are per-player rate limits and a daily cap on new reports. Client and server are both built and compile-verified; switching it on for the test shard is a follow-up step.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Stood up the Oracle's backend: it now runs behind HTTPS on our server, with the AI key…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-c1069379dc82</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[Stood up the Oracle's backend: it now runs behind HTTPS on our server, with the AI key kept entirely server-side. Verified end-to-end: a gameplay question comes back with a cited answer drawn from the knowledge base, and a two-step bug report (describe it, then confirm) files a single, fully-tagged ticket with the player's account, character, and location attached.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Tightened the report flow after live testing caught it filing a duplicate when the player…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-4225141e10ba</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[Tightened the report flow after live testing caught it filing a duplicate when the player confirmed: it now confirms before filing and files each report at most once per conversation, and we set the AI to use its full context window rather than a clipped one. A follow-up balanced it the other way: it had become too cautious and kept asking for more detail instead of filing, so it now summarizes once and files as soon as the player confirms (partial repro is fine). The remaining step to reach players is publishing the in-game tab to the test shard.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Fixed the Oracle tab not appearing for existing characters: their saved chat-window…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-89434cbc3405</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Fixed the Oracle tab not appearing for existing characters: their saved chat-window layout predated the tab, so it's now auto-added on login. Also added an "Oracle" option to the chat-tab filter checkboxes (so it can be shown in any tab, and so editing an Oracle tab's filters no longer wipes it), and grew the filter popup so the new checkbox no longer overlaps a neighbor.]]></description>
    </item>
    <item>
      <title>In-game Oracle (AI assistant): Rethought the Oracle's front-end after testing: a chat channel is the wrong fit for a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-c57045064b02</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Rethought the Oracle's front-end after testing: a chat <em>channel</em> is the wrong fit for a back-and-forth assistant (typing to it from the wrong tab felt like talking into the void). Moving it to its own dedicated <b>window</b> — a conversation transcript + an input box, opened with /oracle or /ask — which is how the game's other panels work. Reworked the client toward that (the window, plus rewiring the request client to feed the window instead of the chat log) and removed the old chat-channel plumbing; assembled the window itself (transcript + input box, built from the existing Help-window panel) and wired it to open on /oracle — ready to test in-game.]]></description>
    </item>
    <item>
      <title>Process / docs: Work-log convention fix: the blog day is now picked by US Central time (the team's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-555f173d12f2</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Work-log convention fix: the blog day is now picked by US Central time (the team's timezone), not UTC, so a commit made after midnight Central lands under the new day instead of getting tacked onto "yesterday".]]></description>
    </item>
    <item>
      <title>Process / docs: Researched Episode 2 — promised vs. delivered (a pass on what was originally planned…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-ca2cec181443</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Researched <b>Episode 2 — promised vs. delivered</b> (a pass on what was originally planned against what's actually been built) and used it to turn the Episode 2 completion plan from a placeholder into a scoped plan. The Episode 2 continent, its zones, and most of its systems are already built and now run on the new engine, so what's left is mostly finishing the story rather than building the world. Follow-up: tightened the write-up's sourcing with verbatim quotes of the original promises (and corrected which boat goal was which).]]></description>
    </item>
    <item>
      <title>Process / docs: Roadmap: added a Major client performance pass epic, a profiler-driven push on frame…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-94b70d11bb41</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Roadmap: added a <b>Major client performance pass</b> epic, a profiler-driven push on frame rate, hitching/GC stalls, load times, and memory now that the engine upgrade reset the performance baseline. Seeded a stub plan naming the likely cost centers (legacy UI, the manager singletons, the huge world scenes) to scope it next.]]></description>
    </item>
    <item>
      <title>Process / docs: Researched which new Unity engine features are worth adopting now the client is off the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-946df94a44f9</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Researched <b>which new Unity engine features are worth adopting</b> now the client is off the 2018 line and on the current Unity 6 generation: a prioritized list mapped to our actual code: object pooling and async object instantiation to reduce spawn hitches, a modern async type to gradually retire coroutines, the new input system (rebindable controls, controller support), and modern build profiles, each flagged for whether it works on our current render pipeline today. Also captured the engine's upcoming deprecation deadlines that now bound the render-pipeline and scripting-runtime upgrades. Feeds the new client-performance-pass epic.]]></description>
    </item>
    <item>
      <title>Process / docs: Surveyed the whole codebase for oversized source files (over 5,000 lines) and triaged the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-4dfdde96bfb9</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Surveyed the whole codebase for oversized source files (over 5,000 lines) and triaged the results, separating real refactoring targets from third-party libraries, generated code, and mirrored copies that shouldn't be hand-edited. Ranked the dozen "god class" offenders (the player controller, the editor build menu, the conversation engine, the AI brain, and more), wrote a low-risk, behavior-preserving split plan for each as a reference doc, and filed them as tracked tasks so the team can pay the debt down over time.]]></description>
    </item>
    <item>
      <title>Process / docs: Documented an easy-to-miss contributor gotcha: a chunk of the client's "shared" code is…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-8103fe11c7c1</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Documented an easy-to-miss contributor gotcha: a chunk of the client's "shared" code is actually a mirrored copy of the server's source, kept identical by a branching script, so editing one copy without the other gets overwritten on the next sync. Added the rule (edit one, propagate to the other) to the project's contributor guide.]]></description>
    </item>
    <item>
      <title>Process / docs: Assessed "could the game run in a browser?" (WebGL) and wrote it up as a feasibility doc…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-39041e5e07ab</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Assessed <b>"could the game run in a browser?" (WebGL)</b> and wrote it up as a feasibility doc plus a roadmap entry. Not viable today; it's a very large, multi-stage effort. The main wall is content delivery and memory: the game world is hundreds of gigabytes streamed from local disk, which a browser tab (with a ~2 GB memory ceiling) can't download or hold, and that clashes with our already-settled "keep content packaged locally, not over a CDN" decision. Other hard blockers: our networking talks over raw sockets that browsers forbid (they only allow WebSockets), and several built-in features rely on desktop-only native plugins. One thing is in our favor: the build setting browsers require is the one we're on. Parked as a low-priority idea so nobody has to re-investigate it.]]></description>
    </item>
    <item>
      <title>Process / docs: Assessed "could the game run on Android &amp; iOS?" (mobile) and wrote it up as a feasibility…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-5b789cd3324c</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Assessed <b>"could the game run on Android &amp; iOS?" (mobile)</b> and wrote it up as a feasibility doc plus roadmap entry, the phone/tablet sibling to the browser study. A very large, multi-stage effort, gated behind the render-pipeline and networking upgrades. Unlike a browser, a phone is a real native platform, so the things that block the browser version (networking, loading content from disk, native plugins) mostly just work here. The hard parts are different: the whole game is built for mouse-and-keyboard, so it would need a touch-controls and small-screen redesign; the app-store rules take a 30% cut and forbid outside payments, which clashes with our own store and player marketplace; and the game world (hundreds of gigabytes) is far too big for a phone's install size and memory. We flagged two cheaper ways to get value: a <b>companion app</b> for out-of-game stuff (inventory, chat, mail, marketplace), and <b>cloud streaming</b>, running the normal desktop game on a server and streaming it to the phone, which sidesteps the port entirely. A few mobile settings are already in place; the rest is recorded so nobody has to re-derive it.]]></description>
    </item>
    <item>
      <title>Process / docs: Researched how player login/authentication and Steam account-linking work today, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-975645a7d323</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Researched how player <b>login/authentication and Steam account-linking</b> work today, and wrote it up as an architecture reference plus a go-forward decision for the rebooted server structure. Key points: the real account backend is the website itself (the game server delegates each login to it over a signed request); sign-in comes in two forms, a normal account password and a Steam sign-in; and Steam sign-in is fully built but intentionally switched off on the test server (its client isn't delivered through Steam, so there's nothing to validate against), with a step-by-step runbook to turn it on later if we ever re-ship through Steam. Also corrected an earlier note that mislabeled the Steam path as a "stub".]]></description>
    </item>
    <item>
      <title>Tooling: Refreshed the internal multi-model code-review tooling: the AI reviewer models behind our…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-60ba78b41968</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Refreshed the internal multi-model code-review tooling: the AI reviewer models behind our code-review and plan-review helpers were all bumped to their current generations, and one hosted reviewer was consolidated onto a single provider to simplify auth and config.]]></description>
    </item>
    <item>
      <title>Tooling: Added a one-shot helper + a slash-command skill for filing issues on the team's tracker —…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-6143942f6205</guid>
      <pubDate>Wed, 24 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Added a one-shot helper + a slash-command skill for filing issues on the team's tracker — it resolves label names to IDs at run time, reads its token automatically, and sends a Unicode-safe body, so creating a task or bug is a single command instead of hand-built API calls. Used it to file the deferred "purge old binary assets from git history" maintenance task.]]></description>
    </item>
    <item>
      <title>Tooling: New /log-errors skill + script: pulls recent ERROR/WARN entries from our centralized log…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-ed71588c4223</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[New <code>/log-errors</code> skill + script: pulls recent ERROR/WARN entries from our centralized log store over a chosen window (default the last 24 hours) and de-duplicates them into a ranked list of distinct problems with counts and first/last-seen — turning a wall of repeated log lines into a short, actionable triage list, with an optional hand-off to the issue-filing skill.]]></description>
    </item>
    <item>
      <title>Tooling: New Build Progress window for client builds: instead of one opaque progress bar, it lists…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-0464ccf46a2d</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[New <b>Build Progress</b> window for client builds: instead of one opaque progress bar, it lists each major build step, checks it off as the build runs, and shows the time each step took plus a running total, so you can see where a long build is spending its time, and which step failed if one does.]]></description>
    </item>
    <item>
      <title>Tooling: Refactored the build into one ordered list of named steps so the interactive window and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-6b21a8097f84</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Refactored the build into one ordered list of named steps so the interactive window and the automated/headless build run the exact same path (no drift), with the cleanup steps always finishing even if an earlier step fails; the same steps also show in the editor's built-in progress strip.]]></description>
    </item>
    <item>
      <title>Tooling: Build Progress window upgrades: each step now shows the average of its last 5 runs next…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-cd7c6b12c167</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Build Progress window upgrades: each step now shows the average of its last 5 runs next to the current time, the header shows a live ETA-remaining that ticks down as steps finish, and the player-build row expands to reveal the engine's own internal phases with their durations — so you can see exactly where a long build spends its time.]]></description>
    </item>
    <item>
      <title>Tooling: Split the build's giant "post-process" stage into separate, individually-timed steps…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-a07e7a4fcbe4</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Split the build's giant "post-process" stage into separate, individually-timed steps (scene bundles, resource/character bundles, copy), and made a bundle/copy failure fail the build instead of passing silently, so a broken bundle can't ship unnoticed.]]></description>
    </item>
    <item>
      <title>Tooling: Profiled a full client build end-to-end: the post-process alone is ~30 min. Logged the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-c118fb5c30eb</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Profiled a full client build end-to-end: the post-process alone is ~30 min. Logged the per-phase breakdown and a ranked list of speed-ups (verify incremental rebuilds, re-save old-format assets, trim two redundant import post-processors costing ~100s/build, cache the repeated dependency walks) as a tracked task.]]></description>
    </item>
    <item>
      <title>Tooling: Made the ~18-min "resource &amp; character bundles" build step expandable: it now reveals its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-a47b865045a9</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Made the ~18-min "resource &amp; character bundles" build step expandable: it now reveals its internal phases with timings (re-serialize, asset groups, store-metadata, per-folder resources, character/conversation, compile) — surfacing the real time-sinks (store-metadata ~3 min, the Items folder ~3.5 min) right in the build window.]]></description>
    </item>
    <item>
      <title>Tooling: Added a remembered Safe build toggle to the build window: the pre-build sanity checks…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-bfad699f3e14</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Added a remembered <b>Safe build</b> toggle to the build window: the pre-build sanity checks (terrain validation) are heavy and aren't needed every time, so you can now skip them for faster builds when you know assets are clean — on by default, with the skipped check shown clearly in the progress list and a visible "sanity checks off" warning.]]></description>
    </item>
    <item>
      <title>Tooling: Shaved ~100s off every full build by skipping two legacy asset post-processors while a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-deccee0227cf</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Shaved ~100s off every full build by skipping two legacy asset post-processors while a build runs — one redundant nested-prefab cleanup pass (the project has moved to the engine's built-in nested prefabs) and a terrain-texture preprocessor that was needlessly re-scanning on every import. Both already had a "skip during automated builds" switch; we just extended it to cover the in-editor build too.]]></description>
    </item>
    <item>
      <title>Tooling: Diagnosed why a full client build still took ~25 min for the asset bundles even with zero…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-38de7e8e984b</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Diagnosed why a full client build still took ~25 min for the asset bundles even with zero asset changes: the engine was correctly rebuilding nothing, but our pipeline re-ran all the prep plus a full project hash every time anyway. Added a content-signature check that detects when no bundle input has changed and skips the whole bundle rebuild, reusing the existing bundles. A no-asset-change full build drops from ~25 min to seconds; a "force rebuild" toggle is there for safety. (First build seeds the signature; subsequent unchanged builds skip.)]]></description>
    </item>
    <item>
      <title>Tooling: Fixed and hardened the test-shard release tool. A client publish was failing because it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-70e4e0aae6eb</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Fixed and hardened the test-shard release tool. A client publish was failing because it hard-required a sync utility that wasn't installed; rewrote the upload to work without it (archive → copy → expand on the host, same pattern the server deploy already uses), and made it fail fast with a clear message if a transport's tools are missing. Also added a downgrade guard (it now refuses to flip the update channel to an older version — the original footgun), pre-fills the version to "live + 1", and added a deploy-scope switch so you can re-push just the client (or just the server) instead of always doing both.]]></description>
    </item>
    <item>
      <title>Tooling: Made client publishes practical again. The no-sync-utility fallback worked but…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-66b7a428518b</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Made client publishes practical again. The no-sync-utility fallback worked but re-uploaded the entire ~16 GB client tree every time (it bundles all the game assets), which was very slow. Restored proper delta sync by routing through the copy that <em>is</em> installed (in the Linux subsystem), so an unchanged tree now transfers tens of KB instead of 16 GB and only changed files go over the wire. Verified with a dry run. The slow full-push path stays as a clearly-labeled last resort.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Reverted yesterday's enabling of Dynamic Batching for desktop builds: it's deprecated in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-a89431a5e031</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Reverted yesterday's enabling of Dynamic Batching for desktop builds: it's deprecated in the current Unity 6 generation (slated for removal), so relying on it now would just bank migration debt — GPU instancing is the forward path for draw-call batching on our render pipeline. Filed the broader modernization follow-ups (object pooling, async object instantiation, the input-system move, modern build profiles, and more) as tracked tasks.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Started clearing the Unity 6 deprecated-API (obsolete-call) warnings out of the build —…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-2bfd12a12c51</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Started clearing the Unity 6 deprecated-API (obsolete-call) warnings out of the build — swept 29 editor build/tooling scripts so real warnings stop hiding in the noise.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Migrated ~40 object-finding calls (the old FindObjectsOfType / FindObjectOfType ) to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-abeeac71b24d</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Migrated ~40 object-finding calls (the old <code>FindObjectsOfType</code> / <code>FindObjectOfType</code>) to Unity 6's faster sorted/any replacements.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Updated the player-settings calls for scripting-define symbols and application icons to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-c14eaf864e2a</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Updated the player-settings calls for scripting-define symbols and application icons to the new named-build-target API.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Replaced texture-compression formats Unity 6 removed (PVRTC → ASTC), swapped the old…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-20a0117a6553</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Replaced texture-compression formats Unity 6 removed (PVRTC → ASTC), swapped the old shader-property inspection calls and a 2D-physics flag for their current equivalents, and quieted a serialization analyzer warning.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: For the handful of vendored spots with no clean modern equivalent, suppressed the warning…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-5180ec17f645</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[For the handful of vendored spots with no clean modern equivalent, suppressed the warning with an inline explanation rather than making a blind behavioral change.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Confirmed every change compiles and that the old calls are gone; logged the rest on the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-a2b1e3d6ce06</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Confirmed every change compiles and that the old calls are gone; logged the rest on the tracker — a larger batch in runtime code, plus a set tied to the future render-pipeline upgrade that can't be mechanically swapped.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Finished the object-finding migration codebase-wide : swept the remaining ~120 deprecated…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-59f1b4dc754c</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Finished the object-finding migration <b>codebase-wide</b>: swept the remaining ~120 deprecated <code>FindObjectOfType</code>/<code>FindObjectsOfType</code> calls across our own editor tooling and the vendored plugins (pathfinding, UI, AI behaviour graphs, water/fog, terrain tools, and more), so the old object-finding API is now gone from the entire client (86 files).]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: One trap caught while finishing it: the "sorted find" replacement that the migration…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-2ed7137e6101</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[One trap caught while finishing it: the "sorted find" replacement that the migration guides (and our own earlier pass) recommend is <em>itself</em> already deprecated in the current Unity 6 generation, so using it would have re-introduced the very warnings we were clearing. Switched to the current sort-free form everywhere, including normalizing the earlier editor pass, and verified a clean compile with no object-finding warnings left. Wrote the gotcha into our engine-adoption notes so nobody re-adds the deprecated form.]]></description>
    </item>
    <item>
      <title>Unity 6 build hygiene: Added a pre-deploy guard that catches the earlier networked-action (RPC) drift before it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-2b9ff4479e18</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Added a pre-deploy guard that catches the earlier networked-action (RPC) drift before it can ship: it checks that every build still rebuilds the complete action table from the live code and that the saved table hasn't fallen behind — so a missing or renamed action can't slip out in a build again.]]></description>
    </item>
    <item>
      <title>Client performance: Started on the client-performance wins the new engine unlocks: in the combat code, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-ca7d64aa14b3</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Started on the client-performance wins the new engine unlocks: in the combat code, the short-lived helper lists built every time an ability resolves (including its area-of-effect and chain targeting) are now borrowed from a reusable pool instead of being allocated and thrown away on every cast, cutting the memory churn that causes frame hitches during busy fights. Documented the reuse pattern so the team can apply it consistently.]]></description>
    </item>
    <item>
      <title>Client performance: Fixed a wasteful per-frame scan while aiming: the fishing-targeting code was searching…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-8bbeaccad831</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Fixed a wasteful per-frame scan while aiming: the fishing-targeting code was searching the entire scene for special "override" objects (and allocating a fresh array) every single frame the line was aimed — it now scans once per cast and reuses the result, and the aiming loops reuse a cached main-camera reference instead of re-finding it each frame.]]></description>
    </item>
    <item>
      <title>Client performance: Extended that cached-camera win across the client: the engine's built-in "find the main…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-76c2f92d0134</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Extended that cached-camera win across the client: the engine's built-in "find the main camera" call searches the whole scene every time it's used, so we swapped it for a single cached reference in ~16 per-frame hot spots (weapon and spell trails, terrain tree fade, the off-screen target arrow, several spell effects, the dev console, Lua, and player targeting) and lifted the lookup out of tight loops so it runs once instead of once per item. Behavior is unchanged; it just trims repeated per-frame work.]]></description>
    </item>
    <item>
      <title>Client performance: De-hitched spawn warm-up: the shared object pools that recycle frequently-spawned things…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-b7e277be35c4</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[De-hitched spawn warm-up: the shared object pools that recycle frequently-spawned things (combat and weapon effects, floating nameplates, projectiles, instrument audio, and more) now build their initial batch <b>off the main thread</b> using the new engine's async object-instantiation, spread over a few frames, instead of creating them all at once during a scene load — removing a noticeable load/first-spawn stutter. The pool stays usable immediately (it just makes one on demand if something's needed before the batch finishes), and the heavier networked-creature spawns are left for a follow-up. Added a small reusable helper so other bursty spawns can adopt the same trick.]]></description>
    </item>
    <item>
      <title>Client performance: Another low-risk per-frame cleanup across the gameplay code: replaced the old "fetch a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-59288b2c319b</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Another low-risk per-frame cleanup across the gameplay code: replaced the old "fetch a component, then check whether it exists" idiom with the engine's combined check-and-fetch call, which skips a small wasteful memory allocation when the component isn't present. Applied to ~60 spots in combat, effects, decoration placement, the player, NPCs, and UI scripting, including a handful that were fetching the same component twice. Behavior is unchanged. (First-party code done; the same sweep across bundled third-party plugins is next.)]]></description>
    </item>
    <item>
      <title>Client performance: Carried that same check-and-fetch conversion into the bundled third-party plugins that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-0bd150f56acd</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Carried that same check-and-fetch conversion into the bundled third-party plugins that ship in the game — the UI framework (which runs every frame), pathfinding, water, the rope/fracture/mesh tools, and more — another ~90 spots, runtime code only. Left the editor-only tooling alone (it doesn't affect the running game). Both the game and editor code still compile clean.]]></description>
    </item>
    <item>
      <title>Client performance: Swept the every-frame networking/sync code for throwaway memory: three hot update loops…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-280de1374df0</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Swept the every-frame networking/sync code for throwaway memory: three hot update loops (the object-sync lock manager, interactive-object state batching, and view subscriptions) were building short-lived lists on every frame — they now borrow those from the shared pool and hand them back, cutting steady-state memory churn during normal play. Also turned two trap "remove dead entries" passes into in-place cleanups so they stop allocating a fresh list each time. The bigger takeaway, written up for the team: the rest of the client is already careful here (it reuses its lists), so the remaining cleanup targets were far fewer than the original estimate suggested.]]></description>
    </item>
    <item>
      <title>Client performance: Picked up the "pool the inventory/bank/vendor list rows" performance task and found the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-1a5239be576b</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Picked up the "pool the inventory/bank/vendor list rows" performance task and found the main work was <em>already done</em>: the shared list-UI base class only ever builds rows for what's on screen and recycles them as you scroll, so even a 200-item inventory never spawns-and-destroys hundreds of rows on refresh. Redirected the effort to the offender that approach would have missed, the quest journal, which tore down and rebuilt every task/journal/entry row from scratch on each update. It now recycles those rows from a shared pool instead, cutting the memory churn (and the little frame hitch) when the journal refreshes. Compiles clean; needs an in-game check before it's fully trusted.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Deployed the self-hosted Penpot design tool (a Figma alternative) to the developer portal…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-3985384efac3</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Deployed the self-hosted <b>Penpot</b> design tool (a Figma alternative) to the developer portal — live behind the <b>Design</b> tile, with login over single sign-on (no separate Penpot password). Memory footprint landed right around the estimate (~a couple of GB), well within the box's headroom.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Stood up a self-hosted single sign-on service for the portal: one login now covers the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-901fea06f2e0</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Stood up a self-hosted <b>single sign-on</b> service for the portal: one login now covers the portal <em>and</em> Penpot, using our own per-user accounts the admin manages — so teammates who <em>don't</em> have a source-control (Gitea) account can still get in. This replaces the portal's old shared password.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Cut the live portal over to the new SSO and pointed Penpot's login at it, keeping a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-474ad8321618</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Cut the live portal over to the new SSO and pointed Penpot's login at it, keeping a one-command rollback ready. The public work blog and the self-authenticating account tool stay reachable as before.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Verified the whole thing end-to-end in a real browser as a brand-new non-Gitea user: the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-9abeec1244bb</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Verified the whole thing end-to-end in a real browser as a brand-new non-Gitea user: the portal loads after one login, then Penpot opens and auto-creates their workspace with no second prompt. Fixed several wiring issues the test caught along the way (a render service missing a shared key, the login callback path, the token-exchange method, and first-login account provisioning) before calling it done.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Updated the pre-deploy security sweep for the new SSO service + login model (new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-c1ae9d33bf25</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Updated the pre-deploy security sweep for the new SSO service + login model (new certificate, login-only gate, self-registration off) — it passes with zero failures. Onboarding the rest of the team as SSO users is the remaining manual step.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Hardened the SSO so adding a teammate's login hot-reloads instead of restarting the IdP —…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-29c5fb18981f</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Hardened the SSO so adding a teammate's login <em>hot-reloads</em> instead of restarting the IdP — removes a brief blip on the portal during onboarding.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Marked the login-gated portal page as non-cacheable ( no-store ) so browsers can't replay…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-990920e905d3</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Marked the login-gated portal page as non-cacheable (<code>no-store</code>) so browsers can't replay a stale page captured around the cutover; first-time visitors and incognito were always fine, and existing users just need one hard refresh.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Turned on programmatic access to Penpot — a personal access token plus a Penpot…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-21075b8740f2</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Turned on <b>programmatic access to Penpot</b> — a personal access token plus a Penpot automation server (70+ tools: create/modify shapes &amp; text, upload images to a page, manage pages/components) — so design changes can be driven from our tooling, not just by hand in the UI. Verified the token authenticates as a real user end-to-end.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Fixed that automation server failing to start on Windows — it was being launched via a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-31cd6fc1c995</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Fixed that automation server failing to start on Windows — it was being launched via a script shim the OS can't execute directly; pointed it at the real program instead. Confirmed it starts and lists its tools.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Wrote a backup design plan and filed it as a top-priority task: right now we have no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-f30c4d0a912d</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Wrote a <b>backup design plan</b> and filed it as a top-priority task: right now we have <em>no off-box backups</em> of our irreplaceable data (the source-control repo and its large binary store, the wiki, and the test game server), so a single disk loss would be unrecoverable. The plan turns the coming high-capacity build/backup box into an off-box target: fast incremental snapshots every few hours plus nightly whole-server backups, using filesystem-level snapshots for the snapshot-capable server and a deduplicating, encrypted, append-only tool for the other, plus a regular restore drill that actually boots a copy of the backed-up server to prove the backup works.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Burned down the batch of distinct errors/warnings that log triage surfaced from the test…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-ab4d73c24b8a</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Burned down the batch of distinct errors/warnings that log triage surfaced from the test shard — root-caused and fixed each, with the fix verified to compile before commit.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Made log triage build-aware: each logged error is now tagged with the build it came from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-a5ff71eecaca</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Made log triage build-aware: each logged error is now tagged with the build it came from, so we can tell "still broken in a build that already has the fix" from "fix committed but not published yet." Documented the convention so we don't re-chase issues that are simply waiting on the next publish.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Build: the networked-action (RPC) table is now regenerated from the live game code on…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-b281a50ddfa5</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Build: the networked-action (RPC) table is now regenerated from the live game code on <em>every</em> build, instead of relying on a manual editor button. That table had drifted, so a set of gameplay actions (jump, teleport, resurrect, PvP-kill recording, emotes, and more) were being rejected at runtime as "not a recognized" action between builds.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Client: fixed a null-reference crash on level load when a scene's terrain had no terrain…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-411390f862bc</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Client: fixed a null-reference crash on level load when a scene's terrain had no terrain data assigned.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Fixed missing terrain in built clients : players were spawning into some scenes (e.g. the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-456b2eff9e59</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[<b>Fixed missing terrain in built clients</b>: players were spawning into some scenes (e.g. the Solace Bridge starter area) with no ground and falling straight through. Root cause: a source-control setting was line-normalizing certain <em>binary</em> terrain-data files as if they were text, corrupting them just enough that the new engine could no longer load them, so the build dropped the terrain from those scenes and shipped a hole. It looked fine in the editor (which reads the live files), and only broke in a real build. Recovered the affected terrains from the authoritative source and verified they load again.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Closed off the whole class of corruption: the rule that routes binary assets to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-01aa48c09189</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Closed off the whole class of corruption: the rule that routes binary assets to large-file storage only covered files over 1&nbsp;MB, so smaller binary terrains slipped through and got corrupted. We now route <em>all</em> binary data assets there regardless of size, and recovered every affected terrain from source. A sweep separated the actually-corrupted files from three dozen others that merely differ from the old source because they were legitimately upgraded to the new engine (left untouched). Added a build-time check that fails the build if any terrain won't load, instead of shipping an invisible hole, plus a runtime log that names the exact scene and terrain when one is missing, and fixed a bug in the asset-tracking tool that made re-runs error out.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Client (dev console): the add-experience command now validates its arguments instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-bd8066b9476d</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Client (dev console): the add-experience command now validates its arguments instead of throwing when handed a bad value; resolved an "ambiguous match" warning when a console command name has overloads; and corrected a long-standing typo in a warning string.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Client: an asset "slow load" warning now reports the actual measured load time instead of…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-1d7de8b809d3</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Client: an asset "slow load" warning now reports the actual measured load time instead of a misleading rounded figure, so real slow-loaders are easy to spot.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Server: a harmless "state already set" guard no longer spams warnings (it's an expected…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-d09f7995c57e</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Server: a harmless "state already set" guard no longer spams warnings (it's an expected no-op, now logged quietly).]]></description>
    </item>
    <item>
      <title>Stability / log triage: Server: the in-game store price check no longer runs on shards that aren't configured for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-e0e6ae8bdb4c</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Server: the in-game store price check no longer runs on shards that aren't configured for it, so test shards stop logging a recurring connection error every few minutes.]]></description>
    </item>
    <item>
      <title>Stability / log triage: Client (rendering): killed a graphics warning that spammed the player log every frame on…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-7742241cfaa9</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Client (rendering): killed a graphics warning that spammed the player log <em>every frame</em> on the new engine — the depth-of-field blur was requesting a single-channel image in a format the graphics card can't produce, so the engine fell back and complained 60+ times a second, burying real warnings. It now asks for the supported format (also the correct one for that buffer), so the spam is gone and a small wasted per-frame allocation is trimmed.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Added a Show debug panel to the game patcher: tick a box and the window widens to reveal…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-e85c4b8a76f0</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Added a <b>Show debug</b> panel to the game patcher: tick a box and the window widens to reveal a live, copyable trace of the download — per-file timing, the skip/delta/full-download decision, and per-request network detail (status, time-to-first-byte, throughput, key response headers) — so we can finally see what's happening for the handful of players hitting slow downloads with long pauses between files. The trace is also written to a per-session log file they can send us.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Fixed the most likely cause of those between-file pauses: the patcher was re-reading and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-11c462fbdf1c</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Fixed the most likely cause of those between-file pauses: the patcher was re-reading and re-hashing <em>every</em> already-present file on each update. It now trusts a file that's unchanged since we last verified it (size + modified-time + expected hash) and skips the full re-hash, while the <b>Repair</b> button still forces a complete re-verify. Shipped the updated patcher so installed copies self-update on next launch.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Fixed a "patches fine, but Play does nothing" bug: the publisher was telling the launcher…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-f827bcbbbd06</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Fixed a "patches fine, but Play does nothing" bug: the publisher was telling the launcher to start the game by an <b>old executable name the current build no longer produces</b>, so the Play button tried to launch a file that wasn't there and silently failed (running the game directly always worked — only the launcher's Play action was broken). Corrected the publish default to the real executable name.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Added a pre-publish guard so this can't ship again: a build is now refused if its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-04b2e372a426</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Added a pre-publish guard so this can't ship again: a build is now refused if its declared launch target isn't actually one of the packaged files, turning a silent dead Play button into a build-time failure.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: While shipping that fix, caught and fixed a publish-side bug that defeated the delta…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-7f72b4a979e6</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[While shipping that fix, caught and fixed a publish-side bug that defeated the delta upload: the "reuse unchanged files from the previous build" pointer was aimed one folder too deep, so a brand-new build matched <em>nothing</em> and re-uploaded the entire ~18&nbsp;GB client every release (the earlier delta test only looked fast because it re-pushed the <em>same</em> build number). With the pointer corrected, the game data now reuses the prior build and a release moves tens of MB instead of 18&nbsp;GB. Re-published the corrected client so the launcher fix is live.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Tracked the remaining "crazy slow patch" cases to the real bottleneck: the patcher…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-d53b7101fd94</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Tracked the remaining "crazy slow patch" cases to the real bottleneck: the patcher downloaded files <b>one at a time over a single connection</b>, so players far from the server were capped by a single stream's throughput — over a high-latency link one connection simply can't fill a fast pipe (the server was never throttling anyone). It now downloads <b>several files in parallel</b> (default 4), which multiplies throughput on exactly those distant/high-latency connections and overlaps the per-file work between downloads. Added a <b>Download connections</b> setting in the launcher so a player on a slow or far-away connection can dial it up (or down on a weak machine), kept peak memory bounded so large files can't all load at once, and left the progress bar and resume/repair behaviour unchanged — all covered by new automated tests, including a latency simulation that proves parallel beats serial, and documented in the patcher component doc.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Shipped the parallel-download launcher to the test shard. Built a fresh, code-signed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-2d7d1cad3753</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Shipped the parallel-download launcher to the test shard. Built a fresh, code-signed launcher, signed its self-update pointer, and published it to the test shard's update channel, verified live and serving, so installed launchers pull it and swap themselves on next start (no manual reinstall) and the speedup reaches players. Staged to the test shard first to confirm the real-world gain before promoting to the live channel.]]></description>
    </item>
    <item>
      <title>Launcher / patcher: Fixed the new Download connections control: the up/down spinner we'd added wouldn't…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-24-4a1b6c1c44f5</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Fixed the new <b>Download connections</b> control: the up/down spinner we'd added wouldn't respond to clicks, so the parallel-download count couldn't actually be changed. Replaced it with plain <b>−/+ buttons</b> (the same style the rest of the launcher uses) that reliably raise/lower the value between 1 and 16, grey out at the limits, and save the choice for the next update — covered by a new automated test.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-23</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-headlines</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Stood up a complete self-hosted log search-and-dashboards stack on the test box, portal-gated, TLS-fronted, and dressed in the Shroud look.</li>
        <li>Built the Build Chaos command center: one window builds all six client flavors and ships them with a single Release to Chaos click.</li>
        <li>Deployed the self-hosted Penpot design suite to the developer portal.</li>
        <li>Caught an IL2CPP client that crashed on launch while the build reported success, then hardened the build to never lie about a pass again.</li>
        <li>Hunted down the launcher's patch failures, a URL-encoding bug and a block-by-block download storm, and shipped self-updating fixes.</li>
        <li>Built a one-command pre-deploy security preflight that can gate a release.</li>
        <li>Routed binary Unity assets to Git LFS, ending the silent corruption and gigabytes of repo bloat.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Unity MCP: Fixed the Unity MCP plugin failing to connect to Claude Code — the client config pointed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9f0afaf0b3a3</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Fixed the Unity MCP plugin failing to connect to Claude Code — the client config pointed at a dead local port; matched it to the port the editor actually hosts, and removed a stale duplicate config (with a leftover auth header) that was shadowing the shared one.]]></description>
    </item>
    <item>
      <title>Unity MCP: Documented the root cause — the plugin derives its local port from a hash of the Unity…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9e8b1a83de7f</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Documented the root cause — the plugin derives its local port from a hash of the Unity working-directory path, so the value is per-machine — and added a "can't connect" troubleshooting section (find the live port, match the client, restart) to the ops doc.]]></description>
    </item>
    <item>
      <title>Unity client: Started clearing the Unity 6 upgrade's Editor-console errors: read the live console…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-d52f286e3c15</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Started clearing the Unity 6 upgrade's Editor-console errors: read the live console, deduped thousands of repeats down to a dozen root causes, and filed each as a tracked task.]]></description>
    </item>
    <item>
      <title>Unity client: Fixed a Lua scripting bug that threw a NullReferenceException every frame once the boot…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-17a8f19f4690</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Fixed a Lua scripting bug that threw a NullReferenceException every frame once the boot script was unloaded — added a null-guard so the per-frame global-variable sync skips cleanly when no script is loaded.]]></description>
    </item>
    <item>
      <title>Unity client: Fixed Unity 6 dropping the built-in Arial font: pointed the Lua HUD and the Reader…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-640f89701f70</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Fixed Unity 6 dropping the built-in Arial font: pointed the Lua HUD and the Reader text-asset editor at the replacement legacy font so they no longer throw at runtime.]]></description>
    </item>
    <item>
      <title>Unity client: Cleaned up the SpeedTree tree shaders for Unity 6 — confirmed they compile again, fixed…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-2d07eb43cf7b</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Cleaned up the SpeedTree tree shaders for Unity 6 — confirmed they compile again, fixed an uninitialized-variable warning, swapped a missing custom material-dropdown for Unity's built-in one, and normalized the file's line endings.]]></description>
    </item>
    <item>
      <title>Unity client: Pinned the test client to a single backend (the Chaos test server) across all build…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-bcd209369047</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Pinned the test client to a single backend (the Chaos test server) across all build configs, and hard-locked it so a previously-saved server override can no longer redirect the connection — done as clearly-marked, easy-to-revert code blocks.]]></description>
    </item>
    <item>
      <title>Unity client: Disabled (but did not remove) the login-window server picker so testers can't point the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-18fa89657de2</guid>
      <pubDate>Tue, 23 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Disabled (but did not remove) the login-window server picker so testers can't point the client at other environments; the dialog and its handlers stay in place behind the hidden control.]]></description>
    </item>
    <item>
      <title>Unity client: Added a circuit-breaker to the client's log-server connection: when the logging server is…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-30cbf65a17e6</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Added a circuit-breaker to the client's log-server connection: when the logging server is unreachable it now backs off and goes quiet after a few tries instead of spamming the console all session, and reconnects automatically if the server comes back.]]></description>
    </item>
    <item>
      <title>Unity client: Silenced a recurring NGUI font-plugin warning by marking an obsolete 32-bit binary as…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-2f725e1a3863</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Silenced a recurring NGUI font-plugin warning by marking an obsolete 32-bit binary as disabled — the 64-bit build is the one Unity 6 actually loads.]]></description>
    </item>
    <item>
      <title>Unity client: Re-saved a terrain asset that was still in a pre-2019 save format, clearing its…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-18a27831bad8</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Re-saved a terrain asset that was still in a pre-2019 save format, clearing its deprecation warning. Net result: the editor console is now clear of errors, with two low-priority cosmetic warnings triaged for follow-up.]]></description>
    </item>
    <item>
      <title>Unity client: Started clearing the Unity 6 deprecated-API warnings from our own C#: swept ~90 call…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-d5bab6c7fb8c</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Started clearing the Unity 6 deprecated-API <em>warnings</em> from our own C#: swept ~90 call sites across 50 scripts off the old object-lookup calls onto the current replacement API, and fixed two other deprecated calls (a web-request error check and a reflection-probe assignment). Editor recompiles clean.]]></description>
    </item>
    <item>
      <title>Unity client: Continued the warning sweep: finished moving the screen-resolution / refresh-rate code…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-fe9bfffe5e67</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Continued the warning sweep: finished moving the screen-resolution / refresh-rate code onto the current refresh-rate API, and fixed an editor-menu bug where "Create Mount archetype" was filed under the "Consumable" menu path — so it collided with the real Consumable entry, was unreachable, and warned on every editor load.]]></description>
    </item>
    <item>
      <title>Unity client: Imported the TextMesh Pro essential resources the project was missing (settings, default…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-bda303701eb5</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Imported the TextMesh Pro essential resources the project was missing (settings, default fonts/materials, shaders, and examples), clearing the "TMP Essential Resources are missing" startup error.]]></description>
    </item>
    <item>
      <title>Unity client: Committed 8 MicroSplat terrain-layer assets (with their .meta companions) for the Ardoris…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-e175eb5aa863</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Committed 8 MicroSplat terrain-layer assets (with their .meta companions) for the Ardoris scene, tracked as text alongside the rest of the project's terrain layers.]]></description>
    </item>
    <item>
      <title>Logging / infra: Planned and scaffolded a self-hosted log search-and-dashboards stack on the Chaos test…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-7c2dbac60666</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Planned and scaffolded a self-hosted log search-and-dashboards stack on the Chaos test box to replace the old log viewer the box can't reach — a search engine, dashboards, and a lightweight syslog collector, packaged as a one-command, re-runnable installer with retention that auto-expires old logs to bound disk.]]></description>
    </item>
    <item>
      <title>Logging / infra: Repointed the server's log shipping at the new on-box collector and added a dedicated…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-30988531a454</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Repointed the server's log shipping at the new on-box collector and added a dedicated "chaos" deploy profile so the cutover is reproducible — both the destinations and ports are rewritten at deploy time.]]></description>
    </item>
    <item>
      <title>Logging / infra: The test client already sends its logs to this box, so it needed no change: the redirect…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-fa64ede72eda</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[The test client already sends its logs to this box, so it needed no change: the redirect to the new backend is entirely server-side.]]></description>
    </item>
    <item>
      <title>Logging / infra: Published the dashboards behind the developer portal — login-gated and TLS-fronted…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-a8695752b152</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Published the dashboards behind the developer portal — login-gated and TLS-fronted, firewalled so only the portal can reach it — and wrote the ops doc plus host provisioning scripts; the admin secret stays out of the repo.]]></description>
    </item>
    <item>
      <title>Logging / infra: Deployed the stack to the Chaos box and verified it end to end: installed the container…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-6573f93e5a7c</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Deployed the stack to the Chaos box and verified it end to end: installed the container runtime, brought the three services up healthy, and confirmed test log lines flow through the collector into the search store with the right fields broken out. The dashboards are reachable through the portal with a two-step login (portal sign-in, then the log tool's own admin login).]]></description>
    </item>
    <item>
      <title>Logging / infra: Added a Logs card to the developer portal so the log dashboards are one click from the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-8dcede1d94a9</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Added a Logs card to the developer portal so the log dashboards are one click from the portal home.]]></description>
    </item>
    <item>
      <title>Logging / infra: Turned the log dashboards into true one-click access from the portal: a read-only viewer…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-8c6825e9a59f</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Turned the log dashboards into true one-click access from the portal: a read-only viewer account is signed in automatically behind the portal login (no second prompt), the per-user view separation was switched off so everyone sees the same shared dashboards, and the viewer can browse logs but can't modify or delete anything. The full read-write admin account stays available over a private tunnel; no shared secret is committed to the repo.]]></description>
    </item>
    <item>
      <title>Logging / infra: Fixed the logs link still asking for a second sign-in: moved the dashboards from their…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-7c8c88a819aa</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Fixed the logs link still asking for a second sign-in: moved the dashboards from their own subdomain onto a path on the portal itself (same web address), so the single portal login now carries through. The old subdomain link redirects to the new one.]]></description>
    </item>
    <item>
      <title>Logging / infra: Wrote up the full logging runbook for the team — architecture, deploy steps, access…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-265926aab96d</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Wrote up the full logging runbook for the team — architecture, deploy steps, access, retention, and the gotchas we hit along the way — so the setup is reproducible from the docs alone.]]></description>
    </item>
    <item>
      <title>Logging / infra: Gave the log dashboards the Shroud of the Avatar look to match the rest of the site —…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-4a369506906f</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Gave the log dashboards the Shroud of the Avatar look to match the rest of the site — dark charcoal, gold trim, the Shroud wordmark and crest, and a "Chaos Shard — Logs" tab title — reusing the existing web branding. Visuals only; no functional change.]]></description>
    </item>
    <item>
      <title>Logging / infra: Did it with no custom build: dark mode and the tab title come from the dashboards' own…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-6300ddc010d5</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Did it with no custom build: dark mode and the tab title come from the dashboards' own settings, while the gold trim, the Shroud wordmark + crest, and the favicon are served and swapped in at the existing reverse proxy (the dashboards' own server-side logo check can't see past the portal login, so the browser-side swap is the reliable path). Deployed it to the Chaos box and verified the whole look in a browser; runbook updated.]]></description>
    </item>
    <item>
      <title>Logging / infra: Finished initializing the new log box's data model: pulled the field and data-type…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-a60f47f42db6</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Finished initializing the new log box's data model: pulled the field and data-type definitions straight off the old log system and reproduced them, so money, counts, true/false flags and coordinates are stored as real typed values (numbers, booleans) instead of plain text — the foundation everything else builds on.]]></description>
    </item>
    <item>
      <title>Logging / infra: Taught the collector to break each log line's key=value pairs out into their own…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-b28fa974d48a</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Taught the collector to break each log line's <code>key=value</code> pairs out into their own searchable fields (like the old system did): it splits on the first <code>=</code> so values that contain one survive, converts the game's capitalized true/false to real booleans, and tidies item identifiers. Economy, gameplay and item events are now queryable field-by-field, correctly typed.]]></description>
    </item>
    <item>
      <title>Logging / infra: Wired up the third log stream end to end — the item-audit trail (item create/destroy and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-e069dd77089d</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Wired up the third log stream end to end — the item-audit trail (item create/destroy and gold-change events) — into its own typed store, including a small deploy-time fix so those records are delimited the way the collector expects.]]></description>
    </item>
    <item>
      <title>Logging / infra: Rebuilt the core dashboards from the old system and committed them so the installer…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-4c1942ca823d</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Rebuilt the core dashboards from the old system and committed them so the installer recreates them automatically: an Economy board (gold flow, top items and players, vendor sales, scene activity), a Server/Debug board (log levels, errors, concurrency, busiest scenes), and an Item Audit board.]]></description>
    </item>
    <item>
      <title>Logging / infra: Verified the whole pipeline on the box with synthetic events — every field lands with the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9b136b98fe78</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Verified the whole pipeline on the box with synthetic events — every field lands with the right type and all three dashboards populate and chart real numbers — then cleared the test data so real traffic starts clean. Captured the old system's panels and schema in the repo as reference and updated the runbook.]]></description>
    </item>
    <item>
      <title>Logging / infra: Fixed the logs link landing on an "Application Not Found" page — pointed the default…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-8ef3cf62cf82</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Fixed the logs link landing on an "Application Not Found" page — pointed the default route straight at the dashboards list so opening Logs now drops you right on the boards (Economy / Server&nbsp;Health / Item&nbsp;Audit) instead of a generic home page that linked to a view this build doesn't have.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Planned and scaffolded a self-hosted Penpot (open-source UI/UX design &amp; prototyping tool…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-4b482709bfe8</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Planned and scaffolded a self-hosted <b>Penpot</b> (open-source UI/UX design &amp; prototyping tool, a Figma alternative) for the developer portal — one-command, re-runnable installer scripts that stand it up as an isolated container stack with its own database, plus a full ops runbook and a backup job.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Wired it for single sign-on : Penpot signs you in with your existing developer-account…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-aa5d5cf8a0fc</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Wired it for <b>single sign-on</b>: Penpot signs you in with your existing developer-account identity, and the portal itself moves from a shared password to that same account login — so one sign-in reaches the portal and every tool behind it. The portal login change ships with a safe, reversible rollback.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Sized the memory up front (the design tool wants ~a few GB; the box has ample headroom)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-b869af196221</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Sized the memory up front (the design tool wants ~a few GB; the box has ample headroom), updated the security baseline for the new service and login model, and linked the new docs from the index. Box-side rollout is staged pending go-ahead.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Added the Design (Penpot) tile to the developer-portal home so it's one click from the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-1e8297b8dcec</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Added the <b>Design</b> (Penpot) tile to the developer-portal home so it's one click from the landing page; it opens Penpot once the box-side rollout lands.]]></description>
    </item>
    <item>
      <title>Build tooling: Added a new ChaosShard editor menu with a Build Chaos window — one dashboard to build all…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-e7351598b98d</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Added a new ChaosShard editor menu with a Build Chaos window — one dashboard to build all six client flavors (Windows / Mac / Linux, each in dev or release; quick or full build), each with its own Build button and a live status badge: up to date with the latest commit, how many commits behind, when it was last built, and its size.]]></description>
    </item>
    <item>
      <title>Build tooling: Factored the build logic so CI can run the exact same builds unattended later; outputs go…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-c24430fc1fcb</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Factored the build logic so CI can run the exact same builds unattended later; outputs go to a project-relative, gitignored folder. The window also surfaces the server build state and what's currently deployed — the live client channel plus a local deploy record, with an optional live read for those who have access.]]></description>
    </item>
    <item>
      <title>Build tooling: Added an IL2CPP option for the Windows builds alongside Mono — the window now lists both…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-644d5fe5ede3</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Added an IL2CPP option for the Windows builds alongside Mono — the window now lists both backends for Windows, sets the chosen backend just for that build and restores it afterward, and writes IL2CPP output to its own folder so it never overwrites the Mono build.]]></description>
    </item>
    <item>
      <title>Build tooling: Tracked down a hard editor crash during a full build and fixed it: the engine's…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-c214778b9a8d</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Tracked down a hard editor crash during a full build and fixed it: the engine's asset-bundle writer crashes in native code (so it can't be caught) on any terrain whose grass-detail layer lost its texture in the engine upgrade. Added a validator that auto-repairs those terrains right before the bundle step, exposed as a menu item and a command-line entry for one-off sweeps.]]></description>
    </item>
    <item>
      <title>Build tooling: Added a pre-flight log of the scene build order before that single big native bundle…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-e338b5b7269a</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Added a pre-flight log of the scene build order before that single big native bundle call, so if any one asset ever crashes it again, the last line written names the exact scene — which is how the bad terrain was found.]]></description>
    </item>
    <item>
      <title>Build tooling: Audited the full Unity 6 build log (a ~30 MB, 300k-line editor log) by scoring it with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-24f9efa805f9</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Audited the full Unity 6 build log (a ~30&nbsp;MB, 300k-line editor log) by scoring it with deduplicating searches instead of reading it end to end — collapsing thousands of repeated lines into a handful of root causes, all upgrade residue (the build itself still succeeds with zero compile errors).]]></description>
    </item>
    <item>
      <title>Build tooling: Filed each category as a tracked task with the exact file/line, counts, root cause…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-dffa560ce690</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Filed each category as a tracked task with the exact file/line, counts, root cause, proposed fix, and a verification check: a legacy nested-prefab plugin throwing hundreds of build-time errors and dominating import time (Unity 6 does nested prefabs natively now), ~500 terrain/lightmap assets still in the old save format, a handful of terrains that fail to load, ~140 deprecated-API warnings, build-size waste (oversized sky textures + demo art force-shipped via Resources folders), shader warnings, and degenerate flat-quad colliders.]]></description>
    </item>
    <item>
      <title>Build tooling: Reopened the earlier "re-save old terrains" task once the log showed the problem was…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-a09554a92103</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Reopened the earlier "re-save old terrains" task once the log showed the problem was project-wide (~500 files across many scenes), not the single file it was originally scoped to.]]></description>
    </item>
    <item>
      <title>Build tooling: Wrote a build-health ops doc: where the log lives, a reusable "grep scoreboard" to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-1e3471e8af8a</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Wrote a build-health ops doc: where the log lives, a reusable "grep scoreboard" to re-score any build before/after, and the audit findings — each linked to its tracked task.]]></description>
    </item>
    <item>
      <title>Build tooling: Added a one-click Release to Chaos button to the Build Chaos window (with a confirmation…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-c2eb89f89b17</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Added a one-click <em>Release to Chaos</em> button to the Build Chaos window (with a confirmation dialog): it deploys the freshly built server to the test shard, publishes the matching client patch, and runs a login smoke-test, collapsing a multi-step runbook into one reviewed click. Runs in the background with live progress; on success it records what was deployed so the window's "currently deployed" panel updates.]]></description>
    </item>
    <item>
      <title>Build tooling: The work is plain PowerShell under tools/deploy/ (so CI can run it headlessly too): it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-2d6263cfc89a</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[The work is plain PowerShell under <code>tools/deploy/</code> (so CI can run it headlessly too): it reuses the existing security-posture table for connection details — no addresses or secrets in the scripts — reaches the test VM the documented way, and deliberately <strong>preserves</strong> the VM's environment-specific config and signing key so a fresh build can't break test logins. Supports a dry-run that previews every step without touching anything, with distinct exit codes per phase so a failure says exactly what broke. Verified the editor compiles clean and the dry-run/​error paths behave.]]></description>
    </item>
    <item>
      <title>Build tooling: Gave it its own panel plus a dedicated Release console window: it polls what's currently…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-3df7d6fc183b</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Gave it its own panel plus a dedicated <em>Release console</em> window: it polls what's currently live on the test shard (server and client versions) and shows it side-by-side with the freshly built local version, with a one-click "release to make them match" button (same confirmation + live progress). Refactored both entry points to share one gate/confirm/launch path so they behave identically.]]></description>
    </item>
    <item>
      <title>Build tooling: Taught the build window's optional live-server read to reach the test VM the documented…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-8dd7af4c5884</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Taught the build window's optional live-server read to reach the test VM the documented way, auto-filling the connection defaults from the tracked security-posture file, so there's nothing to type and every field stays overridable.]]></description>
    </item>
    <item>
      <title>Build tooling: Added a client flavor picker to the release flow so you can choose which built Windows…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-c4b36d86c6df</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Added a <em>client flavor</em> picker to the release flow so you can choose which built Windows client to push — dev or release, on either scripting backend — all to the same channel. Fixed the release button greying out for locally-built clients: those don't carry a build number (only CI stamps one), so added a patch-version field to set the channel version by hand, with the publish step refusing a zero/blank version.]]></description>
    </item>
    <item>
      <title>Build tooling: Pushed the dev client to the test patch channel and took it live: staged + signed the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-83111b46cd0e</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Pushed the dev client to the test patch channel and took it live: staged + signed the build, streamed all ~1,000 files (~16&nbsp;GB) up to the patch host over SSH (the box was missing the usual sync tool, so used a tar-over-SSH stream instead), flipped the channel pointer, and verified end-to-end: signature valid, every file reachable, and partial-range downloads working (so the patcher can do deltas). Also fixed a wrong channel URL baked into the editor tool that omitted the platform sub-path and was returning not-found.]]></description>
    </item>
    <item>
      <title>Build tooling: Then players' patches all failed at the same spot (~halfway, ~7.5 GB). Tracked it to a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9410fe2d92e7</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Then players' patches all failed at the same spot (~halfway, ~7.5&nbsp;GB). Tracked it to a launcher bug: some asset-bundle filenames legitimately contain <code>#</code> or spaces, and the launcher wasn't URL-encoding download paths; a bare <code>#</code> truncates the URL (everything after it is treated as a fragment), so those files came back not-found. Fixed the patcher to percent-encode each path segment, added a regression test, and proved it by re-downloading the exact failing files through the real patcher code. Shipped a new self-updating launcher build so installed launchers auto-update and then patch cleanly, with no manual reinstall.]]></description>
    </item>
    <item>
      <title>Build tooling: Next, patches crawled for several minutes on the last few files. Cause: for a file that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-ba8a457daa40</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Next, patches crawled for several minutes on the last few files. Cause: for a file that already exists locally but changed almost entirely (e.g. the engine runtime DLL across a version bump), the patcher was fetching it one 16&nbsp;KB block at a time — thousands of tiny requests, latency-bound, minutes per file. Fixed it to fall back to a single streamed download when little can be reused, and to batch contiguous changed blocks into one request. Verified on the real 84&nbsp;MB runtime DLL: ~5,400 requests/minutes → 1 request/~2&nbsp;seconds, exact hash. Added a regression test that fails if the per-block storm ever returns, and shipped another self-updating launcher build.]]></description>
    </item>
    <item>
      <title>Build tooling: Rounded out the launcher from the patch debugging: the "Downloaded" figure now shows how…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-eac52220aeef</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Rounded out the launcher from the patch debugging: the "Downloaded" figure now shows how much of the patch you actually have (transferred + reused), so it reaches 100% at full size instead of stalling at a partial number; added a cross-platform guard (Windows/Mac/Linux) that detects the game already running and offers a one-click "Close game &amp; update" before patching (a running game locks files — the patch fails on Windows / risks a mixed install elsewhere); and the launcher now shows its OWN build number under the game version. Bundled all the patcher fixes into one self-updating launcher build.]]></description>
    </item>
    <item>
      <title>Build tooling: A worse trap: an IL2CPP client build crashed on launch yet the build window reported it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-6e07e77f69ad</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[A worse trap: an IL2CPP client build crashed on launch yet the build window reported it as a success. Two bugs: the build wrapper was ignoring the engine's build result (a leftover "skip errors for now" hack), so a failed native compile got stamped as a clean build; and the real failure was a third-party terrain asset whose legacy UI code can't be compiled ahead-of-time on the new engine. Made the window verify a build truly succeeded (engine result + the player exe + the IL2CPP native lib all present) so a broken build can't pass as a clean one, and ripped out the ignore-errors hack so failures surface. Offending asset removed; IL2CPP now produces a runnable client.]]></description>
    </item>
    <item>
      <title>Repo / Git LFS: Found that binary Unity assets (terrains, lightmaps, navmesh, texture arrays, baked…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-91c246c143e2</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Found that binary Unity assets (terrains, lightmaps, navmesh, texture arrays, baked meshes) were being committed as raw git blobs <em>and</em> line-ending-normalized — which silently corrupts binary data and had bloated the repo by gigabytes, because a catch-all rule treated every <code>.asset</code> as text.]]></description>
    </item>
    <item>
      <title>Repo / Git LFS: Routed just the binary ones to Git LFS (the text/YAML assets stay mergeable) via an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-e4cde9766742</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Routed just the binary ones to Git LFS (the text/YAML assets stay mergeable) via an exact, generated per-file rule set, and converted the existing large binary assets to LFS pointers — forward-only, with no history rewrite, so the version-control bridge stays intact.]]></description>
    </item>
    <item>
      <title>Repo / Git LFS: Added a helper script that regenerates the rule set by content-detecting binary assets…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9c39213aa26a</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Added a helper script that regenerates the rule set by content-detecting binary assets, and documented the policy plus a deferred history-purge runbook (to reclaim the old bloat later, after the version-control migration).]]></description>
    </item>
    <item>
      <title>Security: Built a one-command pre-deploy security check (a reusable /security-preflight skill) for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-1cea3cc1e85f</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Built a one-command pre-deploy security check (a reusable <code>/security-preflight</code> skill) for the Chaos test server and the companion web portals — it verifies the documented security posture still holds before a deploy and exits with a failure code if anything is wrong, so it can gate a deploy. Non-destructive: it only connects, reads, and reports — no fuzzing or brute-force.]]></description>
    </item>
    <item>
      <title>Security: From outside (black-box): confirms only the intended public ports answer and that…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9c5f267a92e7</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[From outside (black-box): confirms only the intended public ports answer and that sensitive internal services refuse from the internet. Plus TLS/certificate health (validity, expiry, name match), security headers, and that the login-gated portals actually require auth with self-registration turned off, and the patch host rejects directory listing and path traversal.]]></description>
    </item>
    <item>
      <title>Security: From on the boxes (over SSH): checks the firewall rules, that internal services bind to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-bcf1e888e750</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[From on the boxes (over SSH): checks the firewall rules, that internal services bind to loopback only, and that the host's port-forwarding exposes only the intended public ports, including into the Windows VM.]]></description>
    </item>
    <item>
      <title>Security: Added a guard that fails the run if an IP, internal hostname, or secret ever slips into…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9ffc252f2b9d</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Added a guard that fails the run if an IP, internal hostname, or secret ever slips into this public devlog — enforcing our own redaction rule automatically.]]></description>
    </item>
    <item>
      <title>Security: Kept it maintainable: a single "expected posture" data file is the source of truth (edit…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-655ddd8263d2</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Kept it maintainable: a single "expected posture" data file is the source of truth (edit it when the infra changes, not the checks), with a full ops doc. Validated live end to end across both boxes and the VM — the run is green, and it already surfaced a couple of forwarded ports worth a human review.]]></description>
    </item>
    <item>
      <title>Planning: Researched modernizing the Unity asset-bundle system (Addressables) — effort, building…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-0809b8408223</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Researched modernizing the Unity asset-bundle system (Addressables) — effort, building, in-game loading, patch deltas, and whether content can run hands-off — and wrote a decision doc. Key finding: the client already has a mature custom asset-bundle system behind a clean facade, and the new delta patcher already ships only the changed bytes of the whole build tree, so a "modern" system is mostly a tooling/maintenance upgrade, not a delivery one.]]></description>
    </item>
    <item>
      <title>Planning: Decision: keep the custom bundles through the Unity 6 upgrade (delivery is already…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-997043cb23aa</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Decision: keep the custom bundles through the Unity 6 upgrade (delivery is already effectively hands-off); adopt Addressables only later, packed locally behind the existing facade, never as remote/CDN content. Filed a deferred backlog epic tracking the decision and pointing at the doc.]]></description>
    </item>
    <item>
      <title>Documentation: Started a living feature roadmap doc that collects the big future epics in one place —…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-9d47e3f319a5</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Started a living <b>feature roadmap</b> doc that collects the big future epics in one place — render-pipeline modernization, asset bundles, finishing Episode 2, a full combat-skill balance pass, and a website rebuild — each with priority/effort/status and a link to its deeper plan; wired it into the docs index and the repo tour.]]></description>
    </item>
    <item>
      <title>Documentation: Scaffolded ready-to-fill planning stubs for the new epics, and added a standing…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-23-949d6f5b29ea</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Scaffolded ready-to-fill planning stubs for the new epics, and added a standing convention (to the project guide) to keep the roadmap current whenever an epic is added, advanced, or completed.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-22</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-headlines</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Gave the launcher a full Shroud makeover with live patch progress, self-update, and a one-file self-installer.</li>
        <li>Proved the new block-delta patcher for real: a ~100-byte edit moved ~17 KB over the wire on a 430 MB asset.</li>
        <li>Backed everything up and opened the dedicated branch for the Unity 6 engine upgrade.</li>
        <li>Wired the Unity editor to Claude Code over MCP so the live editor can be driven directly.</li>
        <li>Drafted the plan to give every NPC a spoken voice with archetype-cast TTS.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Gave the launcher the Shroud of the Avatar look — the gold "Forsaken Virtues" wordmark…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-063b0a83d15e</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Gave the launcher the Shroud of the Avatar look — the gold "Forsaken Virtues" wordmark, the heraldic shield window icon, and a gold-on-charcoal theme — reusing the legacy launcher's own art.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Surfaced rich live progress while patching: current file, network speed, the higher…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-4e22e2c14a47</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Surfaced rich live progress while patching: current file, network speed, the higher "effective" delta speed and bytes saved, total size, and version.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added launcher self-update — a signed pointer, download plus SHA-256 verify, then a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-5ff82504ec20</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Added launcher self-update — a signed pointer, download plus SHA-256 verify, then a running-exe swap that keeps the Patcher.exe alias in sync; a failed self-update is a safe no-op.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Hardened long downloads with retry/backoff so a ~16 GB first install survives transient…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-b1c2607fe3ea</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Hardened long downloads with retry/backoff so a ~16 GB first install survives transient network blips.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Published the first real game build to the patch host and proved a real 430 MB asset…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-adc6a8d231f1</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Published the first real game build to the patch host and proved a real 430 MB asset delta — a ~100-byte change moved only ~17 KB over the wire.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added a single-exe self-installer: ship one signed file; on first run it asks where to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-bbf0b44b04c8</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Added a single-exe self-installer: ship one signed file; on first run it asks where to install, creates the folder, copies itself in (launcher + Patcher.exe alias + config), and launches the installed copy.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Wired Authenticode code-signing and stamped the launcher as Catnip Games (self-signed for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-a22a16d0e331</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Wired Authenticode code-signing and stamped the launcher as Catnip Games (self-signed for now; a real certificate to follow).]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Packaged a self-contained, single-file launcher so players need no separate runtime…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-d423dd2c41c3</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Packaged a self-contained, single-file launcher so players need no separate runtime installed.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Fixed the first-run installer exiting instantly (a single-instance lock race); it now…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-a5f2bcca2a8b</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Fixed the first-run installer exiting instantly (a single-instance lock race); it now defaults to Program Files, elevates to install/self-patch there, and writes a diagnostic log.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Embedded the SotA shield as the launcher's exe and taskbar icon.</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-c53282da859e</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Embedded the SotA shield as the launcher's exe and taskbar icon.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Rebranded the launcher to "Chaos Shard" (window, installer, install folder, shortcuts…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-1ad3f6411540</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Rebranded the launcher to "Chaos Shard" (window, installer, install folder, shortcuts, and file metadata).]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Reworked the installer to elevate just once at install (so it can live in Program Files)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-9627fe4881fc</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Reworked the installer to elevate just once at install (so it can live in Program Files), then run and self-patch with no further prompts.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Made the installer create Start-menu and desktop shortcuts.</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-e99078ca1c81</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Made the installer create Start-menu and desktop shortcuts.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Roughly halved the launcher download (about 100 MB down to ~48 MB) via single-file…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-b6a6d459c92f</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Roughly halved the launcher download (about 100 MB down to ~48 MB) via single-file compression and dropping unused globalization data — no trimming, no behaviour change.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added a one-command release script that ships a launcher self-update end to end: pin the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-c4c4bddf1dd4</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Added a one-command release script that ships a launcher self-update end to end: pin the embedded build, publish and sign the single-file launcher, write the signed channel pointer, then push to the patch host (exe first, signed pointer last) so installed launchers update on next start.]]></description>
    </item>
    <item>
      <title>Unity client: Removed the unused embedded-browser plugin and its orphaned in-game web-map: the feature…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-ce77708a7708</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Removed the unused embedded-browser plugin and its orphaned in-game web-map: the feature was never reachable in play, so the live native map is unaffected and a large pile of bundled native binaries no longer ships.]]></description>
    </item>
    <item>
      <title>Unity client: Tracked down why a couple hundred terrain-config assets kept showing as modified — an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-104003a49b2c</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Tracked down why a couple hundred terrain-config assets kept showing as modified — an editor import step re-saves them whenever the project is reimported — so the spurious churn stops getting swept into unrelated commits.]]></description>
    </item>
    <item>
      <title>Unity client: Backed up everything ahead of the Unity 6 engine upgrade: froze the multi-GB asset import…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-19e060015d90</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Backed up everything ahead of the Unity 6 engine upgrade: froze the multi-GB asset import cache to a side copy, recorded the current project state in version control as a restore point, and opened a dedicated upgrade branch so the shippable line stays intact.]]></description>
    </item>
    <item>
      <title>Unity client: Swept the Unity 6 engine's renamed APIs across ~30 third-party plugin scripts (NGUI…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-83fc4d1e05b2</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Swept the Unity 6 engine's renamed APIs across ~30 third-party plugin scripts (NGUI, NodeCanvas, Gaia, RootMotion, imposters, water/fog, and more) so they compile on the new engine — object-finding, rigidbody velocity, animator update mode, and the instance-ID → entity-ID rename.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Planned fronting the patch host with a CDN so big-download bandwidth scales beyond a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-7c8f385f0b90</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Planned fronting the patch host with a CDN so big-download bandwidth scales beyond a single box; filed it for tracking.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Converted the legacy datacenter configuration spreadsheet into a searchable docs…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-9b7c949a4d17</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Converted the legacy datacenter configuration spreadsheet into a searchable docs reference so the infrastructure inventory is greppable and lands in the wiki; addresses and shared passwords redacted.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Standardized issue filing on the Gitea REST API, with a copy-paste recipe and the current…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-15bccab56d34</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Standardized issue filing on the Gitea REST API, with a copy-paste recipe and the current label IDs documented.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Made the work-blog update a mandatory, commit-triggered step.</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-a18b2e3e4a81</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Made the work-blog update a mandatory, commit-triggered step.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Reworked the wiki publisher to group docs into two shelves — a general team shelf and an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-a3f11fb67787</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Reworked the wiki publisher to group docs into two shelves — a general team shelf and an access-restricted Internal Only shelf — preserving each shelf's permissions and any wiki-authored books on republish; the sync skill now keeps internal/restricted pages out of git by default.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Fixed a list-mode crash in the import-cache version-swap helper (the tool that lets us…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-9fba0d39098d</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Fixed a list-mode crash in the import-cache version-swap helper (the tool that lets us flip between engine versions by renaming caches instead of reimporting for hours); it tripped whenever a live cache folder was present.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Wired the Unity-MCP editor plugin (Ivan Murzak's open-source com.ivanmurzak.unity.mcp )…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-d1791da11e39</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Wired the Unity-MCP editor plugin (Ivan Murzak's open-source <code>com.ivanmurzak.unity.mcp</code>) into the Unity 6 upgrade branch via OpenUPM, so Claude Code can drive the live editor — read the console, run editor commands, inspect scenes — over a local <code>localhost</code> MCP endpoint; install/activate/troubleshoot documented.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Vendored that Unity-MCP plugin and its runtime dependencies straight into the repo…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-b93c1288c06b</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Vendored that Unity-MCP plugin and its runtime dependencies straight into the repo (upgraded from the registry build) so the editor resolves it from disk with no download; refreshed the setup doc and stopped tracking the auto-generated IDE solution file.]]></description>
    </item>
    <item>
      <title>Planning: Drafted a plan to give every NPC spoken dialogue: archetype-cast inworld.ai TTS voices…</title>
      <link>https://catnipgames.net/blog/week-2026-06-22.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-22-80f94ebb251c</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Drafted a plan to give every NPC spoken dialogue: archetype-cast inworld.ai TTS voices, audio pre-generated to a CDN with player-name fragments generated on demand, piloting on one starter town first — including the cross-process cache-key design that keeps the offline generator, game client, and server byte-for-byte in lockstep.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-21</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-headlines</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:25 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Stood up the real login server on a live account backend, replacing the stand-in with genuine bcrypt auth, entitlements, and character slots.</li>
        <li>Replaced the entire legacy patcher stack with a from-scratch rsync-style block-delta patcher, signed manifests and all, live on the patch host.</li>
        <li>Built a login-gated account-admin web app to create, edit, reset, and delete test accounts, fronted through the portal.</li>
        <li>Mapped the ~20-CCU Photon ceiling and deployed the multi-instance scaling fix that breaks past it.</li>
        <li>Embedded the wiki assistant as a site-wide widget that answers with citations.</li>
        <li>Documented the full Store &amp; Commerce suite and the entire Crown Store toolset.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Stood up the live ***** + privapi account backend on a host LAMP stack as the real…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e0c050a80712</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:24 -0500</pubDate>
      <description><![CDATA[Stood up the live ***** + privapi account backend on a host LAMP stack as the real UserService login server, replacing the ***** stand-in.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Wired the Photon game server to the real backend so auth uses real bcrypt passwords plus…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-3942c7dad35d</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:23 -0500</pubDate>
      <description><![CDATA[Wired the Photon game server to the real backend so auth uses real bcrypt passwords plus access-flags, character slots, and heraldry from real entitlements.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Validated on the production bare-metal host: credentialed Master login authenticates…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-01c5511a5907</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:22 -0500</pubDate>
      <description><![CDATA[Validated on the production bare-metal host: credentialed Master login authenticates end-to-end (Result=Ok), wrong passwords are rejected, and the no-cred bot baseline still exits clean.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added setup-login-server.sh to provision the login-server host.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-1dbd00b24941</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:21 -0500</pubDate>
      <description><![CDATA[Added <code>setup-login-server.sh</code> to provision the login-server host.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added fk_strip.py to strip old-MySQL foreign keys the migrations assume.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e22114a0bbfa</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[Added <code>fk_strip.py</code> to strip old-MySQL foreign keys the migrations assume.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added base-tables.sql to reconstruct the auth-path store base tables a clean build misses.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e6790e77b7c7</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[Added <code>base-tables.sql</code> to reconstruct the auth-path store base tables a clean build misses.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added seed-account.sh for creating test accounts and wire-vm.ps1 for a reversible VM…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4f022c03ecb2</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[Added <code>seed-account.sh</code> for creating test accounts and <code>wire-vm.ps1</code> for a reversible VM switch onto the real login server.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added bot-login-test.ps1 plus a tools/login-server README documenting the new scripts.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-13890bf45c7a</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[Added <code>bot-login-test.ps1</code> plus a tools/login-server README documenting the new scripts.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Confirmed the in-VM "Group timeout" was a loopback NAT-hairpin artifact, not a login…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e724be4026d1</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Confirmed the in-VM "Group timeout" was a loopback NAT-hairpin artifact, not a login defect.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Documented that PublicIPAddressReader resolves the advertised Scene/Group/Game address…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-d72c8af3a2ec</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[Documented that PublicIPAddressReader resolves the advertised Scene/Group/Game address once at startup to the public IP (*****), which a loopback client cannot hairpin to.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Verified an off-box BotClient login with seeded creds completes the full Master + Game +…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-ac6bf4b766d9</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[Verified an off-box BotClient login with seeded creds completes the full Master + Game + character flow with a clean exit.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Documented the off-box test, the resolver mechanism, the optional hairpin masquerade, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-10bda3da3bd0</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[Documented the off-box test, the resolver mechanism, the optional hairpin masquerade, and the WaitingOnPreviousGame stuck-session gotcha.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Built a login-gated Flask account-admin web app on the login-server host to list, create…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4067906e5184</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Built a login-gated Flask account-admin web app on the login-server host to list, create, edit-flags, reset-password, grant/revoke game access, and delete test accounts.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Reused the proven account path: wp-cli for bcrypt and the register hook, with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-3fc7d4d83243</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Reused the proven account path: wp-cli for bcrypt and the register hook, with entitlements and flags applied via SQL on *****.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Made account deletion use direct SQL to avoid the inactive XenForo forum-sync plugin…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-0a9deeef8fa4</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Made account deletion use direct SQL to avoid the inactive XenForo forum-sync plugin fatal, since the forum is not deployed.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Deployed the admin app on the login-server host as systemd sota-accounts (waitress…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-445b34461e2a</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Deployed the admin app on the login-server host as systemd <code>sota-accounts</code> (waitress @*****) behind an Apache ***** reverse proxy on :*****.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added login, CSRF protection, and a session-fixation guard, and verified TLS login, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4153bad1028f</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Added login, CSRF protection, and a session-fixation guard, and verified TLS login, the auth gate, and create/edit/delete end-to-end.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Fronted the account-admin tool through the dev portal so it sits behind a single door…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-09bd0d23931b</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Fronted the account-admin tool through the dev portal so it sits behind a single door with a trusted cert.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Taught the Flask app to honor X-Forwarded-Prefix via ProxyFix so it serves correctly…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-f59378020f24</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Taught the Flask app to honor X-Forwarded-Prefix via ProxyFix so it serves correctly under the /accounts sub-path.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Firewalled the admin endpoint :***** to the portal host only so the admin app is no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-a11a8785da3f</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Firewalled the admin endpoint :***** to the portal host only so the admin app is no longer internet-facing.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Configured the portal nginx /accounts/ location to bypass the ***** basic-auth so the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-2cf9df1d2009</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Configured the portal nginx /accounts/ location to bypass the ***** basic-auth so the app's own login is the single gate, and verified login/list/create/delete through the portal URL.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Fixed the real-client login failure that returned an error after a correct password…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-2625b5a3700c</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Fixed the real-client login failure that returned an error after a correct password, traced to a Master InternalServerError over a mismatched accountId.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Identified the root cause: accounts carried a Mongo game-account from the ***** stand-in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-221ce090f9a7</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Identified the root cause: accounts carried a Mongo game-account from the ***** stand-in (gameAccountId = *****) while the real server handed out a different random id, which the Master refuses to change.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Made the admin tool and seed-account.sh stamp every new account with a deterministic…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e385819edb7b</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Made the admin tool and <code>seed-account.sh</code> stamp every new account with a deterministic ***** id at creation so it can't collide with stand-in-era Mongo data.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Documented the symptom, cause, and fix (align ***** or drop the stale Mongo account) in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-c972918bf327</guid>
      <pubDate>Sun, 21 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Documented the symptom, cause, and fix (align ***** or drop the stale Mongo account) in the login-server-mirror troubleshooting section, cross-linked from the account-admin-tool doc.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Replaced the legacy UnityPatcher delivery stack (BitTorrent + xdelta per-version deltas +…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-2bf401861ad0</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Replaced the legacy UnityPatcher delivery stack (BitTorrent + xdelta per-version deltas + recursive-SQL PHP version service) with an rsync-style block-delta patcher.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Designed the new model around version-numbered static build folders plus a small channel…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-d301c94da33c</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Designed the new model around version-numbered static build folders plus a small channel pointer for the "current version".]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Built a client that transfers only the changed bytes of changed files via…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-fb982bc65aab</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Built a client that transfers only the changed bytes of changed files via rolling-checksum block delta, converging to latest from any prior version with no patch chain and no pre-generated deltas.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Created the Patcher.Core .NET 8 library with RollingChecksum and BlockMap for the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-64a656f3c98d</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Created the Patcher.Core .NET 8 library with RollingChecksum and BlockMap for the rolling-checksum block matching.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Implemented ManagedBlockDeltaFileSync as the managed IFileSync that reconstructs files…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-b18c83bff61a</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Implemented ManagedBlockDeltaFileSync as the managed IFileSync that reconstructs files from local blocks plus fetched changed blocks.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added an HTTP range fetcher (IContentFetcher) that pulls only the needed byte ranges of…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-cefe29d15b2f</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Added an HTTP range fetcher (IContentFetcher) that pulls only the needed byte ranges of changed files.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Implemented an Ed25519-signed Manifest plus ChannelPointer, with per-file SHA-256…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-d472fac90761</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Implemented an Ed25519-signed Manifest plus ChannelPointer, with per-file SHA-256 verification.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Built TreeUpdater to skip unchanged files, delete stale files with user-data excludes…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-985801f13163</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Built TreeUpdater to skip unchanged files, delete stale files with user-data excludes, and self-heal via a <code>.repair</code> marker.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added an ExternalZsyncFileSync wrapper as the production zsync option alongside the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-f837dc1d12c9</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Added an ExternalZsyncFileSync wrapper as the production zsync option alongside the managed sync.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added Hashing, Signing, Channel, and Publisher helpers to round out Patcher.Core.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-332972487057</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Added Hashing, Signing, Channel, and Publisher helpers to round out Patcher.Core.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Built the Patcher.Publish CLI with keygen, publish, and update commands.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-b292aaf9561d</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Built the Patcher.Publish CLI with keygen, publish, and update commands.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added 13 tests including an end-to-end "only changed bytes transfer" proof over HTTP…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-7243656ef918</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Added 13 tests including an end-to-end "only changed bytes transfer" proof over HTTP, backed by a TinyHttpServer test harness with range support.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added infra/provision/80-patch-host.sh to provision an nginx static vhost on 443…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-814b0212a17e</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Added <code>infra/provision/80-patch-host.sh</code> to provision an nginx static vhost on 443 (immutable builds, no-cache channels) with Let's Encrypt.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Deployed the patch host live behind its own TLS cert.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-85180a3af99e</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Deployed the patch host live behind its own TLS cert.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added tools/patch-publish.ps1 as the CI publish wrapper that runs publish, rsync push…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4969d1a0fe86</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Added <code>tools/patch-publish.ps1</code> as the CI publish wrapper that runs publish, rsync push, and the channel flip.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Validated end-to-end against the live host: a 1.5 MB file with ~100 changed bytes updated…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-a56fe9bbd4e4</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Validated end-to-end against the live host: a 1.5 MB file with ~100 changed bytes updated by fetching one 16 KB block, with signed-manifest verify and HTTP 206 ranges confirmed.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Wrote docs/components/patcher-v2.md documenting the new engine and added…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-433656b77c9e</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Wrote <code>docs/components/patcher-v2.md</code> documenting the new engine and added <code>docs/migration/patcher-replacement-plan.md</code>.]]></description>
    </item>
    <item>
      <title>Patcher / Launcher: Added a banner to the legacy docs/components/patcher.md and updated the infra README to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-6b6d6e027a73</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Added a banner to the legacy <code>docs/components/patcher.md</code> and updated the infra README to point at the new patch host.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented the ~20 CCU per game-server ceiling as the Photon Bootstrap (free, unlicensed)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-049963e2f078</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Documented the ~20 CCU per game-server ceiling as the Photon Bootstrap (free, unlicensed) limit of 20 concurrent connections per PhotonSocketServer process, shared across all apps in the all-in-one Primary.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Explained that an in-world client holds ~4 connections (Game + Scene + Group + Logging)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-534c908907f0</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Explained that an in-world client holds ~4 connections (Game + Scene + Group + Logging), so one all-in-one instance tops out around 5-6 players.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Wrote docs/operations/scaling-game-servers.md covering the bottleneck and the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-6dd20de9d79c</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Wrote <code>docs/operations/scaling-game-servers.md</code> covering the bottleneck and the multi-instance fix where each per-player app runs in its own process for its own Bootstrap-20 while the Master load-balances Game/Scene/Group.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Captured measured per-type resource costs and the two topologies (in-VM instances vs…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-71b1bc2fafbd</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Captured measured per-type resource costs and the two topologies (in-VM instances vs separate VMs).]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented 100-CCU sizing, noting Logging is an unscalable single endpoint, plus the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-954654e23e12</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Documented 100-CCU sizing, noting Logging is an unscalable single endpoint, plus the 20-CCU split now deployed on the Chaos box and verified live.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Added Server/deploy/apply-20ccu-split.ps1 , an idempotent script that re-applies the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-ce09ceadc954</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Added <code>Server/deploy/apply-20ccu-split.ps1</code>, an idempotent script that re-applies the split.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Made the script trim the Primary to Master/Social/CounterPublisher and stand up dedicated…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-7e728cfe0b61</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Made the script trim the Primary to Master/Social/CounterPublisher and stand up dedicated Game/Scene/Group/Logging instances on standard ports plus a 2nd Game/Scene/Group for headroom to ~20 CCU.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented that a deploy overwrites PhotonServer.config and the extra app dirs, so the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e77b6418c12e</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Documented that a deploy overwrites PhotonServer.config and the extra app dirs, so the script should run as the last deploy step to restore them.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Fixed the /assistant page rendering as a standalone, unstyled "blank white page" by…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e089c09a2825</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Fixed the /assistant page rendering as a standalone, unstyled "blank white page" by rendering it inside BookStack's own layout.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Made page() return a Blade view: assistant-full (full wiki chrome) or, with ?panel=1…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-c13ec165960f</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Made page() return a Blade view: assistant-full (full wiki chrome) or, with ?panel=1, assistant-panel (chrome-less), with the shared chat UI in <code>_assistant-body.blade.php</code>.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Switched colors to BookStack's accent custom-props plus a dark-aware palette so light and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-42f039e159b5</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Switched colors to BookStack's accent custom-props plus a dark-aware palette so light and dark match the wiki automatically.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Registered the urpgtheme:: view namespace in functions.php via View::addNamespace.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-1944c587bd58</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Registered the <code>urpgtheme::</code> view namespace in functions.php via View::addNamespace.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Wrapped the render in try/catch, falling back to the now dark-aware self-contained…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-e6f3d708cf99</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Wrapped the render in try/catch, falling back to the now dark-aware self-contained template so /assistant can never blank or 500 on the live wiki.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added custom-head.html as the version-controlled source for the app-custom-head setting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-7286a6fb1ec4</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Added <code>custom-head.html</code> as the version-controlled source for the app-custom-head setting, with a floating launcher and slide-out panel that embeds /assistant?panel=1 in a same-origin iframe, gated to logged-in users.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Documented the embed/widget design and the new view:clear deploy step in the theme README.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-d3407ef90483</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Documented the embed/widget design and the new <code>view:clear</code> deploy step in the theme README.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Deployed and verified on the wiki: full page plus widget in light and dark, end-to-end…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-63f29271e293</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Deployed and verified on the wiki: full page plus widget in light and dark, end-to-end ask with citations, ESC-close, and no console/CSP errors.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added the login-server-mirror and account-admin-tool pages to the BookStack manifest.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-2b7ea71a4d34</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Added the login-server-mirror and account-admin-tool pages to the BookStack manifest.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Published the store-suite plan record to the BookStack manifest as a page under Migration…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-858b42745640</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Published the store-suite plan record to the BookStack manifest as a page under Migration &gt; Design Plans.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Published the Store &amp; Commerce suite (hub plus the two how-to guides) to the BookStack…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-37598ac2e777</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Published the Store &amp; Commerce suite (hub plus the two how-to guides) to the BookStack manifest under the Game Systems (Client) chapter.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Added an "Accounts" card to the dev-portal landing page (infra/landing/index.html)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4f46edf60d1b</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Added an "Accounts" card to the dev-portal landing page (infra/landing/index.html) linking to /accounts/.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Wired one-click SSO: the portal /accounts/ location inherits the portal ***** basic-auth…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-c1b86e4ab2ec</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Wired one-click SSO: the portal /accounts/ location inherits the portal ***** basic-auth and passes a ***** header.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Made the Flask app trust that header in before_request and auto-sign-in, so clicking the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-adaab4407b46</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Made the Flask app trust that header in before_request and auto-sign-in, so clicking the card lands straight in the manager with no second login.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Kept the app's admin/password login as a fallback for the IP-blocked direct path, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-cfdf45603a99</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Kept the app's admin/password login as a fallback for the IP-blocked direct path, and verified no-creds returns 401 while a portal login shows the account list.]]></description>
    </item>
    <item>
      <title>Documentation: Updated docs/README.md and docs/repo-tour.md to link the new patcher-v2 doc and the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4c699b1f57d2</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Updated docs/README.md and docs/repo-tour.md to link the new patcher-v2 doc and the patcher-replacement-plan.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote the login-server-mirror runbook and linked it from docs/README.md and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-fc87f8cd7be8</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Wrote the login-server-mirror runbook and linked it from docs/README.md and docs/repo-tour.md.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote the account-admin-tool doc and linked it from the docs index, with the admin login…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-264caef92207</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Wrote the account-admin-tool doc and linked it from the docs index, with the admin login and URL kept in .secrets and uncommitted.]]></description>
    </item>
    <item>
      <title>Documentation: Updated the account-admin-tool runbook with the portal nginx block and the :*****…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4fc3ff4cbf84</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Updated the account-admin-tool runbook with the portal nginx block and the :***** lockdown.]]></description>
    </item>
    <item>
      <title>Documentation: Rewrote the in-game-store how-to around the real Unity editor tooling under SotA &gt; Crown…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-b45f1b305312</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Rewrote the in-game-store how-to around the real Unity editor tooling under SotA &gt; Crown Store instead of a bare menu-item list.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the Crown Store toolset map (create menu, Shelf Item Maker, custom inspector…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-91d3405b6cd4</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Documented the Crown Store toolset map (create menu, Shelf Item Maker, custom inspector, Store Manager, Tag/Image brushes, Tag inspector, bake/export menus).]]></description>
    </item>
    <item>
      <title>Documentation: Described the fast path (Shelf Item Maker drag-and-drop batches) versus the precise path.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-667b656d634e</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Described the fast path (Shelf Item Maker drag-and-drop batches) versus the precise path.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the StoreShelfItem 3-tab custom inspector (Edit / Web Data / Default) field by…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-82c0a6d40d24</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Documented the StoreShelfItem 3-tab custom inspector (Edit / Web Data / Default) field by field, including the live Categories/Item-Sets panels and the IsPremium / CanApplyToShelfItems warnings.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the Store Manager's 7 tabs (Item Explorer, Categories, Availability, Sale…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-2be163caa975</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Documented the Store Manager's 7 tabs (Item Explorer, Categories, Availability, Sale Rules, Vault Rules, Logging, Charity Ids) and the tag-expression mini-language.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the Tag Brush and Image Brush bulk painters.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-b4dff9ed6fe9</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Documented the Tag Brush and Image Brush bulk painters.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the publish pipeline (Update Metadata bake → Server StoreShelfItems db export…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4a727f6ad059</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Documented the publish pipeline (Update Metadata bake → Server StoreShelfItems db export → deploy) with a start-to-finish walkthrough and menu reference.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: drafting docs/migration/photon-replacement-plan.md , a new migration plan…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-a996eab85ca9</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[In progress: drafting <code>docs/migration/photon-replacement-plan.md</code>, a new migration plan for replacing the Photon server.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: adding tools/bookstack/deploy-wiki-index.ps1 , a new script to deploy the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-4f3d856c13d1</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[In progress: adding <code>tools/bookstack/deploy-wiki-index.ps1</code>, a new script to deploy the wiki index.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: refining the docs/wiki sync tooling.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-bce0b142c1a7</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[In progress: refining the docs/wiki sync tooling.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: updating docs/README.md, docs/repo-tour.md, docs/wiki-publishing.md, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-5b09ddcdcda2</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[In progress: updating docs/README.md, docs/repo-tour.md, docs/wiki-publishing.md, and docs/operations/issue-tracking.md.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: revising docs/systems/photon-api-surface.md (Photon API surface notes).</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-6c8e2d0f11a2</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[In progress: revising <code>docs/systems/photon-api-surface.md</code> (Photon API surface notes).]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: further edits to the BookStack theme README and assistant.php .</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-243d4e43b15e</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[In progress: further edits to the BookStack theme README and <code>assistant.php</code>.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: In progress: updating .gitignore and adding the tabula-rasa-fixed.png asset.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-21-0ac404236f9b</guid>
      <pubDate>Sun, 21 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[In progress: updating .gitignore and adding the <code>tabula-rasa-fixed.png</code> asset.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-20</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-headlines</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:31 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Got a 100% local Photon server fully playable: a Unity client connects, authenticates offline, creates a character, and spawns into the world.</li>
        <li>Squashed the top live client crash in chat input.</li>
        <li>Ran a codebase-wide documentation accuracy audit, 198 corrections across 131 files and 1,797 checked claims.</li>
        <li>Wrote an exhaustive housing and decorations suite, design, data model, code, and generated catalogs down to ~14k world lots.</li>
        <li>Built the offline UserService stand-in and the run-local-server tooling behind the local-server milestone.</li>
        <li>Shipped the Store &amp; Commerce docs suite and a repeatable bot-test harness.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added a dev-only offline UserService stand-in (tools/local-userservice.ps1): a raw…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-9de0ec287892</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:30 -0500</pubDate>
      <description><![CDATA[Added a dev-only offline UserService stand-in (tools/local-userservice.ps1): a raw loopback TcpListener that answers the auth endpoint with an ErrorCode.Ok success response so a local server can authenticate without reaching the live website UserService.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Made the stand-in derive a stable 24-hex gameAccountId *****, so each name maps to a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-00a04f432a55</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:29 -0500</pubDate>
      <description><![CDATA[Made the stand-in derive a stable 24-hex gameAccountId *****, so each name maps to a persistent Mongo account across runs.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Had the stand-in return access flags "Player, Dev" so CheckUserAccess is always-ok for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-7be438718591</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:28 -0500</pubDate>
      <description><![CDATA[Had the stand-in return access flags "Player, Dev" so CheckUserAccess is always-ok for local logins.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Reverse-engineered the auth contract from Server's UserService.cs to build the stand-in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-8fd21cdeae51</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:27 -0500</pubDate>
      <description><![CDATA[Reverse-engineered the auth contract from Server's UserService.cs to build the stand-in response.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Added -LocalAuth (+ -LocalAuthPort) to run-local-server.ps1 to repoint…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-03dddd746ba5</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:26 -0500</pubDate>
      <description><![CDATA[Added -LocalAuth (+ -LocalAuthPort) to run-local-server.ps1 to repoint UserServiceURIFormat at the stand-in, re-applied each run since deploy.bat restores the apidev URL.]]></description>
    </item>
    <item>
      <title>Login server &amp; accounts: Verified end-to-end: BotClient login makes the Master log AuthResponse ResultCode=Ok and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-9efd365d455f</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:25 -0500</pubDate>
      <description><![CDATA[Verified end-to-end: BotClient login makes the Master log AuthResponse ResultCode=Ok and persist a non-bot User (access=Player|Dev) keyed on the deterministic gameAccountId.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Added a verified end-to-end "running a local server" runbook for standing up the Photon…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-53bad1711a81</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:24 -0500</pubDate>
      <description><![CDATA[Added a verified end-to-end "running a local server" runbook for standing up the Photon backend on one box (assemble deploy layout, single-node MongoDB rs0, start the Default instance, prove it with an offline BotClient login).]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented that Photon runs on the free Bootstrap license (20 CCU) on localhost, so no…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-e709735ed982</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:23 -0500</pubDate>
      <description><![CDATA[Documented that Photon runs on the free Bootstrap license (20 CCU) on localhost, so no license file is needed.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented that a missing CounterPublisher app is FATAL (host aborts), not harmless, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-2543ff46968d</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:22 -0500</pubDate>
      <description><![CDATA[Documented that a missing CounterPublisher app is FATAL (host aborts), not harmless, and must be provisioned from the Photon SDK tree.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented that the Master needs bin/ServerAdmin/CharNameBlacklist.config at a hardcoded…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-b9fa8d534509</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:21 -0500</pubDate>
      <description><![CDATA[Documented that the Master needs bin/ServerAdmin/CharNameBlacklist.config at a hardcoded path.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented that game-data reports (RollingServerReport.xml, StartingSkills/Decks/Hotbar)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-77d11c8181e0</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:20 -0500</pubDate>
      <description><![CDATA[Documented that game-data reports (RollingServerReport.xml, StartingSkills/Decks/Hotbar) are absent from this mirror, so the server boots and authenticates but character creation fails with InternalServerError, plus how to source them from Perforce.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented using MongoDB ***** to match the vendored ***** .NET driver.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-f0b0682be6e3</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:19 -0500</pubDate>
      <description><![CDATA[Documented using MongoDB ***** to match the vendored ***** .NET driver.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Assessed platform support: Photon Server (native Windows host) plus .NET Framework *****…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-723211f2c265</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:18 -0500</pubDate>
      <description><![CDATA[Assessed platform support: Photon Server (native Windows host) plus .NET Framework ***** make the server Windows-only; only the MongoDB tier can be Linux.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Added tools/run-local-server.ps1 to assemble the layout, provision CounterPublisher +…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-209ed36fcc3e</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:17 -0500</pubDate>
      <description><![CDATA[Added tools/run-local-server.ps1 to assemble the layout, provision CounterPublisher + ServerAdmin, deploy a localhost Mongo.config, and start the instance, plus a committed Mongo.local.config template.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Added a 'Primary' Photon instance to run-local-server.ps1 (deploy layout plus the Logging…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-43207f48bc38</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:16 -0500</pubDate>
      <description><![CDATA[Added a 'Primary' Photon instance to run-local-server.ps1 (deploy layout plus the Logging app on UDP *****) for connecting a Unity client; 'Default' stays for the BotClient.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Verified live that the Primary instance binds UDP ***** + TCP ***** and the Logging app…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-40e0826ebeff</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:15 -0500</pubDate>
      <description><![CDATA[Verified live that the Primary instance binds UDP ***** + TCP ***** and the Logging app starts serving DefaultServerMessages.json, the connection the client login gate needs.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Made run-local-server.ps1 -LocalAuth also blank LoginRewardDescription and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-0b4cb1f5d066</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:14 -0500</pubDate>
      <description><![CDATA[Made run-local-server.ps1 -LocalAuth also blank LoginRewardDescription and SubscriberRewardDescription in the runtime config, so the monthly login/subscriber reward grant no longer crashes first login (ArgumentNullException in OnAuthenticateComplete).]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented the verified game-data procedure: build Server/Tools/ReportCombiner and run it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-bf753f419b5f</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:13 -0500</pubDate>
      <description><![CDATA[Documented the verified game-data procedure: build Server/Tools/ReportCombiner and run it over the Perforce workspace ServerReports to produce the ~119 MB RollingServerReport.xml into the deploy bin.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Verified that with reports generated, rewards disabled, and the auth stand-in, a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-7ce04357e860</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:12 -0500</pubDate>
      <description><![CDATA[Verified that with reports generated, rewards disabled, and the auth stand-in, a credential login completes end-to-end to the character-select stage (Master logs LoginSuccess then HandleAddAuthenticatedPeer, Access=Player|Dev).]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Reconciled the local-server runbook to the full working flow: a Unity client connects…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-775bccc63102</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:11 -0500</pubDate>
      <description><![CDATA[Reconciled the local-server runbook to the full working flow: a Unity client connects, authenticates offline, creates a character, and spawns into the world on a 100%-local server.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Rewrote the runbook status banner + TL;DR around two paths (BotClient smoke test vs. full…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-849fa4885c70</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[Rewrote the runbook status banner + TL;DR around two paths (BotClient smoke test vs. full Unity offline login) and the verified Unity-into-world result.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Updated the runbook architecture diagram to show the Primary instance, the Logging app…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-5757149c94a0</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Updated the runbook architecture diagram to show the Primary instance, the Logging app (UDP *****), and the auth stand-in.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Corrected the runbook's game-data note: the starting loadout comes from StartingContextDb…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-1df996a5219b</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Corrected the runbook's game-data note: the starting loadout comes from StartingContextDb in RollingServerReport.xml, so a separate StartingSkills/Decks/Hotbar file is NOT required; character creation verified working.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Added a single "Connect a Unity client end-to-end (offline)" recipe tying together…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-862d8ba1b5c4</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Added a single "Connect a Unity client end-to-end (offline)" recipe tying together game-data, the stand-in, the Primary instance, -LocalAuth, and the Localhost button.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Added troubleshooting rows for WebServerError, the reward-payout crash, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-5bbe307f6334</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Added troubleshooting rows for WebServerError, the reward-payout crash, and NoLoggingConnection.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Fixed the top client-side crash in chat input, the most frequent exception in the live…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-accc7d0d0d78</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Fixed the top client-side crash in chat input, the most frequent exception in the live logs, by hardening how the chat field tracks item links so drifted state degrades to plain text instead of crashing.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Hardened a chat slash-command handler that could crash on a length mismatch.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-455ffca57418</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Hardened a chat slash-command handler that could crash on a length mismatch.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Made the GM-client "Localhost" server option fully work: it previously only set the game…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-7426d3493885</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Made the GM-client "Localhost" server option fully work: it previously only set the game host (NetworkHost) and hard-blocked at login on NoLoggingConnection because the logging host was never set.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Added a loopback-address constant in LoginManager (GMCLIENT) so the Localhost button uses…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-bad7242ae7e2</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Added a loopback-address constant in LoginManager (GMCLIENT) so the Localhost button uses it instead of the bare "localhost" string.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Updated LoginUI.OnConfirmServerAddressButtonClicked so a loopback target also sets…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-eb895f5fa02e</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Updated LoginUI.OnConfirmServerAddressButtonClicked so a loopback target also sets LoggingHost to the same host, while remote targets (Dev/QA/Live) clear the override so default/redirect logging is unchanged.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Registered systems/console-and-chat-commands.md in the BookStack manifest as a Game…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-cee1111f0dec</guid>
      <pubDate>Sat, 20 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Registered systems/console-and-chat-commands.md in the BookStack manifest as a Game Systems (Client) page.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Registered systems/quest-system.md in the BookStack manifest, mapped to the architecture…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-fea3e79ef4fb</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Registered systems/quest-system.md in the BookStack manifest, mapped to the architecture book (gs-client chapter) after NPC Conversation &amp; Dialogue.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added the new guilds deep-dive to the BookStack manifest (gss-guilds).</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-916d1e393fbc</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Added the new guilds deep-dive to the BookStack manifest (gss-guilds).]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added 16 previously-unmapped docs to the BookStack manifest: running-a-local-server…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-70d23ad30ea2</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Added 16 previously-unmapped docs to the BookStack manifest: running-a-local-server, hosting-on-linux-kvm, logging-and-kibana, the consumables-mechanics crafting reference, a new Housing (Deep Dive) chapter, and the 5 Migration design-plan docs.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Simplified the regex-replace in tools/wiki/publish-docs-to-wiki.ps1 by removing the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-c048968e812b</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Simplified the regex-replace in tools/wiki/publish-docs-to-wiki.ps1 by removing the unnecessary Singleline option.]]></description>
    </item>
    <item>
      <title>Documentation: Added a Store &amp; Commerce docs suite (docs/systems/store/) documenting both stores and how…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-c1a31ebc31e1</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Added a Store &amp; Commerce docs suite (docs/systems/store/) documenting both stores and how to add an item to each.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote the store README hub: the unified real-money funnel (web/Steam/reseller into…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-843b517029c5</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Wrote the store README hub: the unified real-money funnel (web/Steam/reseller into *****), the web→game offer-fulfillment chain and its three brittle no-FK joins, the instant Crown path, currencies, the metadata-only Crown↔web linkage, idempotency, and a source-of-truth map.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote add-item-to-web-store.md: the ***** catalog row + flags bitmask, the ***** SQL (the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-8c9ce962e298</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Wrote add-item-to-web-store.md: the ***** catalog row + flags bitmask, the ***** SQL (the step with no UI), the game-side OfferBundle dependency, verification, and traps.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote add-item-to-in-game-store.md: StoreShelfItem asset → bake (Portalarium ▸ Store ▸…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-03b02e0d595d</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Wrote add-item-to-in-game-store.md: StoreShelfItem asset → bake (Portalarium ▸ Store ▸ Update Metadata) → export (Server StoreShelfItems db → StoreShelfItemsDb.xml) → deploy.]]></description>
    </item>
    <item>
      <title>Documentation: Corrected the in-game store how-to to remove the non-existent "Export…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-9262df73c0dc</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Corrected the in-game store how-to to remove the non-existent "Export StoreShelfItems.xml" menu in favor of the real Reports ▸ Server StoreShelfItems db pipeline.]]></description>
    </item>
    <item>
      <title>Documentation: Cross-linked the store suite from economy-vendors-store.md and components/website.md and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-2bbe46336aff</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Cross-linked the store suite from economy-vendors-store.md and components/website.md and indexed it from README and repo-tour.]]></description>
    </item>
    <item>
      <title>Documentation: Added a Guilds deep-dive (docs/systems/guilds.md) covering creation/charter flow, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-8d3800760c37</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Added a Guilds deep-dive (docs/systems/guilds.md) covering creation/charter flow, the role &amp; permission model, membership management, leadership succession &amp; auto-disband, MOTD/chat, the client/server protocol, SocialServer architecture, the three Mongo collections, and the audit log.]]></description>
    </item>
    <item>
      <title>Documentation: Cross-linked guild-war internals to server-economy-and-guilds.md and added a Guild…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-3b6291749669</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Cross-linked guild-war internals to server-economy-and-guilds.md and added a Guild glossary entry.]]></description>
    </item>
    <item>
      <title>Documentation: Added a console &amp; chat commands reference documenting the chat/slash commands…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-26aa70d31876</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Added a console &amp; chat commands reference documenting the chat/slash commands (ChatUI.ProcessSlashCommand, 92 cases) and the GM-only /~ developer console (DeveloperConsole.cs, ~184 aliases) with grouped arg/effect/example tables drawn from in-code format strings.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the three-layer command gating model (#if GMCLIENT → runtime GM-power check →…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-8d33d087f12d</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Documented the three-layer command gating model (#if GMCLIENT → runtime GM-power check → server UserAccountFlags) plus a maintainer source map.]]></description>
    </item>
    <item>
      <title>Documentation: Added a quest-system deep dive: quests as knowledge flags + journal entries +…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-7c749a244597</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Added a quest-system deep dive: quests as knowledge flags + journal entries + conversation actions (no monolithic Quest object), FlagsExpression evaluation, QuestData NPC markers and quest AI, server-side reward/anti-farm validation and quest reset, and an authoring walkthrough.]]></description>
    </item>
    <item>
      <title>Documentation: Corrected the quest-visual description: QuestVisuals maps QuestStatus to…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-ddd3970505a1</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Corrected the quest-visual description: QuestVisuals maps QuestStatus to designer-assigned SkinnedMeshRenderer/GameObject sets and there is no hardcoded !/? glyph in code; added a gotcha noting the absence of a default icon.]]></description>
    </item>
    <item>
      <title>Documentation: Added an exhaustive housing &amp; decorations suite (docs/systems/housing/) covering the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-291640142dbd</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Added an exhaustive housing &amp; decorations suite (docs/systems/housing/) covering the system from design, data, and code angles plus generated catalog data.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote housing/design.md: lot tiers, the deed/tax economy, decoration limits/categories…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-ab5ced9dceae</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Wrote housing/design.md: lot tiers, the deed/tax economy, decoration limits/categories, permissions &amp; roles, basements/dungeons, magic mover, Player-Owned-Towns, devotionals, and guild/PVP lots.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote housing/data-model.md: the 10 Mongo collections (fields/indexes/TTLs), 18 enums…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-2ed5bc5356ff</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Wrote housing/data-model.md: the 10 Mongo collections (fields/indexes/TTLs), 18 enums, the DecorationSettings/PlacedItemParameter key map, TaxRules, and the PlotStateParameter/TownStateParameter bags plus the sotamap SQL schema.]]></description>
    </item>
    <item>
      <title>Documentation: Wrote housing/code.md: migrated and expanded from the old housing-and-plots.md, adding…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-b1e0e00dcf04</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Wrote housing/code.md: migrated and expanded from the old housing-and-plots.md, adding the GameServer economy side (GameImpl.cs) and SceneServer validation (SceneImpl.cs) the old doc under-covered, the op/event interface catalog, and end-to-end traces.]]></description>
    </item>
    <item>
      <title>Documentation: Generated housing catalog tables with real numbers: tax/rent, per-shape decoration limits…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-134894b066ff</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Generated housing catalog tables with real numbers: tax/rent, per-shape decoration limits for standard/basement/dungeon/POT, the 199 homes, and ~14k world lots.]]></description>
    </item>
    <item>
      <title>Documentation: Turned the old systems/housing-and-plots.md into a redirect stub to keep inbound links…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-97e0022c9e58</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Turned the old systems/housing-and-plots.md into a redirect stub to keep inbound links working, and repointed README.md + repo-tour.md indexes at the suite hub.]]></description>
    </item>
    <item>
      <title>Documentation: Added a hosting-on-linux-kvm runbook for hosting the Photon server on a bare-metal Linux…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-421a32afbf72</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Added a hosting-on-linux-kvm runbook for hosting the Photon server on a bare-metal Linux box: a single Windows VM under KVM with ZFS-mirror storage for instant snapshot/rollback.]]></description>
    </item>
    <item>
      <title>Documentation: Covered ZFS pool setup, the KVM/libvirt/OVMF stack, the ufw + NAT security posture…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-cde24a460f3c</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Covered ZFS pool setup, the KVM/libvirt/OVMF stack, the ufw + NAT security posture (sensitive services kept private), the unattended Windows guest, near-native single-level-KVM tuning, the SotA deploy, and the snapshot-before-migrate + rollback workflow.]]></description>
    </item>
    <item>
      <title>Documentation: Brought the KVM runbook from "deploy in progress" to completed/validated and folded in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-2bb94f4e8f9d</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Brought the KVM runbook from "deploy in progress" to completed/validated and folded in the host bring-up specifics.]]></description>
    </item>
    <item>
      <title>Documentation: Documented autounattend gotchas: virt-install --noautoconsole power-off-between-phases…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-c599c9c78206</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Documented autounattend gotchas: virt-install --noautoconsole power-off-between-phases, Shell-Setup element order, the 259-char CommandLine cap (split first-logon commands), and reading Panther\UnattendGC\setuperr.log via an ntfs-3g ro mount of the guest disk.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the concrete deploy steps: ship the deploy/ tree, the VC++ redist (mongod…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-07a6b447cf3a</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Documented the concrete deploy steps: ship the deploy/ tree, the VC++ redist (mongod 0xC0000135), the MongoDB ***** service + explicit-loopback rs.initiate, running Photon as a service (not Start-Process /debug, which dies on SSH disconnect), the auth stand-in as a scheduled task, and a bot smoke test.]]></description>
    </item>
    <item>
      <title>Documentation: Documented exposing the server to clients: public-IP advertisement, host port-forwarding…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-c9b3a1dce710</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Documented exposing the server to clients: public-IP advertisement, host port-forwarding for the game client ports (sensitive services kept private), and the VM Windows Firewall openings (loopback bot exempt, external clients not).]]></description>
    </item>
    <item>
      <title>Documentation: Documented the live Kibana/ELK logging stack, verifying it is still live: debug/all logs…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-31e796a06200</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Documented the live Kibana/ELK logging stack, verifying it is still live: debug/all logs at ***** and economy/item at *****; an older debug VM is dead.]]></description>
    </item>
    <item>
      <title>Documentation: Added docs/operations/logging-and-kibana.md covering topology, the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-780798d211f8</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Added docs/operations/logging-and-kibana.md covering topology, the log4net→syslog→Logstash ingest path, index/field schemas, and copy-paste ES query recipes for scanning errors/exceptions.]]></description>
    </item>
    <item>
      <title>Documentation: Cross-linked the logging doc from README, the repo tour, ports-and-environments, and the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-2f438c967478</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Cross-linked the logging doc from README, the repo tour, ports-and-environments, and the log4net appenders table in the config reference.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the GM-client one-click Local option and the logging-server requirement in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-c0d358ce596f</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Documented the GM-client one-click Local option and the logging-server requirement in client-editor-server-targeting.md (a Unity client needs a Logging-enabled instance).]]></description>
    </item>
    <item>
      <title>Documentation: Added plan records for the chat-input crash fix, the housing docs suite, and the store…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-a5f92c9a1912</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Added plan records for the chat-input crash fix, the housing docs suite, and the store docs suite.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Ran a codebase-wide doc accuracy audit (131 files, 1,797 claims checked) and applied 198…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-fa603946c0ba</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Ran a codebase-wide doc accuracy audit (131 files, 1,797 claims checked) and applied 198 corrections (22 P0, 52 P1, ~124 P2); 5 findings were re-verified as false positives and left unchanged.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Removed an invented "LoadBalancing" Photon instance from ports-and-environments.md (the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-38e469e901c6</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Removed an invented "LoadBalancing" Photon instance from ports-and-environments.md (the LoadBalancer.config path is just a load-shedding weights file).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Fixed skills/magic/sun.md: 5 spells wrongly marked "Reagents: None" (SolarFlare…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-3a0304511a12</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Fixed skills/magic/sun.md: 5 spells wrongly marked "Reagents: None" (SolarFlare, SummonPhoenix, ElysianIllumination, RevealHidden, DazzlingRays) now list their actual reagents and consume chances.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected the ShadowForm lock time in skills/magic/lunar.md to 6 − skillLevel/20 (it was…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-d581733b44ec</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Corrected the ShadowForm lock time in skills/magic/lunar.md to 6 − skillLevel/20 (it was inverted to 1 + skillLevel/20).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected combat/hit-outcomes.md and damage-and-resistance.md: rooted targets skip the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-9f7eed97b49d</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Corrected combat/hit-outcomes.md and damage-and-resistance.md: rooted targets skip the dodge roll entirely rather than having dodge halved.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected systems/pvp-and-flagging.md: open-world PVP attackability is enforced via…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-588eb976f45f</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Corrected systems/pvp-and-flagging.md: open-world PVP attackability is enforced via collision-layer switching (CharactersPVP), not a both-flagged OpenPVP check in CombatEffect.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected skills/crafting/catalog/patterns.md: patterns are consumed on use (Eternal…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-2e55066e6b37</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Corrected skills/crafting/catalog/patterns.md: patterns are consumed on use (Eternal variants returned on salvage), not "learned once, never consumed".]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected components/server-ops-and-tools.md: sota-stream is a donation/goal tracker; the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-9ceb6650fc9d</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Corrected components/server-ops-and-tools.md: sota-stream is a donation/goal tracker; the Twitch chat feed is designed (config.yml.example + custom.js) but not implemented server-side.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected combat/status-effects.md: using a combat rune or unsheathing sets…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-1a2c54069fc3</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Corrected combat/status-effects.md: using a combat rune or unsheathing sets LastSpawnTimeTicks=0 but does not remove the SpawnProtectionCharacterEffect; only fall damage ends it early.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected hosting-on-linux-kvm.md to drop an internal S2S port (*****) from the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-b249c33b7a6c</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Corrected hosting-on-linux-kvm.md to drop an internal S2S port (*****) from the public-forward list; the client TCP port set is ***** only.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected systems/ui-framework-ngui.md: SimpleJSON is not used by…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-a1d34f7df974</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Corrected systems/ui-framework-ngui.md: SimpleJSON is not used by MoveableWindow/UIPersist (those use JSONPropertyBag); SimpleJSON is only in TranslationAPI and CharacterAppearance.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected skills/magic/earth.md SummonEarthElemental combo requirement to the actual…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-65098fe190c4</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Corrected skills/magic/earth.md SummonEarthElemental combo requirement to the actual runes referenced (Juxtapose and SummonAirElemental).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected the data-model class count to 75 [ShroudStorage] document classes (was ~60) and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-85420d33ed3e</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Corrected the data-model class count to 75 [ShroudStorage] document classes (was ~60) and fixed the Portalarium.SotABackend.dll.config filename (was "Portalinium").]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected the photon-api-surface.md ApplicationBase list to 6 server applications…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-059c6ea14be8</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Corrected the photon-api-surface.md ApplicationBase list to 6 server applications (removed the non-existent LiteApplication; Lite.dll is an SDK dependency).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected glossary.md auction class names to PlayerAuctionItem / PlayerPurchaseOrder, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-bd3bd96366e2</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Corrected glossary.md auction class names to PlayerAuctionItem / PlayerPurchaseOrder, and updated the CharacterStat channel count to ~556.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected skills/strategy/taming.md: the TameFrenzy -20 aggro effect targets the pet, not…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-5a48af783553</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Corrected skills/strategy/taming.md: the TameFrenzy -20 aggro effect targets the pet, not the handler, and fixed the TameCombatTraining tree parentage (TameObedience, not TameCollarRecovery).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected skills/magic/air.md: ChainLightning chains up to 4 hops (not 2) and Blink…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-84daa87ef7fa</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Corrected skills/magic/air.md: ChainLightning chains up to 4 hops (not 2) and Blink consumes Black Pearl + Mandrake Root + Sulfurous Ash (not just Black Pearl).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected the skill-school count to 37 schools (was 32) in repo-tour.md and README.md…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-0445b6a49ecf</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Corrected the skill-school count to 37 schools (was 32) in repo-tour.md and README.md, and the crafting pattern count to 1,657.]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected combat/formulas.md to cite CombatFormula.cs at 3,389 lines (was 2,092) and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-c18176f93ae7</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Corrected combat/formulas.md to cite CombatFormula.cs at 3,389 lines (was 2,092) and infra-sizing.md to ~440k tracked files (was 350-400k).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Corrected the unity6-upgrade-plan.md NGUI framing to match the linked assessment (NGUI is…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-a76acffa8824</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Corrected the unity6-upgrade-plan.md NGUI framing to match the linked assessment (NGUI is actively maintained and likely Unity 6-compatible after a version bump).]]></description>
    </item>
    <item>
      <title>Documentation: accuracy audit (198 fixes): Added docs/_audit/2026-06-20-doc-accuracy-audit.md with the full findings.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-61f7d2238029</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Added docs/_audit/2026-06-20-doc-accuracy-audit.md with the full findings.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Added tools/run-bot-tests.ps1: a harness that drives SotABotClient across many /t modes…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-1bc3db77fb60</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Added tools/run-bot-tests.ps1: a harness that drives SotABotClient across many /t modes, continues past failures, and writes a per-mode PASS/FAIL report under .test-results/ (gitignored); can bring the local stack up/down with -StartStack.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Added a new '/t whisper' BotClient mode (WhisperTest + GroupConnectionForWhisperTest): a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-805634281e6c</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Added a new '/t whisper' BotClient mode (WhisperTest + GroupConnectionForWhisperTest): a minimal multi-user reference test where bot A whispers bot B and bot B asserts the received event.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Documented the bot-test harness and whisper test in running-a-local-server.md and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-0b36c56c2e8e</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Documented the bot-test harness and whisper test in running-a-local-server.md and systems/server-testing-and-botclient.md.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Added an export-housing-catalogs.ps1 exporter (deterministic, marker-injected…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-53b61d89dcfd</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Added an export-housing-catalogs.ps1 exporter (deterministic, marker-injected, regenerable after a Perforce sync) plus a tools/housing/README.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Gitignored local-server runtime artifacts (deploy/SotABackend, deploy/CounterPublisher…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-20-5ad08fb3e276</guid>
      <pubDate>Sat, 20 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Gitignored local-server runtime artifacts (deploy/SotABackend, deploy/CounterPublisher, deploy/log, deploy/itemlog, deploy/bin_win64/log, and a root log/) so local runs leave a clean working tree.]]></description>
    </item>
    <item>
      <title>Headlines · 2026-06-19</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-headlines</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:10 -0500</pubDate>
      <description><![CDATA[<ul>
        <li>Closed two XP-award exploits where combat bonuses were paid without genuine risk or to the wrong players; both now validate server-side.</li>
        <li>Migrated the entire wiki to BookStack and layered a citing Wiki Assistant on top of it.</li>
        <li>Stood up self-hosted Gitea Issues as the team's task and bug tracker.</li>
        <li>Landed a massive documentation push: a full combat engine reference plus all 32 skill schools across 33 new docs.</li>
        <li>Documented the entire crafting content layer, every recipe, item, effect, and pattern across 15 schools.</li>
        <li>Fixed GM invisibility still broadcasting "is now online" to friends and guild.</li>
      </ul>]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Fixed GM invisibility still broadcasting an "is now online" notification to friends and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-8b675bf4871a</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:09 -0500</pubDate>
      <description><![CDATA[Fixed GM invisibility still broadcasting an "is now online" notification to friends and guild in some cases.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Fixed the GM invisibility toggle not fully restoring normal presence when switched back…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-495d46b1d6a1</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:08 -0500</pubDate>
      <description><![CDATA[Fixed the GM invisibility toggle not fully restoring normal presence when switched back off.]]></description>
    </item>
    <item>
      <title>Gameplay &amp; server fixes: Closed two XP-award exploits: one paid a group/PVP combat bonus in instances that carried…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-729ed92346b3</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:07 -0500</pubDate>
      <description><![CDATA[Closed two XP-award exploits: one paid a group/PVP combat bonus in instances that carried no genuine risk, and one paid the bonus to the wrong players. Both now validate authoritatively on the server, with regression coverage. Mechanics withheld.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Enabled local server builds with tools/setup-server-build-deps.ps1 , which junctions the…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-045ec4dde8a2</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:06 -0500</pubDate>
      <description><![CDATA[Enabled local server builds with <code>tools/setup-server-build-deps.ps1</code>, which junctions the four out-of-tree sibling trees (PortalariumLibrary, InstallTools, Photon, MongoDb) from the Perforce workspace.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Stopped committing server codegen output, since GenCode.exe rewrites…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-daefd0d5b239</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:05 -0500</pubDate>
      <description><![CDATA[Stopped committing server codegen output, since GenCode.exe rewrites <code>Server/src-server/**/Generated/*.cs</code> with a timestamp header on every build, causing endless churn.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Gitignored and untracked the server Generated/ code; verified a clean build recreates all…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-cf898e4c154d</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:04 -0500</pubDate>
      <description><![CDATA[Gitignored and untracked the server <code>Generated/</code> code; verified a clean build recreates all of it (deleted 67, rebuilt, 67 restored, exit 0).]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Kept the Unity client Generated/ copies tracked, since the Unity build does not run…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-0c141b499dc0</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:03 -0500</pubDate>
      <description><![CDATA[Kept the Unity client <code>Generated/</code> copies tracked, since the Unity build does not run GenCode.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Noted to keep the untrack Git-only until cutover so the outbound bridge doesn't replay it…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-ae6603ac698d</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:02 -0500</pubDate>
      <description><![CDATA[Noted to keep the untrack Git-only until cutover so the outbound bridge doesn't replay it as a Perforce delete.]]></description>
    </item>
    <item>
      <title>Photon server &amp; scaling: Documented every Photon API called on server and client (method signatures, behavior…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-354ecce05d10</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:01 -0500</pubDate>
      <description><![CDATA[Documented every Photon API called on server and client (method signatures, behavior contracts, custom serialization types) plus a replacement-library evaluation matrix for replacement planning.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Migrated the wiki from Docmost/Wiki.js to BookStack, deployed via 70-bookstack.sh…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-c1be8f9111f8</guid>
      <pubDate>Fri, 19 Jun 2026 00:01:00 -0500</pubDate>
      <description><![CDATA[Migrated the wiki from Docmost/Wiki.js to BookStack, deployed via <code>70-bookstack.sh</code> (BookStack + MariaDB on *****, internal-only) with cutover/rollback and a daily backup cron.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added tools/bookstack/ : a token-REST publisher (docs/ to Shelf/Book/Chapter/Page with a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-37ad23fe2fc7</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:59 -0500</pubDate>
      <description><![CDATA[Added <code>tools/bookstack/</code>: a token-REST publisher (docs/ to Shelf/Book/Chapter/Page with a two-pass link rewrite) plus a manifest and a <code>wiki-sync-status.ps1</code> drift detector.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added the sync-wiki skill to reconcile docs/ and BookStack both ways, deprecating the old…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-1a932d565e64</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:58 -0500</pubDate>
      <description><![CDATA[Added the <code>sync-wiki</code> skill to reconcile docs/ and BookStack both ways, deprecating the old Docmost/Wiki.js provisioning scripts.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added a Wiki Assistant at /assistant via a BookStack logical theme: a search-and-answer…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-42a76a3234f8</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:57 -0500</pubDate>
      <description><![CDATA[Added a Wiki Assistant at <code>/assistant</code> via a BookStack logical theme: a search-and-answer helper over the wiki that returns cited, permission-aware results.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Stored the assistant's API key server-side only, never committed.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-dcafb3e4f676</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:56 -0500</pubDate>
      <description><![CDATA[Stored the assistant's API key server-side only, never committed.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added a doc map (precomputed per-page summaries + section headings for all ~45 pages) so…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-305bcfc25e89</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:55 -0500</pubDate>
      <description><![CDATA[Added a doc map (precomputed per-page summaries + section headings for all ~45 pages) so the assistant can pick relevant pages, with keyword search as a fallback.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added tools/bookstack/build-wiki-index.ps1 to generate the deterministic wiki-index.json…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-d15862b6f37e</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:54 -0500</pubDate>
      <description><![CDATA[Added <code>tools/bookstack/build-wiki-index.ps1</code> to generate the deterministic <code>wiki-index.json</code> doc map from docs/ + .bookmap, with no extra search index or database required.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Made the assistant permission-filter the doc map via Page::visible before it uses it.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-7b04574bca8a</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:53 -0500</pubDate>
      <description><![CDATA[Made the assistant permission-filter the doc map via <code>Page::visible</code> before it uses it.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added unanswered-question logging: a report_gap tool plus a looksUnanswered heuristic and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-abc451792914</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:52 -0500</pubDate>
      <description><![CDATA[Added unanswered-question logging: a <code>report_gap</code> tool plus a <code>looksUnanswered</code> heuristic and truncated-run fallback so misses are caught.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Made the assistant append gap records as JSON to assistant-gaps.jsonl and tell the user…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-e71ca7a8fe57</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:51 -0500</pubDate>
      <description><![CDATA[Made the assistant append gap records as JSON to <code>assistant-gaps.jsonl</code> and tell the user the question was logged.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Added an admin-only GET /assistant/gaps endpoint to review the research backlog, with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-c65a6fe5e6ba</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:50 -0500</pubDate>
      <description><![CDATA[Added an admin-only <code>GET /assistant/gaps</code> endpoint to review the research backlog, with <code>?format=json</code> for raw export.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Fixed the BookStack publisher creating duplicate pages/chapters on every publish, since…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-04745cf58a5a</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:49 -0500</pubDate>
      <description><![CDATA[Fixed the BookStack publisher creating duplicate pages/chapters on every publish, since this BookStack version derives slugs from the name and ignores the requested slug; fell back to name-based matching.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Applied the same name-fallback match to shelves, stopping re-publish from creating…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-ad3d77880153</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:48 -0500</pubDate>
      <description><![CDATA[Applied the same name-fallback match to shelves, stopping re-publish from creating duplicate shelves (5 had accumulated).]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Applied the same name-fallback match to books, closing the duplicate "Combat &amp; Skills…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-b34431e7f62d</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:47 -0500</pubDate>
      <description><![CDATA[Applied the same name-fallback match to books, closing the duplicate "Combat &amp; Skills Reference" book on republish.]]></description>
    </item>
    <item>
      <title>Wiki &amp; assistant: Registered all new crafting, combat, and skill pages plus new chapters in the BookStack…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-631868340065</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:46 -0500</pubDate>
      <description><![CDATA[Registered all new crafting, combat, and skill pages plus new chapters in the BookStack manifest and corrected the Combat &amp; Skills book slug to <code>combat-skills-reference</code>.]]></description>
    </item>
    <item>
      <title>Documentation: Added docs/skills/crafting/consumables.md , a code-verified dive into how the 533…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-dc61e10986e3</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:45 -0500</pubDate>
      <description><![CDATA[Added <code>docs/skills/crafting/consumables.md</code>, a code-verified dive into how the 533 consumables work at runtime, with every claim cited to file:line.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the consumable item+rune model and the consumption flow.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-64b84a602888</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:44 -0500</pubDate>
      <description><![CDATA[Documented the consumable item+rune model and the consumption flow.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the cooldown system, including that an inventory double-click is not…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-ef3f2938dabb</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:43 -0500</pubDate>
      <description><![CDATA[Documented the cooldown system, including that an inventory double-click is not cooldown-gated while a locked combat-deck card is.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the Consumable Power Bonus / "potion sickness" mechanic.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-fa1a4e786bca</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:42 -0500</pubDate>
      <description><![CDATA[Documented the Consumable Power Bonus / "potion sickness" mechanic.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the 6-slot food/drink buff channel, elixirs, and per-category behavior…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-f49e5d200092</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:41 -0500</pubDate>
      <description><![CDATA[Documented the 6-slot food/drink buff channel, elixirs, and per-category behavior (potions, food/drink, poisons, transformations, mounts, scrolls, cosmetics).]]></description>
    </item>
    <item>
      <title>Documentation: Documented the entire crafting content layer: every recipe (3,257), item/material/tool…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-f4ff580e7274</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:40 -0500</pubDate>
      <description><![CDATA[Documented the entire crafting content layer: every recipe (3,257), item/material/tool (2,960), item-instance effect (781), and pattern (1,658), across all 15 crafting schools.]]></description>
    </item>
    <item>
      <title>Documentation: Added three crafting data-model reference docs (recipe/item/effect asset schemas, enums…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-7df498dd501f</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:39 -0500</pubDate>
      <description><![CDATA[Added three crafting data-model reference docs (recipe/item/effect asset schemas, enums, and the magnitude formula <code>1 + Prof/125 + 0.05·(Tier−1)</code>).]]></description>
    </item>
    <item>
      <title>Documentation: Added a Crafting System hub README tying the skill docs, references, catalogs, and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-4562ba8b6901</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:38 -0500</pubDate>
      <description><![CDATA[Added a Crafting System hub README tying the skill docs, references, catalogs, and runtime pipeline together.]]></description>
    </item>
    <item>
      <title>Documentation: Generated 21 content catalogs under catalog/ (recipes per school, materials, components…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-87643d0f2c1d</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:37 -0500</pubDate>
      <description><![CDATA[Generated 21 content catalogs under <code>catalog/</code> (recipes per school, materials, components, reagents/fuels/ingredients, tools, masterwork/enchant/other effects, consumables, craftable equipment, patterns) with exact ingredients-to-outputs.]]></description>
    </item>
    <item>
      <title>Documentation: Folded the Smelting alloy recipes (Bronze, Constantan, White Iron, Meteoric Iron)…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-9d2802f3d377</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:36 -0500</pubDate>
      <description><![CDATA[Folded the Smelting alloy recipes (Bronze, Constantan, White Iron, Meteoric Iron) surfaced by the catalog into <code>refining.md</code>.]]></description>
    </item>
    <item>
      <title>Documentation: Recorded the key data-model finding that consumable buffs are an m_rune reference to a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-8eb9ff59b5fd</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:35 -0500</pubDate>
      <description><![CDATA[Recorded the key data-model finding that consumable buffs are an <code>m_rune</code> reference to a Rune asset, not an Item-Instance-Effect.]]></description>
    </item>
    <item>
      <title>Documentation: Recorded that CharacterStat is a plain sequential enum with 574 members and that GemType…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-9a9051d1eb09</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:34 -0500</pubDate>
      <description><![CDATA[Recorded that <code>CharacterStat</code> is a plain sequential enum with 574 members and that <code>GemType</code>'s element is encoded in the effect name rather than the field.]]></description>
    </item>
    <item>
      <title>Documentation: Added docs/skills/rune-asset-reference.md documenting every serialized field of a skill…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-87f6fbdcd1ec</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:33 -0500</pubDate>
      <description><![CDATA[Added <code>docs/skills/rune-asset-reference.md</code> documenting every serialized field of a skill asset (Rune ScriptableObject + CombatEffect/MasterCombatEffect), grouped by inspector divider.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the runtime formulas that combine rune fields (focus cost, cooldown, fizzle…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-58dd1218522f</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:32 -0500</pubDate>
      <description><![CDATA[Documented the runtime formulas that combine rune fields (focus cost, cooldown, fizzle, weighted effect selection) and the supporting enums.]]></description>
    </item>
    <item>
      <title>Documentation: Fixed two stale ../../../systems/ links (one ../ too many) in heavy-armor.md and…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-e9929d93c75d</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:31 -0500</pubDate>
      <description><![CDATA[Fixed two stale <code>../../../systems/</code> links (one <code>../</code> too many) in <code>heavy-armor.md</code> and <code>refining.md</code>.]]></description>
    </item>
    <item>
      <title>Documentation: Added an exhaustive combat system reference plus a 32-school skill reference across 33…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-cc882ec50602</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:30 -0500</pubDate>
      <description><![CDATA[Added an exhaustive combat system reference plus a 32-school skill reference across 33 new markdown docs.]]></description>
    </item>
    <item>
      <title>Documentation: Documented the CombatFormula RPN evaluator (147 token types), all 50+ EffectType…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-5d0423048c06</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:29 -0500</pubDate>
      <description><![CDATA[Documented the CombatFormula RPN evaluator (147 token types), all 50+ EffectType handlers, the DamageType/resistance pipeline, 28 CharacterEffect subclasses, and HitType roll order with Crit/Glancing/Dodge/Parry/Block mechanics.]]></description>
    </item>
    <item>
      <title>Documentation: Added a master skill index, data model + InnateReward scaling, and progression/XP curves…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-3f0672757194</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:28 -0500</pubDate>
      <description><![CDATA[Added a master skill index, data model + InnateReward scaling, and progression/XP curves, then one doc per school (7 Combat, 9 Magic, 5 Strategy, 3 Crafting).]]></description>
    </item>
    <item>
      <title>Documentation: Documented the PVP flagging system (self/group/scene), how a party overrides…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-98fcda174fee</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:27 -0500</pubDate>
      <description><![CDATA[Documented the PVP flagging system (self/group/scene), how a party overrides attackability, and the server-authoritative PVP XP bonus award flow with the client/server authority split.]]></description>
    </item>
    <item>
      <title>Documentation: Added building-the-server.md covering the four out-of-tree dependencies + junction setup…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-1a93e01decbb</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:26 -0500</pubDate>
      <description><![CDATA[Added <code>building-the-server.md</code> covering the four out-of-tree dependencies + junction setup, .NET ***** / MSBuild prerequisites, the GenCode generator, the build command, and why generated code is no longer committed.]]></description>
    </item>
    <item>
      <title>Documentation: Updated migration/status.md (local build works; codegen + bridge notes) and onboarding.md…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-485216eba5c4</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:25 -0500</pubDate>
      <description><![CDATA[Updated <code>migration/status.md</code> (local build works; codegen + bridge notes) and <code>onboarding.md</code> with server build steps.]]></description>
    </item>
    <item>
      <title>Documentation: Added docs/operations/mongodb.md , an operational and developer guide covering…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-1f8c35faa32c</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:24 -0500</pubDate>
      <description><![CDATA[Added <code>docs/operations/mongodb.md</code>, an operational and developer guide covering replica-set topology, connection/config, adding a collection, the data-migration process, backup/restore, security findings (P0-P2), and a modernization roadmap.]]></description>
    </item>
    <item>
      <title>Documentation: Cross-linked the MongoDB doc from data-model, server, server-ops-and-tools…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-f04db3674153</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:23 -0500</pubDate>
      <description><![CDATA[Cross-linked the MongoDB doc from data-model, server, server-ops-and-tools, ports-and-environments, and server-config-reference.]]></description>
    </item>
    <item>
      <title>Documentation: Added a Windows-fleet SSH remote-management plan comparing SSH vs WinRM/Ansible/PsExec…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-0bc4c2f65d2f</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:22 -0500</pubDate>
      <description><![CDATA[Added a Windows-fleet SSH remote-management plan comparing SSH vs WinRM/Ansible/PsExec, with a per-box bootstrap runbook and security rules.]]></description>
    </item>
    <item>
      <title>Documentation: Started a persistent docs/critical-tasks.md backlog, seeded with the SSH rollout and a…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-3cd4d07f4781</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:21 -0500</pubDate>
      <description><![CDATA[Started a persistent <code>docs/critical-tasks.md</code> backlog, seeded with the SSH rollout and a fleet inventory/assessment, and later added MongoDB task #4.]]></description>
    </item>
    <item>
      <title>Documentation: Added comprehensive AdminTool documentation covering setup, authentication, command set…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-d9b098b352aa</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:20 -0500</pubDate>
      <description><![CDATA[Added comprehensive AdminTool documentation covering setup, authentication, command set, repository layout, and security notes for internal use.]]></description>
    </item>
    <item>
      <title>Documentation: Added client-editor-server-targeting.md explaining how to retarget the editor to Dev, QA…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-57cc7a30a691</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:19 -0500</pubDate>
      <description><![CDATA[Added <code>client-editor-server-targeting.md</code> explaining how to retarget the editor to Dev, QA, or Live servers via scripting defines and GM client options.]]></description>
    </item>
    <item>
      <title>Documentation: Established docs/plans/ as the per-task history of why a change was made, with…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-799ee0e6be02</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:18 -0500</pubDate>
      <description><![CDATA[Established <code>docs/plans/</code> as the per-task history of why a change was made, with date-prefixed kebab-slug plan records.]]></description>
    </item>
    <item>
      <title>Documentation: Linked all new docs from docs/README.md and docs/repo-tour.md across the crafting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-ac995f248491</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:17 -0500</pubDate>
      <description><![CDATA[Linked all new docs from <code>docs/README.md</code> and <code>docs/repo-tour.md</code> across the crafting, combat, skills, PVP, MongoDB, AdminTool, and remote-management additions.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Stood up self-hosted Gitea Issues on cspears/urpg as the team's free, self-hosted task &amp;…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-8a696671b1bf</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:16 -0500</pubDate>
      <description><![CDATA[Stood up self-hosted Gitea Issues on cspears/urpg as the team's free, self-hosted task &amp; bug tracker, driven over its REST API.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Wired scoped API access to the tracker for the team, with the token supplied via an…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-0ae6ac2a4596</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:15 -0500</pubDate>
      <description><![CDATA[Wired scoped API access to the tracker for the team, with the token supplied via an environment variable.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Added docs/operations/issue-tracking.md covering scoped labels, milestones/scheduling…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-4da86e1101d4</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:14 -0500</pubDate>
      <description><![CDATA[Added <code>docs/operations/issue-tracking.md</code> covering scoped labels, milestones/scheduling, the kanban board, a REST cookbook, and the agent loop.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Added idempotent Gitea setup scripts under tools/gitea/ to mint a bot account +…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-f452b76ce538</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:13 -0500</pubDate>
      <description><![CDATA[Added idempotent Gitea setup scripts under <code>tools/gitea/</code> to mint a bot account + issue-scoped token and to create labels, the seed milestone, and seed issues.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Pinned issue time-tracking in app.ini via infra/provision/20-gitea.sh .</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-adde3e5a8adb</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:12 -0500</pubDate>
      <description><![CDATA[Pinned issue time-tracking in <code>app.ini</code> via <code>infra/provision/20-gitea.sh</code>.]]></description>
    </item>
    <item>
      <title>Dev portal &amp; infra: Provisioned 20 scoped labels, an "Infra hardening (P0)" milestone, and 4 seed issues from…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-0737aacdad09</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:11 -0500</pubDate>
      <description><![CDATA[Provisioned 20 scoped labels, an "Infra hardening (P0)" milestone, and 4 seed issues from <code>docs/critical-tasks.md</code>.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Added tools/crafting/export-crafting-catalogs.ps1 , which parses the Unity crafting…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-d25cfdbdc5ff</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:10 -0500</pubDate>
      <description><![CDATA[Added <code>tools/crafting/export-crafting-catalogs.ps1</code>, which parses the Unity crafting <code>.asset</code> files, builds a GUID-to-path index, resolves references to display names, and injects markdown tables into the catalog docs.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Made the exporter derive CharacterStat names from source, build produced-by/used-in…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-3c18719bcf6f</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:09 -0500</pubDate>
      <description><![CDATA[Made the exporter derive <code>CharacterStat</code> names from source, build produced-by/used-in cross-refs, and stay deterministic and idempotent for re-running after a Perforce sync.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Extended the exporter to resolve each consumable's m_rune to its cooldown, food-slot…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-474e992d54a3</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:08 -0500</pubDate>
      <description><![CDATA[Extended the exporter to resolve each consumable's <code>m_rune</code> to its cooldown, food-slot weight, and power-bonus gate.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Regenerated the consumables catalog with new Cooldown (all 533 items) and Food slots…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-607a61ee5109</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:07 -0500</pubDate>
      <description><![CDATA[Regenerated the consumables catalog with new Cooldown (all 533 items) and Food slots columns.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Found via the exporter that every rune-bearing consumable has a cooldown, while the 94…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-3dd053f8471c</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:06 -0500</pubDate>
      <description><![CDATA[Found via the exporter that every rune-bearing consumable has a cooldown, while the 94 no-rune items (dyes, repair/engraving kits, mugs, ammo, treasure-map pieces) have none.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Added the standard "generated, do not edit by hand" note line to the other catalog blocks…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-29db0d0cb2af</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:05 -0500</pubDate>
      <description><![CDATA[Added the standard "generated, do not edit by hand" note line to the other catalog blocks on regeneration.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Added tools/win-ssh/bootstrap-sshd-win81.ps1 , a per-box OpenSSH bootstrap template for…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-eddbb04b99fb</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:04 -0500</pubDate>
      <description><![CDATA[Added <code>tools/win-ssh/bootstrap-sshd-win81.ps1</code>, a per-box OpenSSH bootstrap template for the legacy Windows 8.1 fleet.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Removed stale Playwright console and page-log artifacts and gitignored them.</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-7779561c8a73</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:03 -0500</pubDate>
      <description><![CDATA[Removed stale Playwright console and page-log artifacts and gitignored them.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Recorded the team preference in CLAUDE.md to work directly on main and only branch when…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-b410691c8d69</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:02 -0500</pubDate>
      <description><![CDATA[Recorded the team preference in CLAUDE.md to work directly on main and only branch when explicitly asked.]]></description>
    </item>
    <item>
      <title>Tooling &amp; bridge: Updated CLAUDE.md guidelines to record successful discoveries in docs and to link new…</title>
      <link>https://catnipgames.net/blog/week-2026-06-15.html</link>
      <guid isPermaLink="false">catnipgames-worklog-2026-06-19-c86d4d861721</guid>
      <pubDate>Fri, 19 Jun 2026 00:00:01 -0500</pubDate>
      <description><![CDATA[Updated CLAUDE.md guidelines to record successful discoveries in docs and to link new findings from README and repo-tour.]]></description>
    </item>
  </channel>
</rss>