<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Void Horizon dev blog</title>
  <link>https://voidhorizon.net/#dev-blog</link>
  <atom:link href="https://voidhorizon.net/feed.xml" rel="self" type="application/rss+xml"/>
  <description>Development updates from Void Horizon.</description>
  <language>en</language>
  <lastBuildDate>Mon, 02 Nov 2026 12:00:00 GMT</lastBuildDate>
  <item>
    <title>Nov 2: vehicles hit back, melee chains grow, and four kaiju are coming</title>
    <link>https://voidhorizon.net/#post-2026-11-02-nov-2-vehicles-hit-back-melee-chains-grow-and-fou</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-11-02-nov-2-vehicles-hit-back-melee-chains-grow-and-fou</guid>
    <pubDate>Mon, 02 Nov 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Vehicles now fight with real starship-style gunfire: their turrets hold together, track enemies and every vehicle carries a pulse energy machine gun. Melee has varied light and heavy swing chains for one-handed blades, one-handed blunt weapons and two-handed blunt weapons, for players and NPCs. Gear and vehicle quality tiers unlock as the main story moves forward. Cronium still has to be earned through crafting, hard quests or faction standing. The action bar is about a quarter smaller, with an icon for each ability and a phase cooldown that shows when it is ready. Four kaiju are coming, each with its own movements and beams that can reach flying targets. Behind the scenes, Windows cache writes are serialized to prevent an intermittent startup crash. Ship and release checks now report the cause when they fail, handle retries safely and avoid rebuilding work that is already verified.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://voidhorizon.net/teaser-art/gallery/vh-vehicle-turret-tracking.jpg&quot; alt=&quot;Vehicle turret tracks a nearby enemy&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://voidhorizon.net/teaser-art/gallery/vh-vehicle-pulse-flight.jpg&quot; alt=&quot;Vehicle pulse gun firing in flight&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://voidhorizon.net/teaser-art/gallery/vh-melee-blade-light-chain.jpg&quot; alt=&quot;One-handed blade light swing chain&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://voidhorizon.net/teaser-art/gallery/vh-melee-2h-heavy-chain.jpg&quot; alt=&quot;Two-handed blunt heavy swing chain&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://voidhorizon.net/teaser-art/gallery/vh-action-bar-phase-cooldown-v4.jpg&quot; alt=&quot;Action bar ability icons and phase cooldown sweep&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://voidhorizon.net/teaser-art/gallery/vh-kaiju-beam-still-v4.jpg&quot; alt=&quot;Warp Leviathan fires beams at a flying target&quot;&gt;&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 31: specialties that read the same everywhere, and a gBay you can filter</title>
    <link>https://voidhorizon.net/#post-2026-10-31-oct-31-specialties-that-read-the-same-everywhere</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-31-oct-31-specialties-that-read-the-same-everywhere</guid>
    <pubDate>Sat, 31 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Every power with an attack now offers the same damage specialty, Waker&amp;apos;s Wrath, at +7.5% per rank, and specialties with the same effect share one name on every power: Ark-Forged for health, Deathless for toughness, Old Soul for XP, Undying for healing, plus Starstep, Hullborn, Unbroken, Silver Tongue and Long Memory for attributes. Electrokinesis now grants Thought, Warp grants Will and Life Creation grants Durability. Old saves keep every rank, and anything over the new caps refunds its XP. The gBay marketplace gained type filters (ranged, melee, armor, accessories, vehicles, ships), name search and price sorting, with each listing leading with the item&amp;apos;s name and its quality and grade. The launcher now finishes an update even when the previous build&amp;apos;s rollback files were lost, and a flaky combat test was traced to shared tuning values and fixed.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 29 to 30: powers cast like a pistol, a gbay you can shop, and faster loading</title>
    <link>https://voidhorizon.net/#post-2026-10-30-oct-29-to-30-powers-cast-like-a-pistol-a-gbay-you</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-30-oct-29-to-30-powers-cast-like-a-pistol-a-gbay-you</guid>
    <pubDate>Fri, 30 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Power casts now use the pistol-aim pose with the kinetic pistol&amp;apos;s kickback, a clean stand-in until the full cast animations land. The gbay marketplace detail panel stays put: hovering never moves the rows, long weapon readouts scroll, and a purchase was proven end to end in the live game. Your inventory sheet shows your Cronium. Enemies now come in tiers 1 to 4 with tiered kill XP, and defeated immortal foes return as ghosts. All six accessory slots open from the start, every accessory stacks, and the paper doll is the equipment view: click or drag a slot to unequip, drop to equip. Esc always leaves the pause menu, which now has a Report a bug button. Bug reports drain steadily and show Sent or Pending, and the game only offers to send a previous-session report after a real crash. Character bodies load about 20 times faster after the first time, and only one copy of the game runs at once. A fix for a hang when quitting on Windows ships with the next build.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 28 to 29: quests you can finish, one damage line, and a dodge on Shift</title>
    <link>https://voidhorizon.net/#post-2026-10-29-oct-28-to-29-quests-you-can-finish-one-damage-lin</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-29-oct-28-to-29-quests-you-can-finish-one-damage-lin</guid>
    <pubDate>Thu, 29 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Quests got the most attention. The objective line now always says who gave you the job, where you need to go, and what to do next. When the place is elsewhere it tells you to open the chart. The compass, the on-screen marker and the local map all point at the same spot, and the jump-space display keeps the quest in view while you fly. Quests show their real titles in the log and in conversation. After a jump, the quest you were on picks up where you left it instead of offering an unrelated side job. With all that in place, a brand-new character can walk The Waking from the cryo bay to the Ark relay, on to the shuttle, out to Faraway Landing and into Act 1.&lt;/p&gt;&lt;p&gt;Combat now runs on one damage line. Weapons and powers grow from the same base, bonuses add instead of multiplying, and melee sits right beside ranged at every tier. Pick whichever you enjoy. Quick power casts got a faster rhythm, and power side effects blend instead of stacking into spikes. Power casts no longer drop into a squat; the body shapes the power out in front. Q cycles through your weapons and attack powers, and the action bar fills itself with your subpowers&amp;apos; active abilities.&lt;/p&gt;&lt;p&gt;Movement: tap Shift with a direction to dodge once, hold Shift to sprint. Continuum&amp;apos;s blink starts at 15 stamina and gets cheaper as you master it.&lt;/p&gt;&lt;p&gt;Progression: attributes, skills and subpowers now cost one point per rank. Power ranks cost twice as much, so growing a power is a bigger decision.&lt;/p&gt;&lt;p&gt;Jump-space travel: the Shadow pickets event shows Fight, Evade and Continue with their keys, and every choice moves you on. The loading screen when you jump down to a deck shows each stage it&amp;apos;s working through, and your own character now loads during the flight, which cut about four seconds off the first arrival.&lt;/p&gt;&lt;p&gt;Smaller fixes: riders face forward on vehicles, loot and death crates are solid, the skills window lines up and explains Educated, and character creation&amp;apos;s detail pane follows the option you&amp;apos;re looking at.&lt;/p&gt;&lt;p&gt;Next: the inventory paper doll takes over from the duplicate equipped list and gets six accessory slots, the Esc menu stops trapping you, and new motion sets for characters.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 27 to 28: aim-locked powers, asteroids that break, and a lighter download</title>
    <link>https://voidhorizon.net/#post-2026-10-28-oct-27-to-28-aim-locked-powers-asteroids-that-bre</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-28-oct-27-to-28-aim-locked-powers-asteroids-that-bre</guid>
    <pubDate>Wed, 28 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;A day of playtest fixes and groundwork.&lt;/p&gt;&lt;p&gt;Power targeting is mouse based now. Hold a power attack that has aim assist, sweep your crosshair over a target, and the shot tracks it when you let go. A thin ring and a small chevron mark the lock, quiet enough not to hide the fight. Tab no longer cycles it.&lt;/p&gt;&lt;p&gt;Asteroids in flight finally take damage from ship and vehicle weapons, by the real damage of each weapon. Hits leave scorch marks where they land, the rock cracks as it weakens, and big ones split into three chunks that drift off and fade.&lt;/p&gt;&lt;p&gt;On the first launch of a new build the boot menu now warms the game&amp;apos;s shaders in a small corner panel with a progress count and a Skip button, and the menu stays usable while it runs. Windowed play got fixed mouse look: turning no longer stops at the window edge, and F1 really toggles the free cursor.&lt;/p&gt;&lt;p&gt;The download shrank by 3.5 GB. Retired character models, duplicate mechs, and test-only vehicle rigs stopped shipping, checked against every save, character and vehicle before they went. The unused voice-over audio is gone too; all the dialogue text stays.&lt;/p&gt;&lt;p&gt;Smaller fixes: route speech no longer draws over the pause menu, Esc opens the pause menu at the helm, the menu says Children of the Ark, the Meat Wagon walker got its texture and an inside cockpit, and quitting from the OS closes cleanly.&lt;/p&gt;&lt;p&gt;Next up is a full damage balance pass so powers and weapons grow on the same line, plus Q cycling through weapons and powers.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 26 to 27: a private beta, codes at the door, and co-op by room code</title>
    <link>https://voidhorizon.net/#post-2026-10-27-oct-26-to-27-a-private-beta-codes-at-the-door-and</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-27-oct-26-to-27-a-private-beta-codes-at-the-door-and</guid>
    <pubDate>Tue, 27 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;This was the day the game got its first outside players. On the 26th I handed private beta codes to five friends, and the build pipeline had to grow up overnight to make that work: a real launcher, codes at the door, and co-op that doesn&amp;apos;t need port forwarding.&lt;/p&gt;&lt;p&gt;The launcher went from a PowerShell one-liner to a proper Windows app with an installer (#842), and then it learned to update itself (#848). A launcher that checks a published record and swaps itself in, never downgrading, means nobody downloads a new exe again. Access codes came next (#854, #856): builds moved to private buckets, and the launcher trades a code for a download through our API. The flow for a tester: run VoidHorizonSetup.exe -&amp;gt; paste a code -&amp;gt; launcher validates it -&amp;gt; streams only the changed objects -&amp;gt; self-updates on every launch. The first real install found a bug in our own Worker: it rate-limited and audited every single file, so a parallel install tripped Cloudflare&amp;apos;s per-key write limit and threw 500s. It now counts once per install session (#858), and the same 2.6 GB install ran with zero errors.&lt;/p&gt;&lt;p&gt;Co-op got room codes over WebRTC (#847): the host gets a six-letter code, friends type it, and the game connects peer to peer with a TURN relay for strict routers, no Tailscale and no port forwarding. The rooms live in a Cloudflare Durable Object per code (#846), because Workers KV took up to 45 seconds to show a join, which stalled every handshake.&lt;/p&gt;&lt;p&gt;Then the beta test happened, and the reports came in fast. &amp;quot;One other player tried to join with the code and it jumped into the game instead of waiting for all the other players.&amp;quot; That became a waiting room where the host presses Start (#873). Leaving a room told friends it was full instead of closed (#863). The install bar froze at 37 percent under a doubled 42 GB total, which was my own launcher bug from that morning (#862). The prologue&amp;apos;s vote panel held everyone in the intro, so new co-op expeditions now start aboard the Ark without it (#863). The room code got Copy and Paste buttons (#864), and the Ark&amp;apos;s command console now reaches the helm through a placeholder hull instead of dumping you on the star chart (#876).&lt;/p&gt;&lt;p&gt;The overnight fix run cleared most of the playtest list: the cryopod door swings outward instead of through you (#866), bullet holes stick to the body they hit (#869), NPCs stop circling you (#870), the chase camera eases through a dodge (#868), and your legs keep walking while you aim and fire (#871). Tab targeting landed for on-foot play with a quiet floor ring and chevron (#877).&lt;/p&gt;&lt;p&gt;One mistake worth recording. The targeting change widened the co-op input frame from 27 to 29 bytes, and the orchestrator merged it after running only the lane&amp;apos;s Godot tests, not the full Rust suite. Older co-op saves stopped loading for about half an hour until #879 taught the loader to read both sizes. The rule now: any lane that touches Rust runs the whole Rust suite on the merged result before it ships. That&amp;apos;s the loop working the way it should, a little later than I&amp;apos;d like.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Playtesting co-op over Tailscale</title>
    <link>https://voidhorizon.net/#post-2026-10-26-playtesting-co-op-over-tailscale</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-26-playtesting-co-op-over-tailscale</guid>
    <pubDate>Mon, 26 Oct 2026 12:00:00 GMT</pubDate>
    <category>GUIDE</category>
    <description>&lt;p&gt;This guide exists because the first private beta test hit the same wall over and over: you want to play together, you don&amp;apos;t want to learn port forwarding. Co-op runs over a direct UDP connection on port 37711, and Tailscale is the simplest answer we found to the NAT problem for a quick playtest. The flow of how this reached the blog: my request that &amp;quot;the in game join will have a help setup&amp;quot; -&amp;gt; a queue task (task-3602) -&amp;gt; a Codex lane (gpt-6-luna) built the in-game help card -&amp;gt; the orchestrator reviewed the render and sent it back over two problems (the panel was translucent, so lobby controls bled through the text, and a line named an internal task id) -&amp;gt; merge (#845) -&amp;gt; this guide (#825) -&amp;gt; feed check and deploy.&lt;/p&gt;&lt;p&gt;The help card is worth explaining because it is the scaffold working as intended: instead of only answering friends in a chat thread, the ? button in the Co-op lobby teaches the host flow (allow the Windows firewall prompt on private networks, UDP 37711), the Tailscale join (the host&amp;apos;s 100.x.y.z address), the LAN join (192.168.x.x), and the one diagnostic that matters, tailscale ping. If tailscale ping works but the game does not connect, the host&amp;apos;s firewall is blocking the port.&lt;/p&gt;&lt;p&gt;The collaboration part worth recording: that same beta test produced concrete reports (&amp;quot;one other player tried to join with the code and it jumped into the game instead of waiting for all the other players&amp;quot;), and those became the copy/paste room code buttons (#864) and the three-player late-join regression (#867). (The next morning the host-start waiting room landed too, #873.) So this guide is already slightly behind the code by the time you read it, which is how a dev blog written straight from the record should run.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Overnight Oct 25 to 26: the prologue returns, real maps, swimming, and an Evil Eye curse</title>
    <link>https://voidhorizon.net/#post-2026-10-26-overnight-oct-25-to-26-the-prologue-returns-real</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-26-overnight-oct-25-to-26-the-prologue-returns-real</guid>
    <pubDate>Mon, 26 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;This was the biggest overnight burn-down of the month, landing between one evening report and my morning email, and it is a good case study of how the whole scaffold works when it is under load. The flow for one of its headline items: my playtest report (&amp;quot;water looks cool but its just a small round puddle, should I be able to swim, we probably need proper streams and rivers&amp;quot;) -&amp;gt; the orchestrator files it as a queue task with the quote attached -&amp;gt; a worker lane branches from main in a git worktree -&amp;gt; ships a shaped pool with tread/stroke/dive and a breath gauge, with living-materials water and the no-shake rule intact (#819) -&amp;gt; pixel gate and my own frame review before it goes live -&amp;gt; blog post, build-log line, and the daily email to me.&lt;/p&gt;&lt;p&gt;The prologue story is the best anecdote of the month for how feedback bends a feature. I had retired the Ark-fall prologue a day earlier after it clashed with the wake-up relay (#791): &amp;quot;I thought the prologue was more modern day, maybe we should retire it if its not working and remove it and stick with tutorial commands for the wake up&amp;quot;. Then I slept on it and reversed myself: &amp;quot;The prologue was a fun idea I had to help make char gen more interesting and engage players unfamiliar with the universe lore... It was a fun part of our character backstories when we first roleplayed the game&amp;quot;. So it came back as an optional, skippable start whose choices become backstory (#813). No one relitigated the first merge; the queue just took the new decision and the second lane superseded the first. That is the advantage of a decision registry with my words attached: a reversal is a decision too, not an embarrassment.&lt;/p&gt;&lt;p&gt;Other items in the burn-down, each with its own little loop: the map now has labeled zoom levels with real system, planet and location charts (#805); Hallyu Sanctuary got a painted concept horizon instead of grey haze, and its frame time actually went down (#806); Evil Eye became a ranked area curse with a gaze cast and curse VFX, grandfathered into old saves (#818); dialogue portraits now render from each character&amp;apos;s actually loaded body (#809); ten quests were rewritten in plain language as a sample after my report that one quest &amp;quot;reads like jibberish&amp;quot; (#815); and a text sweep took player-visible em dashes from 2,066 to zero with a runtime check guarding it (#812). Even the botched parts are in the record: the quest-reach lane branched before the em-dash sweep merged and silently reverted two of its fixes, which the gate caught on main, and a follow-up restored them (#817). Orchestrator, lanes in worktrees, typed queue evidence, a judge that scores against concepts, and me steering between overnight runs: that is the whole system, and on a night like this it felt like it was humming.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Overnight Oct 24–25: weapons with their own voice, a forged Council cockpit, faster builds</title>
    <link>https://voidhorizon.net/#post-2026-10-25-overnight-oct-24-25-weapons-with-their-own-voice</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-25-overnight-oct-24-25-weapons-with-their-own-voice</guid>
    <pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;The headline of this overnight run started from one sentence of mine: &amp;quot;I felt all weapon fire was too generic.&amp;quot; From that, task-3505 split into slices and the second one gave every one of the 39 weapons its own fire identity: a voice, muzzle, trail and beam, with reloading hands seated at the measured palm (#721). The technique is worth explaining because it is our answer to hand-authored audio at catalog scale. The flow: weapon catalog + starship weapon library -&amp;gt; art-gen/sfx/weapon_identity.py derives each weapon&amp;apos;s parameters -&amp;gt; a committed manifest -&amp;gt; OGGs rebuilt by ensure-export-sfx.sh at export time (never committed as binaries, per the no-binary-assets rule) -&amp;gt; pixel gates on the beam cores -&amp;gt; the orchestrator reviews the renders before merge. Co-op seats hear and see remote fire too.&lt;/p&gt;&lt;p&gt;The Council cockpit in the same run (#738, #744) shows the forge pipeline with all its gates lit. The flow for that one: concept receipt -&amp;gt; six Prism 3.1 parts from hash-pinned per-part drivers (console bank, canopy frame, seat back, side panel, stick, throttle) -&amp;gt; credit reservation before every paid call -&amp;gt; each part through art-gen/aaa_surface_gate.py (base colour, metallic-roughness, normal, emissive from painted lamps) -&amp;gt; assembly replaces the recoloured kit the judge had scored 60/56 against the Council concept -&amp;gt; pass 4 fixes the judge&amp;apos;s four remaining gaps (stick and throttle scaled down and set forward, the dash carried out to the walls, lit side consoles) with no new Prism spend -&amp;gt; the orchestrator&amp;apos;s frame review -&amp;gt; merge. Wrong turns are part of the story: the forge only happened because the recoloured kit lost to the concept, and pass 4&amp;apos;s fixes came from the judge&amp;apos;s notes rather than more art credits.&lt;/p&gt;&lt;p&gt;Underneath the gameplay, the run also improved our own machinery, which is what lets an overnight burn like this happen at all. A test census counted 169 Rust test binaries (0 failing over two runs) and 894 Godot tests, of which 292 fail or hang in both passes; phase 1 then folded the 169 binaries into 49 and the lean gate rebuild fell from 107 to 31 seconds (#739); Cargo target dirs went per-worktree after shared artifacts produced both false reds and false greens across lanes (#785); the orchestrator&amp;apos;s own handoff files record what merged and what is queued (#781). And one crash fix matters more than its size: streamed ship hulls built collision off the main thread and called into gdext, which is undefined behaviour; the fix hands every worker-built model&amp;apos;s collision to the main thread at hand-off (#745). The system did exactly what it is for: my report, a task, a lane, a gate, a fix, a blog line, all before I finished my coffee.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 23–24: weapons with real fire modes, stealth, every quest checked, and releases without the bake</title>
    <link>https://voidhorizon.net/#post-2026-10-24-oct-23-24-weapons-with-real-fire-modes-stealth-ev</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-24-oct-23-24-weapons-with-real-fire-modes-stealth-ev</guid>
    <pubDate>Sat, 24 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Two things make this run worth writing up in detail: the release pipeline finally dropped its bake, and the quest sweep became a release gate. I had asked &amp;quot;what would it take to migrate to this and kill bake times? ... Our iterations need to get down as tiny as possible to improve not only dev time now but bug fixing after launch&amp;quot; (&amp;quot;do it&amp;quot;) after staring at 537-second exports, and the answer is in the PR chain: cheap conservative per-asset colliders computed in Rust, a seeded location layout that replays unchanged seeds, and dressing as data instead of baked geometry (#678, #684). Release stage timings fell from 537 s to 120 s, then further; the first bake-free release went start to live in 26 minutes, and by the end of the run a code-only player update installs in 14 seconds (#707, #691, #718). The flow of a release now: merge -&amp;gt; release-on-merge on the host game lock -&amp;gt; export -&amp;gt; stage runtime closure -&amp;gt; Windows boot test with retry on memory shortfall -&amp;gt; scenario and quest gates -&amp;gt; publish to R2 -&amp;gt; the launcher picks it up. Every stage prints its own timing into the build log, which is how we find the next thing to cut.&lt;/p&gt;&lt;p&gt;The quest sweep is the other half, and it came straight from my steering: &amp;quot;test that all quests are functioning in game&amp;quot; plus &amp;quot;I def want full scenario and game interaction coverage to catch things like broken quests before I get to it with playtesting&amp;quot;. The harness drives all 184 quests through the production quest runner with a keyboard-driven witness, 439 node visits, rewards checked into both wallets (#661), then a live UI sweep that logged 99 failures on the release checkout, 35 real ones specced one by one (#682), then all 184 green with the sweep wired in as the release gate (#685). Releases had been failing after export with a missing sweep executable until this landed, which is exactly what a gate is for. That is the pattern I want everywhere: my playtest instinct turned into a deterministic gate so it catches regressions while I sleep.&lt;/p&gt;&lt;p&gt;Gameplay in the run: burst, full-auto, charge and beam fire modes with tier-balanced magazines and full stat readouts (#676), a stealth stance where Infiltration rank decides detection and co-op syncs it in the existing 27-byte input frame (#680), ship roles for Life Creation and Warp Control (#670), and an overnight batch of transition fixes. The collaboration texture of these posts is my bug reports becoming tasks verbatim: &amp;quot;the intro ark looked a bit like a junkyard&amp;quot; became the ordered cryo hall (#542), and the seed solver got bumped to v5 mid-run because a fingerprint change refused to bake releases (#623), which is exactly the kind of boring breakage a release gate is supposed to catch loudly instead of quietly shipping something wrong.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 22–23: two weapon sets, ships you can lose, safer saves</title>
    <link>https://voidhorizon.net/#post-2026-10-23-oct-22-23-two-weapon-sets-ships-you-can-lose-safe</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-23-oct-22-23-two-weapon-sets-ships-you-can-lose-safe</guid>
    <pubDate>Fri, 23 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;This run is where character customization got real: a ranged set and a melee set on the equipment sheet, Q cycling between them, F drawing the stowed blade so the swing uses it, and power mode putting the cast on the mouse (#637, #638, #639, #640). The technique underneath is boring in the good way: the loadout is data on the sheet, the sim consumes a deterministic slot list, and every change rides the same gate pipeline. The whole thing started from my question: &amp;quot;you can&amp;apos;t use left click/right click mouse for either and toggle between power, ranged, or melee configurations?&amp;quot; (#638). Per-weapon identity from the previous night&amp;apos;s run (#721) meant each of the 39 weapons already sounded and looked like itself, so cycling finally felt like swapping gear instead of relabelling the same gun.&lt;/p&gt;&lt;p&gt;Ship loss arrived too, and it is a small case study in rulebook fidelity. Hold Eject to bail out before your ship dies (#625); lose the ship and it destroys the pilot, ghost if the body goes, eject otherwise (#624). Ghosts travel as normal but can&amp;apos;t pilot, flying slowly per the COTA rulebook: a ghost rises and sinks at 1.5 m/s (a quarter of a powered flier), and drifts aloft at half walking speed (#602, #604). The flow here is a design-lead pattern: the rulebook text is quoted in the task, the lane implements it in sim-core so it is deterministic, the Godot layer presents it, and tests ride the same route a player would.&lt;/p&gt;&lt;p&gt;Saves got the treatment I keep asking for, because old saves are sacred: deleting the save you are playing never touches the live game (#628), a confirmation dialog guards delete and replace (#620), and no immortal ever plays or saves without powers (#630). Also conjuring got an economy: a sale-value cooldown and a stamina cost (#635), so Matter Creation stopped being infinite money, which I flagged after my own playtest. And a tiny fix with a story: Rhea Calloway&amp;apos;s arms no longer knot, because the Prism bake now spreads forearm roll across the twist bone (#595, #600); the full limb split actually worsened the visible-knee gate, so the no-regression rule refused it and we shipped arms-only on evidence. That is the visual self-review loop doing its job against my own impatience: I would have shipped the big fix; the gate made us prove it first.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Overnight: ghosts that travel, gear you go back for, third person again</title>
    <link>https://voidhorizon.net/#post-2026-10-22-overnight-ghosts-that-travel-gear-you-go-back-for</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-22-overnight-ghosts-that-travel-gear-you-go-back-for</guid>
    <pubDate>Thu, 22 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Ghost form spent one night becoming a real system, and the way it happened is worth the explanation. I set the direction with three rulebook-anchored rulings: &amp;quot;ghost form can reform a new body anywhere&amp;quot;, &amp;quot;ghosts can all fly slowly&amp;quot;, and &amp;quot;immortals can travel in ghost form as normal but can&amp;apos;t physically pilot&amp;quot; (#601, #602, #604). The lanes then implemented them in the deterministic sim (combat.rs carries the ghost across scene rebuilds so a travel does not hand you a fresh full-HP fight) and the engine layer presents it. Death gear caches came the same night: when an immortal dies, every held item goes into a lootable case where they fell, the case persists in saves and co-op, and any seat can recover it (#605, #606). Third person came back as the default after I said the fps view &amp;quot;needs work and limits environment context while moving&amp;quot; and &amp;quot;once you leave cryo it should swap to third person&amp;quot; (#608), with a one-time reset so existing installs get the change without breaking anyone&amp;apos;s saved preference.&lt;/p&gt;&lt;p&gt;The joint-audit part of this night is my favourite process story of the month. I sent a screenshot: &amp;quot;thought I saw an arm twisted into a knot&amp;quot; and asked to &amp;quot;look for any model bends with non physical surfaces&amp;quot;. The lane built joint_audit.py, screened 286 release bodies against 38 embedded clips (10,868 pairs, 537,108 poses), and the findings confirmed the ~180 degree arm and leg flips, peaks clustered at a shared retarget rotation flip rather than per-clip authoring (#592); a one-channel forearm twist correction was tried and rejected along the way, since it fixed the elbow and broke the shoulder seam. The donor clips themselves carry the twist, so the fix went into the Prism bake, spreading forearm roll across the twist bone (#595), with a grandfather rule (#598, my words: &amp;quot;Grandfather unchanged bodies&amp;quot;): a body denied only for the newer animation review keeps its active selection while its exact bytes are unchanged, so the twist-fixed Rhea could ship while the full-cast review waits for resources. The flow: owner screenshot -&amp;gt; queue task -&amp;gt; audit script -&amp;gt; evidence -&amp;gt; bake fix -&amp;gt; no-regression gate -&amp;gt; Fable judge re-verdict -&amp;gt; release. Zero new art credits; the whole fix came from measurement.&lt;/p&gt;&lt;p&gt;Also that night: server-authority sessions ran in the real game with animated remote players and migrating saves (#562, #571), and the crash-report tooling grew. I want the dev log to keep carrying these small process beats, because they are the reason the big features land: the joint audit found the knot before any player did, and that is the difference between a scaffold and a hope.&lt;/p&gt;</description>
  </item>
  <item>
    <title>A minute inside Void Horizon</title>
    <link>https://voidhorizon.net/#post-2026-10-21-a-minute-inside-void-horizon</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-21-a-minute-inside-void-horizon</guid>
    <pubDate>Wed, 21 Oct 2026 12:00:00 GMT</pubDate>
    <category>VIDEO</category>
    <description>&lt;p&gt;The 61.7-second teaser is the first cut I would send to a stranger, and the making of it is a nice tour of our capture stack. I asked for &amp;quot;a new teaser video showing various gameplay / vehicles / powers / quests / scenes&amp;quot;, placed near the hero (#590). The flow: the capture harness drives the real game (MovieWriter capture mode in trailer_capture.gd) through 16 shots of in-engine footage: the Ark&amp;apos;s cryo hall with quest guidance, the Muster Deck hall, quest-giver dialogue, gBay market lamps, a tank driving, cockpit view through the new glass, ship flight, and fleet combat over a starfield -&amp;gt; cut to 1080p with a score built from the game&amp;apos;s own synth -&amp;gt; publish with a provenance record -&amp;gt; embed in the landing hero (#590) -&amp;gt; preview verification -&amp;gt; the orchestrator reviews the v1 and v2 contact sheets before anything goes public.&lt;/p&gt;&lt;p&gt;The second cut existed because the first one was held in review with named problems: flat navy space, floating cryo slabs, a missing range shot. The floating cryo light strips over the cryo banks were fixed the same week (#579). That feedback loop, watch the render, name the shot, re-capture, is the same loop every gameplay clip in this blog goes through, and the clips tag carries an HLS player so you can watch them where the story is told instead of a thumbnail.&lt;/p&gt;&lt;p&gt;What the video is for, in one paragraph: a dev log full of screenshots describes a game; a minute of real footage commits us to it. Every shot in this teaser is reachable in the current build, which is a promise we keep by keeping the release pipeline verified. When the next cut lands it will come with the same provenance rule: only in-engine footage, no mockups, and my name on the approval.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Overnight: a rebuilt Muster Deck, a real gBay market, a cleaner menu and windows you can see out of</title>
    <link>https://voidhorizon.net/#post-2026-10-21-overnight-a-rebuilt-muster-deck-a-real-gbay-marke</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-21-overnight-a-rebuilt-muster-deck-a-real-gbay-marke</guid>
    <pubDate>Wed, 21 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;This overnight is the month&amp;apos;s best example of steering one system across many lanes. The Muster Deck went from a bare hall to a vaulted black-and-gold space built from six forged components (#569), with a lighting pass of gold bay fixtures and a wet reflective deck (#573); the gBay Exchange got real stalls, lamp strings, an armillary facade and an arrival arch (#577); and the start menu came down from 24 entries to eight top-level choices a new player can read, with developer tools hidden behind Settings (#572, after my ask: &amp;quot;review the start of game menu ... what are all the rest for can we clean it up some?&amp;quot;). Each scene follows the same pipeline: concept set -&amp;gt; per-part Prism drivers with credit reservations -&amp;gt; component library registration -&amp;gt; scene assembly with budgets per piece -&amp;gt; Fable judge against the concept -&amp;gt; my review -&amp;gt; merge, with the rendered queue view tracking every task so nothing goes stale.&lt;/p&gt;&lt;p&gt;The process anecdote is the concept-block review. Twenty concept sets had been blocked under the older review rule; re-reviewed one by one under the 2026-10-21 rule, all twenty became usable references with their old failures kept as builder notes (#574). That only works because concepts carry receipts, and the judge scores against the set, not a vague vibe. The vehicle cockpit glass (#575) came from my one-line ruling that &amp;quot;all cockpits and vehicle internals need transparent windows to see out of into the environment&amp;quot;, and it shipped as one shared canopy material with clear interior views for ships, tanks and mechs. The Ark lighting now flickers until repaired (#582), which is the kind of small system beat that makes a place feel lived in, and it rides the same no-shake, no-freeze rules as everything else.&lt;/p&gt;&lt;p&gt;Server authority reached a milestone the same night: hosting from the real menu works end to end, reconnect keeps your character, and saves no longer saturate (#562), with slice C adding predicted movement and server correction (#560). The recurring missions system turned the 49 unused scenes into contract locations on the galaxy map (#555), so scenes we built for the campaign now pay rent. Overnight runs like this one are only possible because every lane runs in its own worktree, hydrates by hardlink, gates its own diff, and merges back locally the moment it finishes, so main is always one review away from being playable.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 20: a server that owns the world, quests that explain themselves, and tendrils that coil</title>
    <link>https://voidhorizon.net/#post-2026-10-20-oct-20-a-server-that-owns-the-world-quests-that-e</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-20-oct-20-a-server-that-owns-the-world-quests-that-e</guid>
    <pubDate>Tue, 20 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;The multiplayer decision of the project landed on October 20. &amp;quot;Lets go fully into the server state owned solution, but I still want there to be local player owned co-op. Ie I can host a server for 100-200 players or I can host it for my 8 friends&amp;quot; (#537). The research came first that morning (#533): today&amp;apos;s co-op is lockstep with 8 declared seats (on a dedicated host, 7 remote humans), and the recommendation was to keep lockstep for launch and build a separate server-authoritative path. The design, PRD and plan went in the same day, with the v10 wire protocol frozen in a new server-contract crate: versioned DTOs, limits, field order, engine-independent ports, 7 contract tests, and nothing claimed reachable yet. The plan split the work into four slices with a 60-hour budget.&lt;/p&gt;&lt;p&gt;All four slices merged the same day. Slice A (#546) is the server-owned canonical simulation: stable actor IDs decoupled from seats, one shared combat roster per location instance, bounded inputs, receipt-gated quest and supply mutations, and versioned saves with replay. Its proof test is the one that matters: a silent client no longer stalls the world for forty authoritative movement and hit ticks, which under the old v9 lockstep it did, and the test was written red first against that barrier. Slice B (#556) puts it on real sockets: per-peer admission with single-use expiring nonces, area-of-interest projection, and back-pressure through bounded queues so no tick ever waits for a socket. Slice D (#558) is hosting: a listen server as a local child process or a headless dedicated server, an fsynced checksummed world journal, a one-time fingerprinted import of existing saves, and measured load at 8, 32 and 200 synthetic clients. Slice C (#560) is what the player feels: local movement predicted with the same shared rules the server uses, corrected and replayed on divergence, remote players interpolated, reachable as a labelled diagnostic route. The default v9 co-op is untouched throughout.&lt;/p&gt;&lt;p&gt;My playtest had stalled in the opening quests. &amp;quot;I got stuck in the early quests completely confused as to where to go and why&amp;quot;, and &amp;quot;we need more context, a bit of hand holding in the UI to guide players to quest completion with visuals and importantly context: why are they tasked to do the things in the quest and how will it benefit them, all quests&amp;quot; (#540). Every quest and step in the scenario now carries an in-world why and benefit plus an optional on-screen hint: 185 quests, 646 steps. The waking instruction was rewritten to explain why you were in stasis and what the relay is for. A compact edge card appears on quest start, the Story Journal (added earlier in the week, #424) shows each step&amp;apos;s why and benefit, and after about 45 seconds idle the hint appears and the waypoint pulses. Quest speech moved to a bottom-edge subtitle strip and quest objects get a pulsing rim instead of floating text (#531), with a scripted walkthrough of the whole ark quest as the gate. The bar I set the day before was Witcher 3 and Cyberpunk 2077 presentation versus &amp;quot;sketchy&amp;quot;.&lt;/p&gt;&lt;p&gt;Warp got real tendrils. I asked to &amp;quot;create a proper model for them&amp;quot; and &amp;quot;maybe they can have curls and animations for tendril motion?&amp;quot; (#539). One Prism forge from the promoted concept: 18,774 triangles, a 24-bone chain, full PBR, with veins drawn by the procedural fissure shader I liked earlier. The motion set is procedural and deterministic: emerge unfurls from a coil, idle curls with flicking tips, coil-back between attacks, a lash with windup and snap, a grab that wraps a full turn around the target before pulling, and a retract that slithers back as the rift closes. Scenes with more than 2 portals switch to a GPU idle path; four portals cost a median 3.56 ms. The parry became an aperture too, from a playtest note asking if it &amp;quot;should be a multidimensional disk that opens to another universe?&amp;quot; (#520): raising the guard opens a razor-thin disk 0.6 m ahead of the hand, showing floating spires and violet swirl inside a torn magenta rim. The concept judge still flags fine vein detail on the tendrils, and the PR says so plainly rather than claiming a pass.&lt;/p&gt;&lt;p&gt;Forty-nine scenes we had built as world flavour became playable destinations (#555). I wanted them kept &amp;quot;as flavor/world building/future options... recurring mission locations&amp;quot;, connected to the galaxy. Each now has an exact address in the scenario&amp;apos;s star systems so it shows on the galactic chart from the start, and a Contract Uplink in Comms offers rotating contracts voiced by scenario characters: a front skirmish, belt recorder salvage, a coolant courier, each resolvable end to end with a once-only reward. The next slice went in the same night (#557): jumps can be intercepted by ambushes or interrupted by ship malfunctions you explore and repair, one seeded risk roll per committed trip, never during story beats.&lt;/p&gt;&lt;p&gt;Under all of it, delivery changed. &amp;quot;I want continuous integration with our main and deployed with landing page updates, as well as continuous updates to our remote executable and local exec&amp;quot; (#530). The bake is incremental now (per-location receipts, so a merge no longer triggers a full rebake of 353 locations that took hours), scripts/continuous-deliver.sh drafts the landing log entry from the PR, deploys, verifies in a browser and requests the boot-gated Windows publisher, and release-lag.sh alerts when the oldest undelivered merge is over 2 hours old. Jump and dock arrivals got about 30% faster the same day, with a loading card that shows real staged progress instead of looking hung (#521, after my playtest complaint that it felt frozen).&lt;/p&gt;&lt;p&gt;That&amp;apos;s it. One day, four slices of server, 646 quest steps with reasons, and a tendril that coils.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Overnight Oct 18-19: hits that throw you, strings that chain, and the clock stays at 1.0</title>
    <link>https://voidhorizon.net/#post-2026-10-19-overnight-oct-18-19-hits-that-throw-you-strings-t</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-19-overnight-oct-18-19-hits-that-throw-you-strings-t</guid>
    <pubDate>Mon, 19 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Two nights of playtesting turned into the most combat-feel work the game has had. Attack strings landed first, the evening of October 18 (#467). I had asked for &amp;quot;light light light light, heavy heavy heavy or light light heavy. Just watched Street Fighter in the theater and it builds up so much hype, and is entertaining.&amp;quot; Now unarmed and melee weapons chain: LLLL ends in a flurry stagger, L H in a guard break, L L H in a launcher, H H H in a knockdown, with named finishers per weapon class (Skyward Knuckle for unarmed, Rising Crescent for blades, Titan&amp;apos;s Toll for mauls), an N HIT counter and a coloured finisher callout. The timing is forgiving on purpose: a 6-tick input buffer plus at least 8 ticks of combo window after every recovery, so slow weapons still chain. Bosses only stagger, elites get knocked down instead of launched, and a 1.5 s re-launch cooldown stops stunlocks.&lt;/p&gt;&lt;p&gt;The music follows the fight now (#468). Six faction and biome combat themes, each with 8 generated stems (pulse, bass, harmony, dark minor with heartbeat, two leads, hype, boss motif), driven by an 8-state CombatFlow machine fed by real sim signals: the strings&amp;apos; flow events, hostile count, player HP and the highest enemy rank. Level changes land on the beat or bar grid, and finisher stingers land on the next eighth, worst case 227 ms after the hit. All synthesized, nothing licensed.&lt;/p&gt;&lt;p&gt;Big hits throw you now. I asked: &amp;quot;Take a big hit, get knocked sidewise into a wall and crack it... this should happen for higher damage attacks&amp;quot; (#472). Severity is damage divided by the target&amp;apos;s toughness; below 0.8 a hit only stumbles, above it the body flies 3 + 4 x (severity - 0.8) metres, capped at 9. Direction comes from the swing: sweeps sideways, thrusts and bashes straight back, uppercuts up. The thrown body stops at the first wall, prop or pillar and both sides take damage, and walls crack in stages: hairline at 20% of their hit points lost, heavy at 50%, broken at 100%. The player can be thrown too, by a brute&amp;apos;s blow or a big shell.&lt;/p&gt;&lt;p&gt;I followed up that &amp;quot;walls should have hp and not instantly break, same with floors&amp;quot; (#476). One impact moves a wall at most one crack stage, so an intact wall needs three slams, and a broken wall opens a 2.4 m gap around the impact instead of deleting the whole segment. The shell redraws walls from the sim&amp;apos;s wall list, so the drawn gap is exactly the walkable gap, live and after a reload. Floors crack under landing bodies (#477), plain light swings stagger while heavies and finishers throw (#478), and breaches get real forged rubble (#479).&lt;/p&gt;&lt;p&gt;The next morning I cut two things the October combat-feel brief had asked for. &amp;quot;Remove the slow motion finishers, we can keep combat fluid and quick and consistent for multiplayer&amp;quot;, and &amp;quot;this isn&amp;apos;t a 1v1 fighting game with slow motion finishers, its a multiplayer future RPG sim&amp;quot; (#483). The last-kill slow-mo (0.3x for 0.6 s) and the first-draw bullet-time (0.35x for 0.9 s) are gone; nothing moves Engine.time_scale off 1.0 during play, and a test asserts it. Same with floating text: &amp;quot;it should only be tool tips and logs not floating numbers all over&amp;quot; (#484). The campaign now shows zero floating combat text; the foe under your crosshair gets one line from the sim (&amp;quot;Tough · 210 / 210 HP&amp;quot;), and the Combat Sandbox keeps its hover readouts as a tuning tool. Both decisions went into vision.md as game direction: real-time combat identical solo and in co-op, weight over spectacle.&lt;/p&gt;&lt;p&gt;Performance got its own pass (#488) after I said optimization first, and retired the per-frame grip solver (&amp;quot;retire that crazy concept&amp;quot;; grips are resolved once at equip now, worth 9.4 ms a frame). On the Windows release build at 2560x1440: sandbox-11 p50 went from 22.69 to 7.66 ms, firefight-50 from 16.41 to 9.19, and hitches dropped from about a thousand to a couple hundred. Still over the frame budget, and the profiler says the next worst frames are shader-pipeline compiles. The frame budget meter is always on now, so you can see where the frame goes without slowing the game.&lt;/p&gt;&lt;p&gt;The installer got attention too. My first install on a wired 800 Mbps fibre PC ran at 7.5 MB/s, about six minutes for the 2.5 GB build (#482). The cause is neat: chunks average 140 KB and each cold chunk waits about 150 ms on a CDN miss, so with 8 downloads in flight the bottleneck was latency, not bandwidth. 64 in flight took the same host&amp;apos;s cold-chunk throughput to 59.8 MB/s (15.2 at 8, 34.4 at 32). The installer also prints progress through every phase now and hashes each object once instead of three times (#486), and every release ships the installers and launcher from now on (#485).&lt;/p&gt;&lt;p&gt;That&amp;apos;s it. The theme of the night: the game should feel like a fight, not a cutscene.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 17: every power at the awakening, wings on command, and a bioship with sap in its veins</title>
    <link>https://voidhorizon.net/#post-2026-10-17-oct-17-every-power-at-the-awakening-wings-on-comm</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-17-oct-17-every-power-at-the-awakening-wings-on-comm</guid>
    <pubDate>Sat, 17 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Since the awakening slice shipped on August 12, the list of powers you could pick at character creation had been frozen at 7. Shapeshift, Warp Control, Life Creation and Illusion were fully playable and still unpickable, which is a strange thing to ship when the shapeshifter is the game&amp;apos;s best poster child. #430 opens the awakening to all 11 playable powers. The list grows append-only (the new powers sit at indexes 7-10) and saves store powers by code, so nothing old breaks; tests pin the first seven indexes and prove every old kit name still resolves to the same slot. The live test cycles Shapeshift&amp;apos;s forms and checks Warp offers summon:ship and Life Creation summon:ally.&lt;/p&gt;&lt;p&gt;Shapeshift got its middle stage. I had asked that &amp;quot;shapeshifters should be able to fly like grav or energy control&amp;quot; (#427). The answer is a ladder: on foot at level 1, grown wings at level 2, the Bioship as the level 4 capstone. The wings are not a spell effect, they are a forged asset: a Codex concept in the bioship&amp;apos;s style (olive leaf membranes, bark ribs, teal sap veins), one Prism forge (40 credits), 1.45 million triangles cut to 60k with an emissive vein map, mirrored and mounted on the upper back, flapped by code on the climb, gliding level, folded on landing. grants_flight now includes a winged Shapeshifter, so air-combat evasion, companion rules and hostile-ship targeting treat them exactly like Energy and Gravity fliers. There is no second code path, which is the point. The fit check measures wing-to-body distance: a 2.7 cm gap climbing, and a deliberately sunk wing root is caught at -8.6 cm.&lt;/p&gt;&lt;p&gt;One known gap in that PR read &amp;quot;the body uses the standing pose while flying&amp;quot;, and it was closed the same day (#435). Every flier had been a levitating mannequin, and it was the number one trailer blocker for the wings shot. Instead of baking new clips, the lane used the project&amp;apos;s existing post-clip skeleton layering, the same trick as the climb and cast layers: a state model in flight_pose.gd driven by real flight signals (altitude, speed, climb rate, turn rate) with spring-blended targets, then two-bone IK for hands and feet, pointed feet, a head lift, pelvis pitch into the travel direction and roll into turns. States: take-off, hover, cruise at about 60 degrees, fast flight at about 80 with arms swept back, climb, dive, bank up to about 38 degrees, and a landing flare. Energy, Gravity and Warp share the superhero set; the rocket pack flies more upright; power armour responds slower with a wider stance.&lt;/p&gt;&lt;p&gt;The Bioship itself graduated from stand-in to forged hull (#421). A Prism 3.1 forge from the locked stage-2 concept, then a processing script that bakes ambient occlusion, turns the teal sap from mirror-metal into an emissive glow, grades the shell toward the concept&amp;apos;s olive, and cuts the dorsal and belly bud-pods out as separate pivoting parts with the cuts capped. The locked compression recipe at 0.4 decimation keeps the fin membranes at 114k triangles, 6.1 MB. A bud that can&amp;apos;t reach its target returns to rest, so the dorsal pod stays idle like the concept. The polish pass the same evening (#437) added a leaf-wing pair built from the forged ventral blades (no forge credits spent), three stern vents with a soft glow instead of hard plumes, and a bombard stream with a thin hot core, forked lightning and a teal sap splash that now starts exactly at the pod&amp;apos;s mouth: the capture prints the gap per pod and it reads 0 px for both. A shader bug died too: a smoothstep call with its two edges reversed, which GLSL leaves undefined.&lt;/p&gt;&lt;p&gt;Matter Creation, &amp;quot;conjure almost anything&amp;quot;, needed to look the part for the trailer (#422). The audit found every conjure entry point (gear craft, ship mods, the android pet, the vessel build) was a menu button with no effect. Now they all play one effect: over about 0.9 s motes spiral in, a hologram scan plane assembles the item, then a rim flash, a ring and a light pulse. There is a new conjurable as well: deployable cover (barricade, blast barrier, bunker wall at Matter Creation levels 1, 2 and 3), up to 4 standing at once for 90 seconds each. Known gap, queued: cover is not synced in co-op yet, so your friends don&amp;apos;t see your barricade.&lt;/p&gt;&lt;p&gt;The thread through all of it: the awakening is the moment a player chooses a fantasy, and every fantasy on the list now has a body, a flight plan or a light show behind it.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 16: a vibrant look, levels that arrive on their own, and gear that remembers its maker</title>
    <link>https://voidhorizon.net/#post-2026-10-16-oct-16-a-vibrant-look-levels-that-arrive-on-their</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-16-oct-16-a-vibrant-look-levels-that-arrive-on-their</guid>
    <pubDate>Fri, 16 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;The look of the game had been drifting grey, so on October 16 I asked for &amp;quot;more color contrast and more vibrant colors in the hero and scenes... make sure that rolls out to all our scenes/game stuff&amp;quot; (#406). The lane answered with a shared grade instead of forty one-off tweaks: one module, godot/scene_look.gd, that sets an ACES tonemapper, exposure 1.15, contrast 1.1 with a curve that lifts shadows, and saturation 1.6 (character previews get a gentler 1.25). It applies to every on-foot location, space, flight and starship combat, co-op views, the character creator and inventory previews. Scenes that were authored by hand keep their own tonemapper and only gain saturation, because switching them to ACES bleached their emissives. The flow: shared grade -&amp;gt; every environment and view -&amp;gt; 16-scene look guard -&amp;gt; fail on dark or flat -&amp;gt; per-scene vibrance passes under the guard.&lt;/p&gt;&lt;p&gt;The guard is the part worth stealing. scripts/scene-look-guard.sh renders a 16-scene sample and fails if any scene&amp;apos;s 10th-percentile luma drops more than 20% or its top-5% saturation drops more than 25%, against a committed baseline. It needs the GPU and the host game lock, so it is not in CI; it runs when a look change ships. The orchestrator&amp;apos;s first review caught real problems the blanket grade had caused: crushed shadows in Ember Wastes (10th-percentile luma 0.059 to 0.082 after the fix) and Aotearoa (0.046 to 0.083), and bleached Hive-Spire pods (bright-pixel saturation 0.571 to 0.657). Then the per-scene passes started: batch 1 (#408) tuned 24 scenes with coloured lights and saturated atmospheres, and Bone Orchard went from 0.34 to 0.98 bright-pixel saturation. The note on that batch names the real remaining gap: geometry (blockout scenes), not colour.&lt;/p&gt;&lt;p&gt;Progression changed shape the same day. I asked &amp;quot;make IPL go up directly with total xp earned? and have level ups auto heal/renew stamina&amp;quot; (#387). Now IPL rises automatically when lifetime XP crosses the cumulative curve (IPL 30 at 1,944 XP, 50 at 7,144, 65 at 13,144, 70 at 15,544, about 81 at the full ~21,950 campaign pool), spent XP buys only attributes, powers, subpowers and skills, and every level-up refills HP and stamina. I also said &amp;quot;skip the rebalance&amp;quot; on XP costs, so the lane balanced from the other side: the Ascendant boss was raised to IPL 75 and zones got 2-3 extra minions. Old saves migrate cleanly: lifetime XP is computed as the cumulative cost of the current IPL plus unspent XP.&lt;/p&gt;&lt;p&gt;A number that ticks up quietly is easy to miss, so I asked for &amp;quot;an epic level up/xp spend animation, maybe just for IPL&amp;quot; (#397). The lane built it from a concept storyboard first (backed up to R2, never in git): out of combat your body wraps in rising spirals in your primary power&amp;apos;s colour while a reward card calls the unlocks (attribute and power cap 21 -&amp;gt; 22, attack speed +5%, subpower slots 3 -&amp;gt; 4); in combat it is a one-second flourish that never locks input. The ENet co-op probe earned its keep during this one: it caught reward_sandbox_kills updating the character sheet but not the corresponding fight, which broke host admission when sandbox XP raised IPL.&lt;/p&gt;&lt;p&gt;Crafted gear got its own mark (#402, an owner request from October 7 that crafted gear carry a small crafting-skill bonus). A crafted item is stamped at creation with +1% per level of crafting skill plus Matter Creation, capped at +15%, or +30% for a Matter Creationist. Stamped at creation matters: the bonus multiplies the item&amp;apos;s stats and stacks with the Quality tier and Master-Crafted, and it does not change when the crafter&amp;apos;s skill later does. Looted and bought items carry 0. The save-code format gained an optional fourth field written only when non-zero, so every old item code stays byte-identical.&lt;/p&gt;&lt;p&gt;That&amp;apos;s the shape of a good day: one aesthetic push, one economy fix, one moment of theatre, all through the same loop of owner request, queue task, lane, gates, orchestrator review.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Power concepts: casts, attacks and transformations</title>
    <link>https://voidhorizon.net/#post-2026-10-15-power-concepts-casts-attacks-and-transformations</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-15-power-concepts-casts-attacks-and-transformations</guid>
    <pubDate>Thu, 15 Oct 2026 12:00:00 GMT</pubDate>
    <category>CONCEPT ART</category>
    <description>&lt;p&gt;The Power concepts gallery is the visual contract for a big slice of gameplay, and its process is worth explaining because the gallery never ships a picture we cannot trace back to a concept. I asked for the background-removed power concepts to be put where they can be browsed (#366), and the lane delivered them data-driven: 13 powers with 4 labeled panels each (charge, release, effect, aura), 104 WebP images published to R2, thumbnails lazy-loaded and full-size on click, and web/power-concepts.json validated by a test so new concept rows need no code change. The flow: the power catalog -&amp;gt; prompt batch from the catalog -&amp;gt; generated candidate sets -&amp;gt; background removal and labeled crops -&amp;gt; lane review, every image opened and judged against the set&amp;apos;s brief -&amp;gt; approved rows publish to the Power gallery -&amp;gt; any gap is queued for a re-gen with the reviewer&amp;apos;s notes attached (#365, #366).&lt;/p&gt;&lt;p&gt;#368 then commits the catalog that drives the next stage: per-attack, special, transformation and infused-weapon concepts, so a weapon powered by a power carries the same visual lineage as the power itself (#369). The gallery records what a power&amp;apos;s cast and attacks should look like in motion, which is the reference the later FX work is reviewed against.&lt;/p&gt;&lt;p&gt;Why this matters: the gallery is not concept art for its own sake. It feeds the attack effects and transformations directly, and every published row keeps its provenance, so when a power&amp;apos;s effects get built the reviewers start from the same pictures the gallery approved. Wrong turns are kept in the record too, as builder notes, so the next generation does not repeat them.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 14: loading drops from minutes to seconds, pets join the fight, and new sandbox modes</title>
    <link>https://voidhorizon.net/#post-2026-10-14-oct-14-loading-drops-from-minutes-to-seconds-pets</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-14-oct-14-loading-drops-from-minutes-to-seconds-pets</guid>
    <pubDate>Wed, 14 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Nineteen changes in a day, and the through-line is a single instruction I gave that morning: &amp;quot;minimize/remove all loading, the Palworld-style &amp;apos;always loaded&amp;apos; feel&amp;quot; (#349). The zero-load lanes answered with measurements instead of promises. The profile of the 66-second freeze named synchronous walk construction as the villain, with collision baking inside it (#349). The flow of the fix: a load-time harness that measures time-to-interactive and longest frame gap -&amp;gt; bounded dependency-graph prefetch per entry point -&amp;gt; asset tiers streamed on worker threads with main-thread handoffs and debug assertions everywhere a loader touches shared state (#345, #357) -&amp;gt; cockpit props warmed while you walk to your ship, hatch opening only when ready, boarding stall 72 ms to 11 ms (#346) -&amp;gt; ship prebuilt cache seeds shipped inside the PCK for all 339 locations, boot 90 s to 22 s and the Shuttle Bay to 4 (#362) -&amp;gt; a repeatable harness that guards the number forever.&lt;/p&gt;&lt;p&gt;That last part is the piece I keep coming back to, because it is how the scaffold keeps a win. A change that only a human could verify by playing is a fragile win; a harness that fails when the number slips is a durable one. The thread-safety audit ran the same day after a real crash (#357): a worker-thread notification from a background body load. Every background path got audited, shared material updates now hand off to the main thread, and a churn stress test hammers concurrent body, crowd and ship loads to keep the fix true.&lt;/p&gt;&lt;p&gt;Also that day: companion pets (a Life creature and a Matter android per player, follow, fight, recall, enemies target them, #350), Vehicle and Starship Sandbox modes reusing the existing engines rather than forks (#352), Electrokinesis reaching hulls and starships with a time-to-kill table across IPL tiers that keeps the rule that a high-level immortal can face a Dreadnought (#354), grounded per-foot animation toward my &amp;quot;Witcher 3, Cyberpunk 2077 and Darktide&amp;quot; bar for motion (#358), and a geometry pass that cut drawn primitives 3 to 7 times per preset, High 141M to 35M with no visible loss (#360). One more process beat: the lane hydrator now hardlinks ground textures into every worktree after a lane&amp;apos;s captures showed pure-white ground, so lane renders stay a valid view of the game (#355).&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 13: a streaming launcher, co-op that fights together, and difficulty you control</title>
    <link>https://voidhorizon.net/#post-2026-10-13-oct-13-a-streaming-launcher-co-op-that-fights-tog</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-13-oct-13-a-streaming-launcher-co-op-that-fights-tog</guid>
    <pubDate>Tue, 13 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Two things landed that matter to strangers: how the game gets onto their machine, and whether a co-op party actually fights together. The streaming launcher installs the full game from our asset server with resume, verification, pause and rollback, and an up-to-date check that finishes in under a second; rollback storage costs about 1.02 times the build size instead of double (#304, #308, #312). The flow for every game update from here on: build on merge -&amp;gt; chunked delta installer -&amp;gt; verify per chunk -&amp;gt; publish -&amp;gt; the launcher streams only what changed. This is the piece that lets me ship several times a day without making anyone wait for a full download.&lt;/p&gt;&lt;p&gt;Co-op combat got the deeper fix: melee (light and heavy), power casts and parry now run in lockstep on every seat, proven in real two- and four-player network sessions, with a deterministic sim so the same inputs produce the same fight on every machine (#319, #315). The scaffolding that proves it is the interesting part: a Rust unit test pins the portable rotation path, and check-cross-platform-sim.sh compares Linux and Windows tick-hash traces and fails on a divergent tick (#348). Determinism is not a hope here; it is a gate.&lt;/p&gt;&lt;p&gt;Difficulty came in as scenario parameters plus an in-game Difficulty tab with Story, Normal, Hard and Brutal presets and sliders, saved with the scenario (#318). Crafting cost rules landed (Matter Creation conjures free below Cronium quality, benches charge half), exports now fail closed on any missing or pointer-only asset instead of silently shipping a broken build (#314, #309), and the crash reporter is a real modal over the main menu. My own reports drove several of these: the launcher fixes came from my playtest on another machine, and the lockstep work came from watching a co-op fight feel like two games. That is the loop: I playtest, the record becomes a task, a lane proves it with numbers, the gate keeps it true.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Bodies that flop, bodies that tear</title>
    <link>https://voidhorizon.net/#post-2026-10-12-bodies-that-flop-bodies-that-tear</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-12-bodies-that-flop-bodies-that-tear</guid>
    <pubDate>Mon, 12 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;This one came out of watching kills look wrong and refusing to ship it that way. Corpses were blowing apart and freezing mid-fall; my report said it plainly: &amp;quot;the guard regularly catches runaway hands and the pelvis during perf runs and freezes them ... intact targets flop a bit&amp;quot;. The lanes traced two physics bugs and fixed them at the root: Godot&amp;apos;s joint corrections were injecting energy into a lying body (a pelvis spinning up to hundreds of rad/s), and the physical-bone anchor scale fix was overwritten when bones entered the tree, so joints pivoted in the wrong place (at cast scale 1.749 the forearm anchor sat at -0.102 instead of -0.178). Softer joint corrections plus world-space pivots took the ragdoll guard from 39 runaway trips in live firefights to 0 (#299). The caps from the first ragdoll pass (#236) held underneath: kill knock spread over every part at 0.12 m/s per impulse unit, capped at 3 m/s (&amp;quot;keep the chunks a little closer&amp;quot;), and the stretch guard that restores a body to its last whole pose before the skin can draw a stretched frame (the dismemberment approval recorded that chunks separate completely).&lt;/p&gt;&lt;p&gt;The tear system is the showier half, and it came from the same day&amp;apos;s follow-up: &amp;quot;sometimes they flop, sometimes they tear apart&amp;quot;. A kill-time disposition, deterministic in the Rust sim, decides flop or tear: 10% of kills at base, up to 35% for energy, blast and overkill, and the cut site follows where the hit landed (neck, either elbow, either knee). The body&amp;apos;s triangles are partitioned along the dominant bone chain, the severed piece gets its own skeleton and colliders, and both cut faces get an inset dark-red wound cap so we never stretch skin across a gap; unsafe contours fall back to a normal flop. Measured on the release build (RTX 5090, 2560x1440): headless death p95 of 1.26 to 1.73 ms, and live p95 within noise of main in sandbox, firefight and the 100-unit battle (#302).&lt;/p&gt;&lt;p&gt;The collaboration beats worth keeping: the wrong turn is in the record too. Round 3 of the tear work regressed the 100-actor battle to p95 27-29 ms with 300-490 ms spikes; round 4 fixed it by removing template-hash churn and per-actor reserve nodes. And the review is pictures, not vibes: captures of every cut site with close-ups of every cap, reviewed before merge. A guard test now runs so the freeze and stretch bugs cannot come back quietly.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Oct 11: every power casts, characters explain the puzzles, and frame-time hunting</title>
    <link>https://voidhorizon.net/#post-2026-10-11-oct-11-every-power-casts-characters-explain-the-p</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-11-oct-11-every-power-casts-characters-explain-the-p</guid>
    <pubDate>Sun, 11 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;All twelve immortal powers now cast through one shared charge, release and impact system, and the record of how it happened is a good window into the powers lane. The Oct 6 combat clips had shown several powers as nothing but damage numbers. Batch 1 (#246) made Electrokinesis (a kinked blue chain bolt), Influence (a violet mind-link and halo) and Gravity slam (a ground shockwave ring with dust where thrown foes land) visible. Batch 2 (#247) followed two of my rulings from that day: Matter Creation fabricates with a fill-from-nothing effect (a faint outline filling slice by slice, 0.6 s), and Electrokinesis hits machines only, fizzling for free when no machine is in reach. Batch 3 (#248) finished the list with bolt aim, merged damage-number bursts, Shapeshift forms, a Life surge heal, Summon Ship and Illusion. My rules hold on every one: no freeze frames, no shake, no full-screen flash. The flow for each batch: the invisible-powers list taken from the clips -&amp;gt; the sim reports where each cast struck -&amp;gt; per-power FX -&amp;gt; strict-clean GPU clips -&amp;gt; the orchestrator reviews the frame sheets -&amp;gt; merge.&lt;/p&gt;&lt;p&gt;Quests and scenes moved the same day. Warden Auren now explains the Cryo Bay relay puzzle in plain language, every hint leaves a saved note with speaker, place and campaign time, and the quest log holds several active story chains at once, with old saves migrating without fabricated history (#284). The scene reachability gate (task-3263) audits scene identities through production campaign travel, quest and portal prerequisites, and keeps 123 pending identities explicit rather than calling them playable (#269). godot-smoke.sh went green end to end for the first time, 107 stages from a fresh worktree, and the run caught real product bugs on the way: a co-op comms panel script error when pressing T, ship_landing lambdas capturing freed objects, and 142 portrait .import sidecars committed as invalid (#264). Climbing animation got its own pass after I rejected the bow-legged climb knees and the elbow/armpit shredding: the fix keeps climb hands clear of face and torso with deterministic arm IK, knee swivel rule-based, skin locality preserved (#270).&lt;/p&gt;&lt;p&gt;Frame-time hunting ran in measured passes: actor-local wound overlay sync plus CPU hitch attribution (#281), then pooled and prewarmed hit-flash and contact FX that removed the 50-130 ms hitches on first hits (flash attachment 49.5 ms to 0.055 ms; contact FX 128 ms to 0.105 ms, with pixel-identical captures) (#285), then a quiet-host rerun that cut firefight p95 34-40% and hitches from 407 to 87 in sandbox-11 (#296). Body and prop LODs generated automatically at runtime ride the same round. The 120 fps target in the 50-enemy firefight is still open, and it is named in the log rather than quietly dropped.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Cockpits, a vaulted Ark and 182 quests checked</title>
    <link>https://voidhorizon.net/#post-2026-10-10-cockpits-a-vaulted-ark-and-182-quests-checked</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-10-cockpits-a-vaulted-ark-and-182-quests-checked</guid>
    <pubDate>Sat, 10 Oct 2026 12:00:00 GMT</pubDate>
    <category>NEW</category>
    <description>&lt;p&gt;Cockpits came first: every faction got a pocket bridge with a canopy view in flight, F6 toggles between the chase camera and the pilot seat, and the shells are placeholders built to be replaced by real interiors later (#254, #257, #262). The technique worth naming is shipping a placeholder behind the same gates as finished work: the queue task stays open with the upgrade path written down, so it never pretends to be final.&lt;/p&gt;&lt;p&gt;Scenes got a shared kit: CC0 walls, pillars, slabs and rocks around the Combat Sandbox, repeats as MultiMesh instances, collisions kept (#259), lamps and braziers with an animated flame shader (#260), and an architecture pass of arches, vault ribs and bulkheads for the Ark hangar, Cryo Bay Seven and the Forgotten District (#263). The flow: kit piece -&amp;gt; budget check -&amp;gt; scene assembly -&amp;gt; render gate -&amp;gt; review -&amp;gt; merge.&lt;/p&gt;&lt;p&gt;Quests are the bigger story: an automated sweep walks all 182 campaign quests through the production loader and runtime, checking that every node and choice is reachable, every reached state keeps a path to End, rewards pay exactly once, and every state round-trips through the profile codec (#261). It found predecessor facts not reaching successor gates on save restore, terminal rewards dispatching twice, offers ignoring reputation floors, and quests offered before their prerequisites, and it fixed them. The content calls came to me for review: gates that had wrongly used powers now use the canonical skills at difficulty 13. A sweep like this is the difference between hoping the quests are fine and knowing every branch loads; and because it runs against the same runtime a player uses, a fix that passes the sweep is a fix on the real path.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Checking fresh startup caches against Main</title>
    <link>https://voidhorizon.net/#post-2026-10-09-checking-fresh-startup-caches-against-main</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-09-checking-fresh-startup-caches-against-main</guid>
    <pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate>
    <category>DEVELOPMENT</category>
    <description>&lt;p&gt;The startup cache work is the least glamorous piece of the launch, and the one I watch most closely, because it decides whether a stranger&amp;apos;s first minute feels instant or like a load screen. The technique: a boot bake warms the same validator-gated scenario the real game boots, the RISE route replays its 1158 placements, and the cache is checked headless against the live game before it ships (#256). Flow: profile the cold boot -&amp;gt; bake the cache in a dedicated worker lane -&amp;gt; boot the same scenario headless -&amp;gt; compare against the live game and the release build -&amp;gt; record the per-stage timings -&amp;gt; merge -&amp;gt; boot test again on the published build.&lt;/p&gt;&lt;p&gt;The collaboration here is the plain reporting the scaffold produces. The note on this post says plainly what is and is not proven: the RISE route passed with every original assertion, the audio and packaged-inclusion work are separate lanes, and whole-game smoothness is not claimed. That is the record saying exactly what is proven, and I keep it that way on purpose: a post that overclaims today costs a bug report tomorrow.&lt;/p&gt;&lt;p&gt;The system behind it is the usual one: a lane builds the bake, the gate refuses a cache that does not boot the real scenario, and release-on-merge only publishes a build whose boot test passed. Startup caches only matter if they are always current, so the rule is that the bake and the boot check run with every game-touching merge, and the orchestrator&amp;apos;s loop-tick checklist keeps them paired.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Sharing hand data across weapon changes</title>
    <link>https://voidhorizon.net/#post-2026-10-09-sharing-hand-data-across-weapon-changes</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-09-sharing-hand-data-across-weapon-changes</guid>
    <pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate>
    <category>PERFORMANCE</category>
    <description>&lt;p&gt;A small performance post with a technique worth writing down. Re-evaluating a held weapon&amp;apos;s grip used to rebuild the same weighted hand geometry every time you swapped weapons or re-aimed, and the measurement said the rebuild-and-evaluate cost 2.90 ms median per grip solve. The fix is to cache the immutable weighted hand inputs (the baked skinning and joint weights that do not change while you hold the same weapon) and reuse them across pistol, blade and pistol within one capture, re-reading only the live skeleton pose each frame, which drops the median evaluation to 0.27 ms with exact parity over eight changed poses and recaptured hand faces (#253).&lt;/p&gt;&lt;p&gt;The flow: profile the grip solver -&amp;gt; identify the immutable part of the input (weights, joint offsets, contact search space) -&amp;gt; cache it keyed on the capture that produced it -&amp;gt; invalidate on equipment change, not on pose change -&amp;gt; re-measure under the same harness -&amp;gt; merge only when the numbers and the parity check both pass. It is a small lesson in the shape of a cache: never cache what depends on the pose, always cache what depends on the rig, and invalidate at the boundary between them.&lt;/p&gt;&lt;p&gt;Why I like writing these up: the technique generalises. The split is always pose-dependent versus rig-dependent: never cache what depends on the pose, always cache what depends on the rig, and invalidate at the boundary between them. The numbers in the post are from the live game, not a synthetic benchmark, and the stale-cache risk is handled with an invalidation gate rather than a prayer.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Settings returns to the same world</title>
    <link>https://voidhorizon.net/#post-2026-10-09-settings-returns-to-the-same-world</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-09-settings-returns-to-the-same-world</guid>
    <pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate>
    <category>DEVELOPMENT</category>
    <description>&lt;p&gt;A measured bug drove this one: opening Settings discarded and rebuilt the live campaign world, and returning regenerated all saved music cues synchronously, 53.833 seconds of stall. The fix makes Settings pause the existing world instead of tearing it down and rebuilding it, so closing Settings returns to the same campaign in 70 ms with movement, NPCs and world identity intact (#252). The flow: my report -&amp;gt; a repro in the headless harness -&amp;gt; the fix at the source (pause, not rebuild) -&amp;gt; a native test that verifies the world instance survives -&amp;gt; merge.&lt;/p&gt;&lt;p&gt;The system piece is the test discipline. The regression test is not a synthetic world; it boots the real campaign, opens Settings the way the menu does, and asserts the same world instance is still standing afterward, including NPC positions and seated talk state. That test now guards every merge, so this bug class is dead rather than merely fixed once.&lt;/p&gt;&lt;p&gt;The collaboration part is the plain note at the end of the post: the native run returned in 70 ms with the same Campaign instance, exact profile, HP and position, and the post says &amp;quot;merged source changes&amp;quot; without claiming a published build. I would rather publish less and be right than sound finished and be wrong.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Bounded release validation</title>
    <link>https://voidhorizon.net/#post-2026-10-09-bounded-release-validation</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-09-bounded-release-validation</guid>
    <pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate>
    <category>DEVELOPMENT</category>
    <description>&lt;p&gt;The release pipeline&amp;apos;s job is to never ship a build we cannot account for, and this post is about the guardrails around that. The launcher and menu-label work shipped alongside resource guards that keep the build&amp;apos;s owned Windows process tree bounded: every job the release spawns runs under a monitor with memory limits, a finite build admission so a runaway compile cannot eat the host, and native process ownership so a cancelled release reaps its children instead of leaving zombies (#251). The flow: the release builds -&amp;gt; each job gets bounded admission -&amp;gt; the boot test runs in the same envelope -&amp;gt; the build publishes only if the boot passed -&amp;gt; release-on-merge ships it to the one-liner.&lt;/p&gt;&lt;p&gt;The Windows fixtures are the fun part: tiny harnesses that verify argument delivery, memory limit enforcement and process-tree teardown on real Windows, because a resource guard that has never been tested against a real runaway is a guard that will let you down at the worst time. The job controller is the same pattern we use on the Linux side, so both platforms can trust each other&amp;apos;s numbers.&lt;/p&gt;&lt;p&gt;The collaboration piece is that the release path had launched Windows boot tests without a native memory limit and built Cargo tools without bounded admission; the fix answers with a Rust Windows Job controller, 16 GiB process caps, 32 GiB free-memory admission, and teardown that waits for every owned descendant. The technique generalises: any background work the game or its tooling spawns should run in a bounded envelope with its own owner, so the release cannot be killed by a straggler. That principle now shows up in the CI lanes, the bake workers and the release itself.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Remote play follows the published build</title>
    <link>https://voidhorizon.net/#post-2026-10-09-remote-play-follows-the-published-build</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-09-remote-play-follows-the-published-build</guid>
    <pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate>
    <category>DEVELOPMENT</category>
    <description>&lt;p&gt;The play one-liner used to select a historical tracked bundle ledger, while release publication updates the remote LATEST pointer, so a remote playtest could land on a build the public pipeline had already replaced. The fix makes the one-liner resolve to the same published build the launcher installs: it asks the release pipeline for the live build, so remote play and local install always agree on what &amp;quot;latest&amp;quot; means (#250). The flow: release-on-merge publishes a build -&amp;gt; the one-liner queries the published LATEST -&amp;gt; the same hash the launcher verifies is what remote play resolves -&amp;gt; both paths fail closed when the build is missing or stale rather than silently picking an older one.&lt;/p&gt;&lt;p&gt;The technique that makes this trustworthy is that the resolution is verified, not assumed: the hash the installer checks is the same hash the play path uses, and the failure mode is explicit (a named error, not a fallback to something older). A subtle bug class disappears with it: the &amp;quot;I tested the new build but the old one was actually running&amp;quot; report that used to eat a whole debugging session.&lt;/p&gt;&lt;p&gt;The system piece is the release pipeline itself: one command ships a build, it gets boot-tested on Windows, it lands on the release channel, and every consumer of &amp;quot;latest&amp;quot; (local play, remote play, the landing page&amp;apos;s build log) resolves through the same published record. The fix turns &amp;quot;latest&amp;quot; into one resolution rule instead of a special case: the launchers delegate to the published installer, even on clean consumer hosts without publisher credentials.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Distinct labels for the two character tools</title>
    <link>https://voidhorizon.net/#post-2026-10-09-distinct-labels-for-the-two-character-tools</link>
    <guid isPermaLink="true">https://voidhorizon.net/#post-2026-10-09-distinct-labels-for-the-two-character-tools</guid>
    <pubDate>Fri, 09 Oct 2026 12:00:00 GMT</pubDate>
    <category>DEVELOPMENT</category>
    <description>&lt;p&gt;A small clarity fix with a real user story behind it. Two main-menu tools shared the name Character Lab, the exact confusion a new player would hit, and the duplicate-label regression failing on main became the red test for this change: the preview tool is Asset / FX Lab, the character tool is Character Lab, and every route keeps its own scene (#249). The flow: my report -&amp;gt; a repro in the headless harness -&amp;gt; the label correction at the source -&amp;gt; a regression test that fails on the old labels and passes on the new ones -&amp;gt; a native check that each menu button dispatches to its original scene -&amp;gt; merge.&lt;/p&gt;&lt;p&gt;The technique worth naming is that a UI bug with one visible symptom (a mislabeled button) still got the full loop: repro, fix, regression test, dispatch check, merge. It would have been tempting to just rename the strings and move on, but the regression test is what keeps the next person from reusing the wrong label, and the dispatch check proves the two routes still point where they should.&lt;/p&gt;&lt;p&gt;The system piece is the queue and the delta: the task record names the file and the route, the lane that fixes it proves it with the regression test, and the delta check runs the touched tests instead of the whole suite, so a two-line fix does not wait behind a full CI run. Small fixes should be fast, and the scaffolding exists so they can be.&lt;/p&gt;</description>
  </item>
</channel>
</rss>
