<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>greytide builds and devlog</title>
  <subtitle>Fresh off the desk. Painted towers against the unpainted grey horde.</subtitle>
  <link href="https://greytide.advancedstudios.net/feed.xml" rel="self"/>
  <link href="https://greytide.advancedstudios.net/"/>
  <id>https://greytide.advancedstudios.net/</id>
  <updated>2026-10-09T16:43:33+00:00</updated>
  <entry>
    <title>dev-d93e2c6: unity: tower specs that strike inside a loop borrow their own walker list (#733)</title>
    <link href="https://greytide.advancedstudios.net/#dev-d93e2c6"/>
    <id>https://greytide.advancedstudios.net/#dev-d93e2c6</id>
    <updated>2026-10-09T16:43:33+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: tower specs that strike inside a loop borrow their own walker list (#733) (#799)&lt;/li&gt;&lt;li&gt;unity: stress run steady-state allocation from 6.7 KB to ~1.5 KB per frame (#792) (#806)&lt;/li&gt;&lt;li&gt;unity: glue and difficulty measured on today&amp;#x27;s game; per-wave closest approach in the balance log (#201 part 3) (#805)&lt;/li&gt;&lt;li&gt;unity: slip moniker defaults to -moniker; relay POST /discord/token (#760) (#801)&lt;/li&gt;&lt;li&gt;unity: a real slap sound for the borrow&amp;#x27;s hand slap (#302) (#800)&lt;/li&gt;&lt;li&gt;unity: TowerApi.SendDown and the plank-gap hook (#507) (#794)&lt;/li&gt;&lt;li&gt;unity: TableSession.BlocksSight replaces the bathroom&amp;#x27;s static Live (#774) (#793)&lt;/li&gt;&lt;li&gt;unity: play.sh core pin fits the machine (#668) (#791)&lt;/li&gt;&lt;li&gt;unity: The Sun Catcher kills a lone grunt reliably (#786) (#790)&lt;/li&gt;&lt;li&gt;unity: The Loose Change kills a grunt on its own (#785) (#789)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-d93e2c6/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-d93e2c6/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-d93e2c6/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.7 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-a013418: devlog: 2026-10-09 The tower check that counted the wrong clock</title>
    <link href="https://greytide.advancedstudios.net/#dev-a013418"/>
    <id>https://greytide.advancedstudios.net/#dev-a013418</id>
    <updated>2026-10-09T14:12:49+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;devlog: 2026-10-09 The tower check that counted the wrong clock (#788)&lt;/li&gt;&lt;li&gt;unity: towercheck counts table time, lobs fly the exact parabola (#783) (#787)&lt;/li&gt;&lt;li&gt;devlog: 2026-10-09 A tester wanted collectible figures (#784)&lt;/li&gt;&lt;li&gt;unity: the SELL banner is a paper price tag on the tray lip (#781) (#782)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-a013418/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-a013418/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-a013418/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-830e550: unity: hex build markers on every table, towers on glossy hex figure bases (#743, Average Joe&#x27;s idea)</title>
    <link href="https://greytide.advancedstudios.net/#dev-830e550"/>
    <id>https://greytide.advancedstudios.net/#dev-830e550</id>
    <updated>2026-10-09T09:10:03+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: hex build markers on every table, towers on glossy hex figure bases (#743, Average Joe&amp;#x27;s idea) (#771)&lt;/li&gt;&lt;li&gt;unity: tray clears the cassette radio at 16:10 (#634) (#777)&lt;/li&gt;&lt;li&gt;unity: school-desk table keeps per-game state in its own SchooldeskSession (#695) (#780)&lt;/li&gt;&lt;li&gt;unity: tower registry verbs: Pay, an OnKill hook, speed-up (#548) (#779)&lt;/li&gt;&lt;li&gt;devlog: 2026-10-09 catch-up (store page and trailer, one hit three rules, card questions, report pings) (#778)&lt;/li&gt;&lt;li&gt;unity: borrow names the tower by label, not the kind number (#535) (#776)&lt;/li&gt;&lt;li&gt;unity: bathroom table keeps per-game state in its own TableSession (#689) (#775)&lt;/li&gt;&lt;li&gt;unity: picnic table keeps per-game state in its own PicnicSession (#694) (#773)&lt;/li&gt;&lt;li&gt;unity: pub table keeps per-game state in its own PubSession (#693) (#772)&lt;/li&gt;&lt;li&gt;unity: click a table&amp;#x27;s name on the pick wall to take its whole set (#750) (#770)&lt;/li&gt;&lt;li&gt;relay: GitHub webhook posts player-report progress to Discord (#768) (#769)&lt;/li&gt;&lt;li&gt;unity: workbench table keeps per-game state in its own WorkbenchSession (#691) (#767)&lt;/li&gt;&lt;li&gt;unity: window-sill table keeps per-game state in its own SillSession (#692) (#766)&lt;/li&gt;&lt;li&gt;unity: Defense loops borrow their own walker list per nesting depth, so UpdateStatuses no longer throws &amp;#x27;Collection was modified&amp;#x27; (#681) (#749)&lt;/li&gt;&lt;li&gt;unity: game-store table keeps its per-game state in its own GameStoreSession (#690) (#765)&lt;/li&gt;&lt;li&gt;unity: the sandpit&amp;#x27;s board paint goes through BuildPar.Paint; a swap to it on Web drops from 3.7 s to about 0.35 s (#605) (#764)&lt;/li&gt;&lt;li&gt;site: run the Web build as a Discord Activity (Embedded App SDK) at /activity/ (#754) (#759)&lt;/li&gt;&lt;li&gt;unity: couch table keeps per-game state in its own CouchSession (#697) (#763)&lt;/li&gt;&lt;li&gt;unity: kitchen table keeps per-game state in its own KitchenSession (#688) (#761)&lt;/li&gt;&lt;li&gt;unity: desk table keeps per-game state in DeskSession (#687) (#762)&lt;/li&gt;&lt;li&gt;GameBot: a tick on a feedback ping approves the report, a cross declines it (#752) (#755)&lt;/li&gt;&lt;li&gt;relay: file player reports as status:triage (#751) (#753)&lt;/li&gt;&lt;li&gt;unity: street-map name field and dive use the Input focus claims (#674) (#746)&lt;/li&gt;&lt;li&gt;unity: a failed table switch logs the table the player is actually on (#680) (#747)&lt;/li&gt;&lt;li&gt;relay: post every filed player report to a Discord webhook (#744) (#745)&lt;/li&gt;&lt;li&gt;unity: pillow-fight POMF words no longer pile up (#682) (#742)&lt;/li&gt;&lt;li&gt;unity: a hurt grunt scuffs and darkens; health-reading cards reworded (#723) (#739)&lt;/li&gt;&lt;li&gt;unity: Superglue skips dudes that are already glued (#648) (#738)&lt;/li&gt;&lt;li&gt;unity: game store road ends no longer double back (#642) (#737)&lt;/li&gt;&lt;li&gt;unity: start again stands the exit shelf&amp;#x27;s minis back up (#649) (#736)&lt;/li&gt;&lt;li&gt;unity: sill gust drift is capped so dudes stay on the slab at the entrance corner (#650) (#735)&lt;/li&gt;&lt;li&gt;unity: wave counters show a remaining count next to running (#638) (#734)&lt;/li&gt;&lt;li&gt;unity: call bell stands in when the table&amp;#x27;s call object is out of sight (#641) (#732)&lt;/li&gt;&lt;li&gt;unity: desk camera stays inside the room, no black screen at max zoom-out (#637) (#731)&lt;/li&gt;&lt;li&gt;ci: manual Steam upload Action and --branch flag (#729) (#730)&lt;/li&gt;&lt;li&gt;unity: fast tablecheck calls wave 1 for the bot and stops at the first kill (#686) (#728)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-830e550/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-830e550/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-830e550/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-41e9430: unity: a per-game TableSession instead of the reused TableSpec plus static session classes (garage and attic first) (#667)</title>
    <link href="https://greytide.advancedstudios.net/#dev-41e9430"/>
    <id>https://greytide.advancedstudios.net/#dev-41e9430</id>
    <updated>2026-10-09T03:43:45+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: a per-game TableSession instead of the reused TableSpec plus static session classes (garage and attic first) (#667) (#720)&lt;/li&gt;&lt;li&gt;web: the site&amp;#x27;s GREYTIDE tab moves top-right, clear of the notebook (#706) (#727)&lt;/li&gt;&lt;li&gt;Radio cassette label never cuts a table name mid-word (#712) (#726)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-41e9430/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-41e9430/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-41e9430/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.7 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-f157626: Cards name only what the table shows: audit of all 156 cards, status rings, burning patches, aura rings (#709)</title>
    <link href="https://greytide.advancedstudios.net/#dev-f157626"/>
    <id>https://greytide.advancedstudios.net/#dev-f157626</id>
    <updated>2026-10-09T02:59:36+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Cards name only what the table shows: audit of all 156 cards, status rings, burning patches, aura rings (#709) (#724)&lt;/li&gt;&lt;li&gt;unity: tower-role card pools: aura and buffer towers draw their own cards, never attacks (#710, Average Joe) (#725)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-f157626/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-f157626/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-f157626/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-fc73abc: unity: a hidden table stage no longer blurs the start screen (#707)</title>
    <link href="https://greytide.advancedstudios.net/#dev-fc73abc"/>
    <id>https://greytide.advancedstudios.net/#dev-fc73abc</id>
    <updated>2026-10-09T02:13:34+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: a hidden table stage no longer blurs the start screen (#707) (#722)&lt;/li&gt;&lt;li&gt;Boss strip pinned top-centre, flat announcement banner removed, exit-shelf nameplate readable (#705) (#721)&lt;/li&gt;&lt;li&gt;relay + GameBot: a bot key so Discord /report is not capped at 5 an hour per IP (#713) (#715)&lt;/li&gt;&lt;li&gt;tools: GameBot, the greytide Discord bot (#711) (#714)&lt;/li&gt;&lt;li&gt;RunLongBuildArounds.TableIndex divides by WaveTable.Count (#701) (#708)&lt;/li&gt;&lt;li&gt;RunConfig comment: a leaked boss costs its own lives (#658) (#703)&lt;/li&gt;&lt;li&gt;docs: a table plays 10 waves (#657) (#702)&lt;/li&gt;&lt;li&gt;unity: one table setup value for ToyGame instead of statics and post-construction patching (#666) (#685)&lt;/li&gt;&lt;li&gt;unity: burn ticks keep ignoring the horde&amp;#x27;s growth; -dotgrow to measure (#677) (#684)&lt;/li&gt;&lt;li&gt;unity: a table lifetime scope for event subscriptions and callbacks; the [balance] line prints for every table (#664) (#683)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fc73abc/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.6 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fc73abc/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fc73abc/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-0cfdedd: unity: Walker statuses change only through intent verbs (#663, PR 2 of 2)</title>
    <link href="https://greytide.advancedstudios.net/#dev-0cfdedd"/>
    <id>https://greytide.advancedstudios.net/#dev-0cfdedd</id>
    <updated>2026-10-08T17:41:45+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: Walker statuses change only through intent verbs (#663, PR 2 of 2) (#679)&lt;/li&gt;&lt;li&gt;unity: keyboard focus claims in the Input front door (#665, cause of #636) (#676)&lt;/li&gt;&lt;li&gt;unity: one hit-and-status module for the game and the card simulator (#663, PR 1 of 2) (#678)&lt;/li&gt;&lt;li&gt;unity: remove the last link-card UI (#673) (#675)&lt;/li&gt;&lt;li&gt;unity: stale docs, dead link code and card-mode naming (#660) (#672)&lt;/li&gt;&lt;li&gt;unity: architecture scan: deepening opportunities report (#653) (#671)&lt;/li&gt;&lt;li&gt;unity: TEAM.md rules from the 2026-10-08 worker retro (#655) (#670)&lt;/li&gt;&lt;li&gt;unity: repo-local skills from mattpocock/skills (#652) (#656)&lt;/li&gt;&lt;li&gt;site: trailer page shows cut 2 (#646)&lt;/li&gt;&lt;li&gt;unity: trailer cut 2: 60 solid seconds, no flat text label boxes (#644) (#645)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-0cfdedd/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.6 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-0cfdedd/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-0cfdedd/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.7 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-7105d51: unity: Steam Deck and gamepad support (#613)</title>
    <link href="https://greytide.advancedstudios.net/#dev-7105d51"/>
    <id>https://greytide.advancedstudios.net/#dev-7105d51</id>
    <updated>2026-10-07T10:17:16+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: Steam Deck and gamepad support (#613) (#633)&lt;/li&gt;&lt;li&gt;site: trailer page (#635)&lt;/li&gt;&lt;li&gt;unity: the Steam trailer, 89 s cut to GREY PLASTIC, rendered from the game (#627) (#632)&lt;/li&gt;&lt;li&gt;unity: BathroomTable.DevProject null guide guard (#620) (#631)&lt;/li&gt;&lt;li&gt;relay: make lobby tests deterministic (#621) (#630)&lt;/li&gt;&lt;li&gt;unity: Steamworks.NET: facade, PAID_TO_WIN achievement, DLC ownership (#615) (#629)&lt;/li&gt;&lt;li&gt;unity: Steam store art rendered from the game (#610) (#619)&lt;/li&gt;&lt;li&gt;relay: FEEDBACK KV namespace id (#618)&lt;/li&gt;&lt;li&gt;unity: a table swap on Web no longer has a frame over 500 ms (#543) (#617)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-7105d51/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.6 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-7105d51/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (284.0 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-7105d51/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-3826462: unity: Steam store copy (#611)</title>
    <link href="https://greytide.advancedstudios.net/#dev-3826462"/>
    <id>https://greytide.advancedstudios.net/#dev-3826462</id>
    <updated>2026-10-07T07:29:44+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: Steam store copy (#611) (#612)&lt;/li&gt;&lt;li&gt;site: re-home the builds site to greytide.advancedstudios.net (#606) (#609)&lt;/li&gt;&lt;li&gt;unity: the four bootleg tracks become the title tracks (#607) (#608)&lt;/li&gt;&lt;li&gt;unity: music for treehouse, school desk, car seat, sandpit (#574) (#604)&lt;/li&gt;&lt;li&gt;unity: towercheck green again (#517) (#603)&lt;/li&gt;&lt;li&gt;unity: the desk&amp;#x27;s passing place is a real fork (#416) (#602)&lt;/li&gt;&lt;li&gt;unity: steamcmd upload tooling for app 5384480 (#598) (#599)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-3826462/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (285.3 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-3826462/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (283.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-3826462/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (262.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-a97b1d0: unity: step-down exposure check in divecheck; couch trims its lights and exposure in the dive (#585)</title>
    <link href="https://greytide.advancedstudios.net/#dev-a97b1d0"/>
    <id>https://greytide.advancedstudios.net/#dev-a97b1d0</id>
    <updated>2026-10-07T06:17:31+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: step-down exposure check in divecheck; couch trims its lights and exposure in the dive (#585) (#597)&lt;/li&gt;&lt;li&gt;site: soundtrack tracklist grouped by table, section anchors, contents list (#595) (#596)&lt;/li&gt;&lt;li&gt;site: soundtrack share-link button and #t-&amp;lt;id&amp;gt; deep links (#593) (#594)&lt;/li&gt;&lt;li&gt;Devlog: a slip of paper for the players (#592)&lt;/li&gt;&lt;li&gt;relay: POST /feedback files a GitHub issue from a player report (#584) (#591)&lt;/li&gt;&lt;li&gt;unity: in-game player feedback: report slip with screenshot, log tail, optional email and moniker (#583) (#590)&lt;/li&gt;&lt;li&gt;unity: unlisted slow-bounce listen page, two takes (#582) (#589)&lt;/li&gt;&lt;li&gt;unity: couch: remove the half-person sitter (#587) (#588)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-a97b1d0/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (226.8 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-a97b1d0/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (225.2 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-a97b1d0/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (204.1 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-dc20668: unity: hidden track two, West Coast rap with a signature loop, original words (#581)</title>
    <link href="https://greytide.advancedstudios.net/#dev-dc20668"/>
    <id>https://greytide.advancedstudios.net/#dev-dc20668</id>
    <updated>2026-10-07T04:09:50+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: hidden track two, West Coast rap with a signature loop, original words (#581) (#586)&lt;/li&gt;&lt;li&gt;unity: soundtrack page: &amp;#x27;hidden tracks&amp;#x27; section gets its own heading (#577) (#580)&lt;/li&gt;&lt;li&gt;Devlog: an evening of looking (#579)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-dc20668/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (226.8 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-dc20668/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (225.2 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-dc20668/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (204.0 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-13cdab9: unity: hidden bootleg jungle tape, original words (#576)</title>
    <link href="https://greytide.advancedstudios.net/#dev-13cdab9"/>
    <id>https://greytide.advancedstudios.net/#dev-13cdab9</id>
    <updated>2026-10-07T01:16:56+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: hidden bootleg jungle tape, original words (#576) (#578)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-13cdab9/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (223.5 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-13cdab9/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (221.8 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-13cdab9/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (200.7 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-fc9dcf6: unity: start screen: mode switches no longer lie under the third row of postcards; tablecheck flat-card item (#568)</title>
    <link href="https://greytide.advancedstudios.net/#dev-fc9dcf6"/>
    <id>https://greytide.advancedstudios.net/#dev-fc9dcf6</id>
    <updated>2026-10-07T00:30:20+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: start screen: mode switches no longer lie under the third row of postcards; tablecheck flat-card item (#568) (#575)&lt;/li&gt;&lt;li&gt;unity: cassette deck NEXT cycles the table&amp;#x27;s tape, EJECT opens a tape shelf (#569) (#573)&lt;/li&gt;&lt;li&gt;site: soundtrack cassette titles fit their labels (#571) (#572)&lt;/li&gt;&lt;li&gt;unity: wall note in the game&amp;#x27;s voice, hover sheet beside the rack (#567) (#570)&lt;/li&gt;&lt;li&gt;blog: editorial &amp;#x27;already told&amp;#x27; entry for the 18:22 post (#234) (#566)&lt;/li&gt;&lt;li&gt;Devlog post: zero normals and the blank card (#565)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fc9dcf6/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fc9dcf6/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (218.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fc9dcf6/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-515375c: unity: sandpit hose zero normals; tablecheck scans normals (#561)</title>
    <link href="https://greytide.advancedstudios.net/#dev-515375c"/>
    <id>https://greytide.advancedstudios.net/#dev-515375c</id>
    <updated>2026-10-06T22:58:38+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: sandpit hose zero normals; tablecheck scans normals (#561) (#564)&lt;/li&gt;&lt;li&gt;site: devlog pass, no blank cards, lightbox, shared nav (#562) (#563)&lt;/li&gt;&lt;li&gt;blog: the sandpit towers line in the newest post (#234) (#560)&lt;/li&gt;&lt;li&gt;blog: the sandpit, the stat sheet and the tower wall (#559)&lt;/li&gt;&lt;li&gt;blog: one clause on the frame-time check in the newest post (#234) (#558)&lt;/li&gt;&lt;li&gt;devlog: 126 bot games and the garage (#557)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-515375c/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-515375c/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (218.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-515375c/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-5346f8a: unity: the tower wall is a place of its own on every table (#554)</title>
    <link href="https://greytide.advancedstudios.net/#dev-5346f8a"/>
    <id>https://greytide.advancedstudios.net/#dev-5346f8a</id>
    <updated>2026-10-06T15:19:57+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: the tower wall is a place of its own on every table (#554) (#556)&lt;/li&gt;&lt;li&gt;unity: Watering Can no longer throws &amp;#x27;Collection was modified&amp;#x27; (#552) (#553)&lt;/li&gt;&lt;li&gt;blog: two lines in the newest post caught up by #491 (#234) (#551)&lt;/li&gt;&lt;li&gt;Devlog: no flat panels (2026-10-06 09:22) (#550)&lt;/li&gt;&lt;li&gt;unity: balance sweep: eleven tables retuned, fourteen plus sandpit measured over seeds 1 to 3 (#538) (#549)&lt;/li&gt;&lt;li&gt;unity: the four towers of the sandpit: Bucket, Spade, Ant Nest, Sandcastle Flag (#545) (#547)&lt;/li&gt;&lt;li&gt;unity: garage: the kick drum&amp;#x27;s ring shoves at half strength, the good bot wins the table (#536) (#546)&lt;/li&gt;&lt;li&gt;unity: new playspace: a sandpit on a summer afternoon (sandpit) (#433) (#544)&lt;/li&gt;&lt;li&gt;unity: table build: board paint in slices over frames on Web, paint reused by the draft rebuild (#530) (#542)&lt;/li&gt;&lt;li&gt;blog: one line in the newest post caught up by #531 (#234) (#541)&lt;/li&gt;&lt;li&gt;Devlog: the audit and the night of fixes (#540)&lt;/li&gt;&lt;li&gt;unity: full-GC pauses were card-table placement for every tower on every placement (#529) (#539)&lt;/li&gt;&lt;li&gt;unity: tower roster review: control towers cut to two per table, area numbers set, crash fixed (#439) (#537)&lt;/li&gt;&lt;li&gt;unity: the lent-tower payout still pays the holder after the Bounty redirect refactor, verified (#531) (#534)&lt;/li&gt;&lt;li&gt;unity: one seeded random stream for gameplay so bot runs replay (#525) (#533)&lt;/li&gt;&lt;li&gt;unity: the tower wall&amp;#x27;s heading and actions are scenery (#523) (#532)&lt;/li&gt;&lt;li&gt;unity: shared smoothstep and hex helpers across tables; kill payout redirect without mutating Balance.Bounty (#526) (#527)&lt;/li&gt;&lt;li&gt;unity: table build time: bucketed distance field, row-parallel texture painting (#384) (#528)&lt;/li&gt;&lt;li&gt;unity: crowd control is bounded: slow floors 45/70 over towers too, diminishing shoves and freezes for every enemy, faster patience (#436) (#519)&lt;/li&gt;&lt;li&gt;unity: the back seat&amp;#x27;s four towers: Juice Box, Seat-Belt Buckle, Air Freshener, Road Atlas (#497) (#522)&lt;/li&gt;&lt;li&gt;unity: the tweaks are a skinned console with real knobs, not a flat board (#515) (#521)&lt;/li&gt;&lt;li&gt;unity: table towers: the school desk (#496) (#520)&lt;/li&gt;&lt;li&gt;unity: towers earn XP for assists, support, control time and decoy time (#441) (#518)&lt;/li&gt;&lt;li&gt;unity: no flat panels during play: notebook menu, tweaks plate and board, cassette radio, call bell, sticky hints (#444) (#514)&lt;/li&gt;&lt;li&gt;unity: tablecheck:couch passes: measure the default view at 16:9, remote clear of the signpost (#453) (#513)&lt;/li&gt;&lt;li&gt;unity: zero-length normals on tower paint meshes, BlanketFold, PubTopDisc (#452) (#512)&lt;/li&gt;&lt;li&gt;unity: gpuSkinning: 1 (Web Low stress ~15-20% faster) (#481) (#511)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-5346f8a/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-5346f8a/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (218.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-5346f8a/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-d87e554: unity: towercheck: Lady Wash is a slowing tower, the check asks that she hurts a grunt (#498)</title>
    <link href="https://greytide.advancedstudios.net/#dev-d87e554"/>
    <id>https://greytide.advancedstudios.net/#dev-d87e554</id>
    <updated>2026-10-06T09:02:59+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: towercheck: Lady Wash is a slowing tower, the check asks that she hurts a grunt (#498) (#510)&lt;/li&gt;&lt;li&gt;unity: the tower wall never blocks automation; remembered pick skips it (#501) (#509)&lt;/li&gt;&lt;li&gt;unity: the treehouse&amp;#x27;s four towers: Conker, Torch, Water Balloon, Squirrel (#495) (#506)&lt;/li&gt;&lt;li&gt;unity: balance: good bot no longer ends tables at 1 life; floor leaks reported (#381) (#505)&lt;/li&gt;&lt;li&gt;unity: displays upload only when the picture changed (#461) (#504)&lt;/li&gt;&lt;li&gt;unity: garage: clear the cells with no step-down view (#491) (#503)&lt;/li&gt;&lt;li&gt;unity: move ToyGame&amp;#x27;s test commands into ToyGameCommands.cs; warn on a shadowed command (#463) (#502)&lt;/li&gt;&lt;li&gt;unity: Patient Hunter marks a healthy Blighted enemy as every tower&amp;#x27;s first target (#450) (#500)&lt;/li&gt;&lt;li&gt;unity: rework Gravity&amp;#x27;s Fan Club: falls bank charges the hand spends (#449) (#499)&lt;/li&gt;&lt;li&gt;unity: rework Loaded Die: the 10th hit launches the enemy into the air (#448) (#494)&lt;/li&gt;&lt;li&gt;unity: card engine stops building strings and CardCtx objects per shot, hit, kill and frame (#459) (#493)&lt;/li&gt;&lt;li&gt;unity: new playspace, the back seat of a car on a night drive (carseat) (#431) (#492)&lt;/li&gt;&lt;li&gt;unity: step-down view: divecheck, camera dodge, fade scenery in the way (#428) (#490)&lt;/li&gt;&lt;li&gt;unity: the bathroom becomes the inside of a bathtub: plug hole, hot tap, foam, a wind-up boat (#430) (#489)&lt;/li&gt;&lt;li&gt;unity: rework Second Barrel: the second shot goes to a different enemy at full damage (#447) (#486)&lt;/li&gt;&lt;li&gt;blog: correct one stale line in the newest post (#234) (#488)&lt;/li&gt;&lt;li&gt;Devlog: playspaces, not tables (#487)&lt;/li&gt;&lt;li&gt;unity: towers keep their target, retarget nearest-first on a clock; sight-check counter (#456) (#484)&lt;/li&gt;&lt;li&gt;unity: Capacitor&amp;#x27;s free shot goes to the next-nearest enemy (#446) (#485)&lt;/li&gt;&lt;li&gt;unity: no per-death SyncTransforms; time ragdoll builds (#458) (#483)&lt;/li&gt;&lt;li&gt;unity: window sill redo, the board is the concrete sill (#429) (#482)&lt;/li&gt;&lt;li&gt;unity: cut GreyDude pose cost (closed-form Rot, pose LOD) (#457) (#480)&lt;/li&gt;&lt;li&gt;unity: new playspace: a school desk during a boring lesson (schooldesk) (#434) (#479)&lt;/li&gt;&lt;li&gt;unity: headless self-test for the game rules (#462) (#478)&lt;/li&gt;&lt;li&gt;unity: new playspace: a treehouse at dusk (#432) (#477)&lt;/li&gt;&lt;li&gt;unity: every table&amp;#x27;s music raised to the workbench and attic standard (#443) (#476)&lt;/li&gt;&lt;li&gt;unity: retire the pub table (#435) (#475)&lt;/li&gt;&lt;li&gt;unity: pool Projectile and Rag, cache tower labels, non-allocating TowerApi overloads (#460) (#474)&lt;/li&gt;&lt;li&gt;unity: corkboard stat sheet, hover board, Step-down / Quick cards switch (#442) (#473)&lt;/li&gt;&lt;li&gt;unity: pick your tray a la carte before a single table (#440) (#472)&lt;/li&gt;&lt;li&gt;unity: Log and Warning without stack traces, -trace gate for per-hit tower logs (#455) (#471)&lt;/li&gt;&lt;li&gt;unity: perf: stress demo with twelve carded towers and a per-section [perf] line (#454) (#468)&lt;/li&gt;&lt;li&gt;unity: ascension within one table, bot pairs towers for combos (#437) (#467)&lt;/li&gt;&lt;li&gt;unity: Lord Gloss Coat no longer holds a whole wave alone (#413) (#466)&lt;/li&gt;&lt;li&gt;unity: card review: a verdict on every card, 24 cuts, 17 restrictions, one-sentence wording (#438) (#465)&lt;/li&gt;&lt;li&gt;unity: code audit 2026-10-06 (performance and structure, ranked tasks #454-#463) (#464)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-d87e554/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.3 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-d87e554/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (218.6 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-d87e554/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.5 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-b9ebda4: unity: couch and bathroom white-out on hardware WebGL: zero-normal double-sided meshes (#420)</title>
    <link href="https://greytide.advancedstudios.net/#dev-b9ebda4"/>
    <id>https://greytide.advancedstudios.net/#dev-b9ebda4</id>
    <updated>2026-10-06T06:01:51+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: couch and bathroom white-out on hardware WebGL: zero-normal double-sided meshes (#420) (#451)&lt;/li&gt;&lt;li&gt;tools: test windows never take focus or switch the view (one hidden-workspace rule for play.sh and shot.sh) (#445)&lt;/li&gt;&lt;li&gt;unity: more cheap kills before wave 5 and a softer mini-boss (#412) (#427)&lt;/li&gt;&lt;li&gt;unity: smooth the god-hand&amp;#x27;s goal while the pointer carries a mini (#409) (#426)&lt;/li&gt;&lt;li&gt;garage: road spots for Lord Gloss Coat follow the re-plugged lead (#408) (#423)&lt;/li&gt;&lt;li&gt;Devlog: first outside playtest and the white-out (#425)&lt;/li&gt;&lt;li&gt;unity: a retarget no longer resets an engaged tower&amp;#x27;s aim settle (#419) (#424)&lt;/li&gt;&lt;li&gt;unity: aura towers reach the road from most build cells (#411) (#422)&lt;/li&gt;&lt;li&gt;unity: tower pick-up and put-down under 120 ms (#410) (#421)&lt;/li&gt;&lt;li&gt;unity: couch: cap the crumb-gap mouths&amp;#x27; glow (#405) (#418)&lt;/li&gt;&lt;li&gt;blog: correct the bathroom fog line in the newest post (#234) (#404)&lt;/li&gt;&lt;li&gt;blog: fix the newest post&amp;#x27;s image links and three stale statements (#234) (#403)&lt;/li&gt;&lt;li&gt;Devlog post: the camera sees a strip (#402)&lt;/li&gt;&lt;li&gt;Devlog post: balance passes (#401)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-b9ebda4/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.9 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-b9ebda4/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (219.2 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-b9ebda4/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.9 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-691ca71: unity: run pacing for every board (#395)</title>
    <link href="https://greytide.advancedstudios.net/#dev-691ca71"/>
    <id>https://greytide.advancedstudios.net/#dev-691ca71</id>
    <updated>2026-10-05T19:37:40+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: run pacing for every board (#395) (#400)&lt;/li&gt;&lt;li&gt;unity: bed and workbench balance via stand-alone horde speed (#398) (#399)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-691ca71/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.9 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-691ca71/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (219.2 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-691ca71/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.9 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-9933966: unity: balance on three-run means, picnic wins (#258)</title>
    <link href="https://greytide.advancedstudios.net/#dev-9933966"/>
    <id>https://greytide.advancedstudios.net/#dev-9933966</id>
    <updated>2026-10-05T16:57:16+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: balance on three-run means, picnic wins (#258) (#397)&lt;/li&gt;&lt;li&gt;devlog: the card engine and the cards written on it (#234) (#396)&lt;/li&gt;&lt;li&gt;unity: run pacing per board, whole run 37 min, lazy Susan rides back, LF endings (#139) (#394)&lt;/li&gt;&lt;li&gt;unity: per-table balance retune, picnic wave sizes, stall count on the table-end line (#258) (#393)&lt;/li&gt;&lt;li&gt;Devlog: the overnight QA pass won every table (#392)&lt;/li&gt;&lt;li&gt;unity: TableBot builds the table and drafted towers (#380) (#391)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-9933966/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.9 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-9933966/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (219.2 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-9933966/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.9 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-e94c721: unity: no wave may hang: patience, queue time is not stall time, guard scales with road (#344)</title>
    <link href="https://greytide.advancedstudios.net/#dev-e94c721"/>
    <id>https://greytide.advancedstudios.net/#dev-e94c721</id>
    <updated>2026-10-05T13:06:58+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: no wave may hang: patience, queue time is not stall time, guard scales with road (#344) (#389)&lt;/li&gt;&lt;li&gt;unity: tablecheck: sill whistle and picnic bell inside the default view (#382) (#388)&lt;/li&gt;&lt;li&gt;unity: attic boxes and sill glass wall no longer hide the road (#385) (#387)&lt;/li&gt;&lt;li&gt;unity: overnight QA report: eleven tables, a run end to end, defects filed (#356) (#386)&lt;/li&gt;&lt;li&gt;unity: table towers: the band practice garage (#370) (#379)&lt;/li&gt;&lt;li&gt;unity: showpiece pass: the couch (#273) (#378)&lt;/li&gt;&lt;li&gt;unity: music for the picnic and the garage, five build and five wave tracks each (#372) (#377)&lt;/li&gt;&lt;li&gt;unity: cards: engine and host hooks for float, lob, combos, carry-over, Blight expiry, neighbour count, support strength, enemy kind (#339) (#376)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-e94c721/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (220.8 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-e94c721/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (219.2 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-e94c721/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (197.9 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-e8c3e84: unity: publish: one copy of the music on the site, size guard, picnic fallback (#368)</title>
    <link href="https://greytide.advancedstudios.net/#dev-e8c3e84"/>
    <id>https://greytide.advancedstudios.net/#dev-e8c3e84</id>
    <updated>2026-10-05T11:20:30+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: publish: one copy of the music on the site, size guard, picnic fallback (#368) (#375)&lt;/li&gt;&lt;li&gt;unity: desk: the teaching road, a short passing place that rejoins the main road (#354) (#374)&lt;/li&gt;&lt;li&gt;unity: let a table choose each walker&amp;#x27;s road (#252) (#373)&lt;/li&gt;&lt;li&gt;unity: towercheck Hold item accepts the slow floor (#361) (#371)&lt;/li&gt;&lt;li&gt;unity: workbench showpiece pass: conveyor road, magnifier lamp, live instruments, story beats (#275) (#369)&lt;/li&gt;&lt;li&gt;unity: new table: the band practice garage (#280) (#367)&lt;/li&gt;&lt;li&gt;unity: the draft: take two of each table&amp;#x27;s four towers; base pool of seven (#227) (#364)&lt;/li&gt;&lt;li&gt;blog: correct the newest post&amp;#x27;s time (#234) (#366)&lt;/li&gt;&lt;li&gt;devlog: The couch only ran out of memory in the browser (#234) (#365)&lt;/li&gt;&lt;li&gt;unity: music for all ten tables, five build and five wave tracks each (#263) (#363)&lt;/li&gt;&lt;li&gt;unity: tower registry: per-slot kill counts, diagonal neighbours, copy credit (#323) (#362)&lt;/li&gt;&lt;li&gt;unity: free desk prop textures and 2x2 GUI textures across table switches (#319) (#360)&lt;/li&gt;&lt;li&gt;unity: README rule for scoreboard screen rotation (#255) (#359)&lt;/li&gt;&lt;li&gt;unity: table hook BlocksSight; bathroom fog cuts sight only past four tiles (#251) (#357)&lt;/li&gt;&lt;li&gt;unity: the bed showpiece: the valley and the switch, cats at rest, a duvet that behaves, the story of the waves (#278) (#358)&lt;/li&gt;&lt;li&gt;unity: showpiece pass: the pub table, roundabout routes, story beats, signposts that leave (#276) (#353)&lt;/li&gt;&lt;li&gt;unity: desk showpiece pass (#277) (#355)&lt;/li&gt;&lt;li&gt;unity: boss health displays for the other nine tables (#325) (#352)&lt;/li&gt;&lt;li&gt;unity: lent towers that kill through TowerApi.Kill / Remove pay the holder (#301) (#351)&lt;/li&gt;&lt;li&gt;unity: bathroom showpiece pass: spiral road, water, story beats, room at one scale (#272) (#350)&lt;/li&gt;&lt;li&gt;unity: cards: seven hooks and five cards (#331) (#349)&lt;/li&gt;&lt;li&gt;unity: combos: paired affinities make named effects, combo book, links replaced (#228) (#348)&lt;/li&gt;&lt;li&gt;unity: cards engine: zone markers, armour vs Arcane share in SimWorld, status durations, glue as Stuck (#337) (#347)&lt;/li&gt;&lt;li&gt;unity: cards: triggers, counters and repeats, conversion: 19 new cards (#282) (#346)&lt;/li&gt;&lt;li&gt;unity: showpiece pass: the kitchen table, scale and sense, the hub route (#271) (#345)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-e8c3e84/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (191.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-e8c3e84/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (189.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-e8c3e84/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (168.4 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-9599ae0: unity: table towers: the back-yard picnic (#336)</title>
    <link href="https://greytide.advancedstudios.net/#dev-9599ae0"/>
    <id>https://greytide.advancedstudios.net/#dev-9599ae0</id>
    <updated>2026-10-05T10:13:38+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: table towers: the back-yard picnic (#336) (#343)&lt;/li&gt;&lt;li&gt;unity: card engine hooks for pulls, lifting and tower swaps; Peer Pressure, Tweezers, Swap Meet (#328) (#342)&lt;/li&gt;&lt;li&gt;unity: table towers: the couch (#295) (#341)&lt;/li&gt;&lt;li&gt;unity: cards: evolutions Superconductor, Hailstorm, Contagion, Turkey, Round Table (#286, part 3) (#340)&lt;/li&gt;&lt;li&gt;unity: the couch no longer runs the web player out of memory; table switching frees the old table (#264) (#329)&lt;/li&gt;&lt;li&gt;unity: cards: family 10 scalers, six new cards; summary of #283 (part 3) (#338)&lt;/li&gt;&lt;li&gt;unity: cards: position and neighbours, constraints and costs, economy and risk (families 8, 11, 12) (#285) (#335)&lt;/li&gt;&lt;li&gt;unity: cards: keystones, Bare Knuckle, Nailed Down, Colourfast, Slow Cure, Hands On, Cold Shoulder (#286, part 2) (#334)&lt;/li&gt;&lt;li&gt;unity: new table: the back-yard picnic (#279) (#333)&lt;/li&gt;&lt;li&gt;unity: the four towers of the pub table (#299) (#332)&lt;/li&gt;&lt;li&gt;unity: cards: family 5 status payoffs, seven new cards (#283, part 2) (#330)&lt;/li&gt;&lt;li&gt;unity: cards: ragdolls and juggling, edges and falls, the hand (families 6, 7, 9) (#284) (#327)&lt;/li&gt;&lt;li&gt;unity: boss health bars: top label, bar over the boss, table hook, desk monitor panel (#261, part 2) (#326)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-9599ae0/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (92.5 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-9599ae0/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (90.9 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-9599ae0/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (69.4 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-6ace016: unity: table towers: the window sill (#296)</title>
    <link href="https://greytide.advancedstudios.net/#dev-6ace016"/>
    <id>https://greytide.advancedstudios.net/#dev-6ace016</id>
    <updated>2026-10-05T09:09:46+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: table towers: the window sill (#296) (#322)&lt;/li&gt;&lt;li&gt;unity: table towers: the game-store demo table (#294) (#321)&lt;/li&gt;&lt;li&gt;unity: kitchen table towers: Pepper Mill, Kettle Knight, Sir Cling Film, Toaster Twins (#289) (#320)&lt;/li&gt;&lt;li&gt;unity: the bed&amp;#x27;s four towers (#290) (#318)&lt;/li&gt;&lt;li&gt;unity: cards: run-long build-arounds, Grudge Book, Slow Starter, Full Spectrum (#286, part 1) (#317)&lt;/li&gt;&lt;li&gt;unity: the four towers of the workbench (#298) (#316)&lt;/li&gt;&lt;li&gt;unity: cards: family 4 delivery rewrites, eight new cards (#283, part 1) (#314)&lt;/li&gt;&lt;li&gt;unity: game-store showpiece: story beats, the guide leaves, dice bowl, crossroads in view (#270) (#313)&lt;/li&gt;&lt;li&gt;unity: the four bathroom towers: Plunger, Captain Loofah, Rubber Duck, Shower Head (#291) (#312)&lt;/li&gt;&lt;li&gt;unity: the attic&amp;#x27;s four towers: Moth Squadron, The Bare Bulb, The Christmas Box, Dust Sheet Ghost (#297) (#311)&lt;/li&gt;&lt;li&gt;unity: the bed&amp;#x27;s cats Beatrice and Zeina: less often, less helpful, their own voices (#267) (#310)&lt;/li&gt;&lt;li&gt;unity: no wave can stall: hit floor, shove limits, slow floors, frozen-speed fix, guard (#261, part 1) (#309)&lt;/li&gt;&lt;li&gt;unity: multiplayer phase 2, item 4: carry a borrowed tower home to the holder&amp;#x27;s own table (#266) (#308)&lt;/li&gt;&lt;li&gt;unity: attic showpiece pass (#269) (#307)&lt;/li&gt;&lt;li&gt;unity: card engine: triggers with loop guards, weight, packs, offers, cardcheck, thirty worked cards (#281) (#306)&lt;/li&gt;&lt;li&gt;unity: link arrows on the dive card table, re-link on the tower sheet, no more IMGUI inspect panel (#190) (#305)&lt;/li&gt;&lt;li&gt;unity: soundtrack round two: per-table rotating music loaded on demand, dubstep out, first tables (#263) (#304)&lt;/li&gt;&lt;li&gt;unity: multiplayer phase 2: borrow a friend&amp;#x27;s tower, kills pay the holder, snap back, the slap (#266) (#300)&lt;/li&gt;&lt;li&gt;devlog: Two cats went in, the owner played, and thirty-five minutes later there were twenty-five new tasks (#234) (#293)&lt;/li&gt;&lt;li&gt;unity: make towers pluggable: one folder per tower, registry, template, towercheck (#226) (#288)&lt;/li&gt;&lt;li&gt;unity: start screen for ten tables, Table button, template display, registry gaps, run modifiers reaching tables (#262) (#287)&lt;/li&gt;&lt;li&gt;unity: houses in a run, tray labels in the neighbours view (#198) (#265)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-6ace016/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (92.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-6ace016/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (90.8 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-6ace016/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (69.2 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-fb794e5: unity: the bed&#x27;s two cats, the big one and the red one (#177)</title>
    <link href="https://greytide.advancedstudios.net/#dev-fb794e5"/>
    <id>https://greytide.advancedstudios.net/#dev-fb794e5</id>
    <updated>2026-10-05T05:08:21+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: the bed&amp;#x27;s two cats, the big one and the red one (#177) (#260)&lt;/li&gt;&lt;li&gt;devlog: Ten tables ship and none of the new ones is balanced: the workers were told to stop tuning and merge (#234) (#259)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fb794e5/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.5 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fb794e5/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.9 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-fb794e5/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.8 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-cc05372: unity: new table: the window sill (#222)</title>
    <link href="https://greytide.advancedstudios.net/#dev-cc05372"/>
    <id>https://greytide.advancedstudios.net/#dev-cc05372</id>
    <updated>2026-10-05T03:01:18+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: new table: the window sill (#222) (#257)&lt;/li&gt;&lt;li&gt;unity: new table: the bathroom floor (#219) (#256)&lt;/li&gt;&lt;li&gt;unity: new table: the pub table (#225) (#250)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-cc05372/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.5 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-cc05372/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.9 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-cc05372/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.8 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-2d19a88: unity: the workbench table (#224)</title>
    <link href="https://greytide.advancedstudios.net/#dev-2d19a88"/>
    <id>https://greytide.advancedstudios.net/#dev-2d19a88</id>
    <updated>2026-10-05T01:58:31+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: the workbench table (#224) (#248)&lt;/li&gt;&lt;li&gt;devlog: Seven tables at once: two are in, five are still being built, and the work log stopped two of its own writers (#234) (#246)&lt;/li&gt;&lt;li&gt;unity: new table: the couch (#221) (#245)&lt;/li&gt;&lt;li&gt;unity: new table: the game-store demo table (#220) (#244)&lt;/li&gt;&lt;li&gt;unity: new table: the attic (#223) (#240)&lt;/li&gt;&lt;li&gt;unity: pluggable tables: registry, template, tablecheck (#218) (#239)&lt;/li&gt;&lt;li&gt;unity: silent test launches by default, play.sh test windows (#230) (#238)&lt;/li&gt;&lt;li&gt;site: devlog blog rendered from Markdown, publish.py --site-only (#233) (#237)&lt;/li&gt;&lt;li&gt;devlog: Three days in: the builders cannot hear the game, and the bots never needed to see the cards (#234) (#235)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-2d19a88/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.5 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-2d19a88/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.8 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-2d19a88/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.7 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-da78fec: unity: step-down view: wider default and four wheel steps (#214)</title>
    <link href="https://greytide.advancedstudios.net/#dev-da78fec"/>
    <id>https://greytide.advancedstudios.net/#dev-da78fec</id>
    <updated>2026-10-04T22:25:13+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: step-down view: wider default and four wheel steps (#214) (#215)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-da78fec/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-da78fec/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-da78fec/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-ad8bba4: unity: dive view over the tower&#x27;s shoulder, further back, with a view check (#212)</title>
    <link href="https://greytide.advancedstudios.net/#dev-ad8bba4"/>
    <id>https://greytide.advancedstudios.net/#dev-ad8bba4</id>
    <updated>2026-10-04T21:36:06+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: dive view over the tower&amp;#x27;s shoulder, further back, with a view check (#212) (#213)&lt;/li&gt;&lt;li&gt;unity: per-board difficulty for the tougher later waves (#201, part 2) (#211)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-ad8bba4/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-ad8bba4/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-ad8bba4/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-52234f9: unity: glue cannot hold a lane, bed gets build cells, tougher later waves (#201, part 1)</title>
    <link href="https://greytide.advancedstudios.net/#dev-52234f9"/>
    <id>https://greytide.advancedstudios.net/#dev-52234f9</id>
    <updated>2026-10-04T19:11:47+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: glue cannot hold a lane, bed gets build cells, tougher later waves (#201, part 1) (#210)&lt;/li&gt;&lt;li&gt;unity: start screen as a place: kit box, random table postcards, card mode, Play/Run/friends (#203) (#209)&lt;/li&gt;&lt;li&gt;unity: table guide part 2: sticky-note explainers and the first-minute nudge (#202) (#208)&lt;/li&gt;&lt;li&gt;unity: table guide part 1: entrance, shelf, route arrows, signposts (#202) (#207)&lt;/li&gt;&lt;li&gt;unity: shrink-down view: readable cards, prompts as objects (#199 part 2) (#206)&lt;/li&gt;&lt;li&gt;unity: shrink-down view: sight lines, past picks board, framing, dive default (#199 part 1) (#205)&lt;/li&gt;&lt;li&gt;unity: tray hand fingertips fixed (skin weights), true left hand, hold pose (#200) (#204)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-52234f9/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-52234f9/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-52234f9/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>dev-394bf40: unity: multiplayer phase 1: street map, houses, neighbours&#x27; tables live (#195)</title>
    <link href="https://greytide.advancedstudios.net/#dev-394bf40"/>
    <id>https://greytide.advancedstudios.net/#dev-394bf40</id>
    <updated>2026-10-04T08:18:17+00:00</updated>
    <content type="html">&lt;p&gt;Play in the browser: &lt;a href=&quot;https://greytide.advancedstudios.net/play/&quot;&gt;https://greytide.advancedstudios.net/play/&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unity: multiplayer phase 1: street map, houses, neighbours&amp;#x27; tables live (#195) (#197)&lt;/li&gt;&lt;li&gt;relay: Cloudflare Worker with three live lobbies, deployed (#194) (#196)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-394bf40/greytide-win64.zip&quot;&gt;Windows&lt;/a&gt; (48.4 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-394bf40/greytide-linux64.zip&quot;&gt;Linux&lt;/a&gt; (46.7 MB)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/tehrandom2/greytide-builds/releases/download/dev-394bf40/greytide-web.zip&quot;&gt;Web build (zip)&lt;/a&gt; (32.6 MB)&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Three glue towers hold nobody, and the biggest garbage was a command-line parse</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-09-1005-three-glue-towers-hold-nobody/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-09-1005-three-glue-towers-hold-nobody/</id>
    <updated>2026-10-09T14:05:00+00:00</updated>
    <summary>Two measurement jobs on today&#x27;s game: the glue tower turned out to be a multiplier rather than a trap, and the heaviest per-frame allocation was the game re-reading its own launch options for every camera.</summary>
    <content type="html">&lt;h2&gt;Glue, measured on the game as it is now&lt;/h2&gt;
&lt;p&gt;Issue 201 was opened weeks ago, before the glue tower was rebuilt into a marker that makes a &amp;quot;glued&amp;quot; enemy take 1.3 times damage and before every table was retuned. The worker was asked to finish the last checks anyway: stack three glue towers on one stretch and see whether the wave still gets through, and report the good and late bots on the desk, kitchen and bed with the nearest approach to the exit for every wave. It added one log line per wave for that, and changed no balance value.&lt;/p&gt;
&lt;p&gt;On the desk, with towers placed by hand on one stretch:&lt;/p&gt;
&lt;p&gt;| build | lives left after wave 1 (of 20) | wave 1 kills | share of enemy-seconds stuck | |---|---|---|---| | nothing | 8 | 0 | 0.0 % | | three Superglue | 9 | 1 | 0.0 % | | one Ballista | 8 | 0 | 0.0 % | | Ballista beside three Superglue | 19 | 11 | 0.0 % |&lt;/p&gt;
&lt;p&gt;Three glue towers hold nobody; the wave walks through as if they were not there. Put a Ballista beside them and it kills 31 over ten waves instead of 1, with the glue towers collecting 23. Across the good-bot runs, everything that holds enemies in place kept them stuck for 1.3 percent of enemy-seconds on the desk. Glue is now a multiplier for its neighbours, which is what the issue asked for.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-1005-three-glue-towers-hold-nobody/glue-stack-desk.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Three Superglue towers and a Ballista on the stump in wave 1; pale splats at top right mark enemies still walking while glued.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The desk is lost early and never late&lt;/h2&gt;
&lt;p&gt;The good bot&amp;#x27;s lives left, three seeds each, counting what table one&amp;#x27;s lives floor hides: kitchen 5, 19, 20; bed -16, 20, 16; desk 0, 3, -14 (and 9, -2, -3 on three more seeds). A negative number means the table would have been lost without the floor. The target is 8 to 12 lives; with seeds 15 to 36 lives apart, three cannot resolve it.&lt;/p&gt;
&lt;p&gt;The pattern worth reporting is the desk. Every desk loss happens in waves 1 to 4, and waves 5 to 10 never leak. Ten Ballistas bought whenever affordable lose in wave 2 on the desk, while the same build lasts to wave 6 or 10 on the other two tables. An earlier balance sweep had the desk good bot at 20, 13 and 5 lives, so something changed since. A shared dial would move all fifteen tables and growth only acts from wave 3, so the worker filed it separately (issue 804) with leads.&lt;/p&gt;
&lt;p&gt;The first runs went wrong in four ways: a bar-joined command was not split, so four runs measured an empty table; a run&amp;#x27;s tower draft held the hand until a pick was made; table one never drops below one life, so every scripted table &amp;quot;won&amp;quot;; and the same desk seed gave 13 lives in one run and 0 in another, so every case got three seeds.&lt;/p&gt;
&lt;h2&gt;6.7 KB per frame, and where it came from&lt;/h2&gt;
&lt;p&gt;Issue 792: the 100-enemy stress run allocated about 6.6 KB of managed heap every frame with the overlay off. The call that reports allocated bytes returns 0 on this runtime, so the worker measured heap-size changes around each callback, each statement of the toy&amp;#x27;s update, and the render events.&lt;/p&gt;
&lt;p&gt;The biggest source was not in the game loop. The screen-effect code parsed the entire command line to check for the &lt;code&gt;-novig&lt;/code&gt; option, once per camera per frame: about 3.5 KB. The rest: pad axis names built by string joins (0.4 KB), a list lookup that boxes key codes (0.25 KB), a saved-preference read for every unseen guide note (0.15 KB), and a new tape list built every frame for the desk kit (0.1 KB). Each was cached or replaced.&lt;/p&gt;
&lt;p&gt;Six runs after the change: 1,458 to 1,564 bytes per frame, against 6,631, 6,626 and 6,738 before. The check asked for under 1,500, so the worker called it not clearly met and left the pull request open; the lead merged it. About 1.1 KB left is inside the camera render in the rendering pipeline, and with rendering switched off the whole run is 225 bytes.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-1005-three-glue-towers-hold-nobody/stress-100-overlay-off.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The 100-enemy stress run with the overlay off, the scene the allocation numbers were taken from.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Smaller merges&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;A real slap sound for the lent tower&amp;#x27;s hand slap (issue 302). Its exported clip decays from RMS 0.50 to 0.01 in 80 ms; the worker wrote that it cannot listen.&lt;/li&gt;&lt;li&gt;The report slip takes its moniker from the chat-server activity (issue 760). The worker&amp;#x27;s first test hit the live relay and filed four real issues, closed as not planned.&lt;/li&gt;&lt;li&gt;A tower can send an enemy down a plank gap (issue 507), and the Measure Twice rule works on any table with its range preview drawn as a ruler (issue 247).&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Whether glue feels like a strong control tower, and whether the kitchen and bed feel losable, by hand; the owner has not played them.&lt;/li&gt;&lt;li&gt;Why the desk changed since the last sweep (issue 804).&lt;/li&gt;&lt;li&gt;Windows and Web builds of the allocation fixes, and a gamepad with the cached axis names.&lt;/li&gt;&lt;li&gt;The slap, by ear; the plank-gap squirrel and Conker in a live run; the ruler while dragging a tower.&lt;/li&gt;&lt;li&gt;The chat-server moniker flow inside the real chat server.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>The tower check that counted the wrong clock</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-09-0705-the-check-that-counted-the-wrong-clock/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-09-0705-the-check-that-counted-the-wrong-clock/</id>
    <updated>2026-10-09T11:05:00+00:00</updated>
    <summary>Five tower checks failed after a day of merges; nothing the merges touched was broken, but chasing the failures turned up a real bug in how thrown dice fly.</summary>
    <content type="html">&lt;h2&gt;Five failures, none of them from today&lt;/h2&gt;
&lt;p&gt;After the hex-base merge the lead ran the tower check across the roster and found five failures. Two towers never fired, two dealt damage but killed nothing, and an engine check for the Pull effect saw a grunt move only 0.2 cm. The issue&amp;#x27;s instruction to the worker was to find the merge that broke each one and fix the cause rather than the check.&lt;/p&gt;
&lt;p&gt;The worker reproduced all five on the first try with the issue&amp;#x27;s own command. Then it ran the same five checks a different way, through the screenshot script, where the window draws a frame in about 13 ms. All five passed, on the unchanged code. No merge had broken anything.&lt;/p&gt;
&lt;h2&gt;What the check was actually timing&lt;/h2&gt;
&lt;p&gt;The difference was the test window. The command in the issue parks the window out of sight with vsync on, and there the game drew about ten frames a second. A debug log printed every three seconds from the Superglue check showed the grunts walking 2.6 cm per second of check time, against a stated speed of 5.2.&lt;/p&gt;
&lt;p&gt;The game protects itself from long frames: each step is capped at 0.05 s times the speed setting, so at speed 4 no step is longer than 0.2 s. The check, though, added up the engine&amp;#x27;s raw frame time, which was 0.4 s a frame. Every wait in it was therefore twice as long on the clock as in the game. The check&amp;#x27;s &amp;quot;70 seconds of table time&amp;quot; was about 35 seconds of play. Superglue and Airbrush Kid stand near the far end of a 242 cm road; the leading grunt was still 34 cm away when the check gave up, and in real table time it arrives at about 40 seconds. The Pull probe&amp;#x27;s &amp;quot;0.3 s&amp;quot; wait was really 0.15 s.&lt;/p&gt;
&lt;p&gt;The fix was to make the check read the defence&amp;#x27;s own clock, the sum of the steps the game actually gave it. No pass threshold changed.&lt;/p&gt;
&lt;h2&gt;The Dice Tower was a real bug&lt;/h2&gt;
&lt;p&gt;With the clock fixed, four of the five passed on the slow window. The Dice Tower still threw 48 dice for 1.73 damage and killed nothing. Dice are lobbed, and the worker looked at how the game steps a lob: it updated velocity before position, which drops the projectile by g times the step squared, over two, on every step.&lt;/p&gt;
&lt;p&gt;The worker wrote a self-test that flies a lob aimed by the game&amp;#x27;s own aiming code. The old step landed 1.3 cm short at 60 frames a second and 15.6 cm short on 0.2 s steps. Stepping along the exact parabola brought both to 0.0000 cm. On the slow window the Dice Tower then threw 35 dice for 9.06 damage and a kill. The Dice Tower&amp;#x27;s small landing radius was what exposed it; all twelve lobbing towers now land where they aim.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0705-the-check-that-counted-the-wrong-clock/dice-lands-among-grunts.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;A red die at rest among the grey grunts on the game-store road, thrown by the Dice Tower after the lob fix.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The full check through the slow window took about two hours and passed 69 of 72; the three that failed spread their damage over several grunts, so a kill inside 70 seconds is luck. Two follow-up issues were filed. Through the fast window it passed 72 of 72 in about 35 minutes.&lt;/p&gt;
&lt;h2&gt;The SELL banner became a price tag&lt;/h2&gt;
&lt;p&gt;A smaller job landed alongside. The red SELL banner above the tray was replaced by a manila hang tag with a punched hole, a printed rule and a twine loop on a small brass pin on the tray&amp;#x27;s front lip. It flips down when a placed tower is picked up, and lifts and turns cream when the tower is held over it.&lt;/p&gt;
&lt;p&gt;The worker&amp;#x27;s first build had the hole and the rule upside down, because the card canvas counts rows from the top; the held-state screenshot showed it and the fix was one mapping change. The lit state&amp;#x27;s thin red text was hard to read in a shot, so it became two lines at a larger size.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0705-the-check-that-counted-the-wrong-clock/sell-tag-desk.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The desk with a tower held; look at the paper tag hanging from the tray lip.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Whether the lob change moves any table&amp;#x27;s balance beyond what the desk bot smoke shows.&lt;/li&gt;&lt;li&gt;Whether Loose Change and Sun Catcher also failed on the old code with the slow window; the earlier run stopped at tower 33.&lt;/li&gt;&lt;li&gt;Whether the sell tag looks right to the owner; the mid-flip frames were seen only in a short sequence.&lt;/li&gt;&lt;li&gt;A real mouse drag on the tag, the Web build, and the other tables.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A tester wanted collectible figures,</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-09-0410-hex-bases-and-a-tester-idea/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-09-0410-hex-bases-and-a-tester-idea/</id>
    <updated>2026-10-09T08:10:00+00:00</updated>
    <summary>Build spots became hex tiles and every tower got a glossy hex base, on a tester&#x27;s suggestion; the same hours moved table state into sessions, gave towers a way to pay Points, and turned up five tower-check failures.</summary>
    <content type="html">&lt;h2&gt;Hex tiles and a plinth for every tower&lt;/h2&gt;
&lt;p&gt;A tester, Average Joe, suggested that build spots could be hex tiles, and that towers could stand on matching hex bases like collectible toy figures. The worker on issue 743 found that the small drilled dots were never geometry: every table paints them into its surface texture through one shared function. Replacing that function put hex markers on all sixteen tables at once, each in its own material: an inlaid line on wood, glazed tiles in the bathroom, a pressed groove in the sand, a printed sticker on fabric and cardboard.&lt;/p&gt;
&lt;p&gt;Every tower mini now sits on a hex prism: a black foot, a glossy band in the tower&amp;#x27;s accent colour, a rim coloured by role (shooters red, lobbers orange, auras violet, and so on), the tower&amp;#x27;s name printed on the front and its affinity on the back. Because the base belongs to the mini, picking a tower up lifts both without any change to the hand code. While a figure is carried, free legal spots glow faintly.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0410-hex-bases-and-a-tester-idea/desk-held.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The desk with a figure held; look at the hex inlays and the printed plate on the base.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The worker ran six look passes and several went against it. The first bathroom screenshot showed tiles so saturated they drowned the road, so the fill was cut from 78 to 50 percent. The glow was invisible in the first frames; the worker only saw it by comparing frames before and after a pick-up, then made it about twice as bright. Close-ups were blurred by depth of field and the dark top of the base hid brown accents, so it was lightened. One test carried the duck over the tower case, which the game reads as &amp;quot;drop to sell&amp;quot;, and the camera followed it into a blur; the drag target was moved.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0410-hex-bases-and-a-tester-idea/bathroom-held.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The bathroom after the tile fill was cut back.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Whether the look is right is the owner&amp;#x27;s call, and the issue stays open for it.&lt;/p&gt;
&lt;h2&gt;A coin that left the frame&lt;/h2&gt;
&lt;p&gt;The worker on issue 548 gave the tower registry three new verbs the sandpit towers had been working around: pay Points with a coin pop, a hook that tells every kind of tower about each kill, and permission to speed a dude up rather than only slow it. The Sandcastle Flag, which used to count its neighbours&amp;#x27; kills every frame and reach past the registry for the table&amp;#x27;s purse, moved over to them.&lt;/p&gt;
&lt;p&gt;The probes passed on the first run. Making the result visible took the work: the first screenshots of the flag mid-wave showed the Points counter ticking, and no coin or &amp;quot;+1&amp;quot; anywhere. Cropped frames showed the coin spinning above the pole as intended, while the &amp;quot;+1&amp;quot; starts a few centimetres higher and rises out of the top of the frame. The pay point was lowered, and the next sequence caught a coin and a &amp;quot;+1&amp;quot; in the same frame as the counter.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0410-hex-bases-and-a-tester-idea/pay-coin-and-plus-one.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;A gold coin and a plus-one over the flag.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Smaller things that landed&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The tray of minis on the 16:10 screen was being covered by the cassette radio. Its right end is now capped at the radio&amp;#x27;s left edge, so the tray shrinks from 0.61 to about 0.57 of the width there (issue 634). The worker could not see the price tags, because the overlay is not in offscreen captures.&lt;/li&gt;&lt;li&gt;Borrowing a tower printed its kind number, 67, in logs for towers outside the original eleven. It now prints the tower&amp;#x27;s name (issue 535).&lt;/li&gt;&lt;li&gt;Swapping to the sandpit on the Web build froze a frame for 3.7 seconds. After the paint went through the shared helper and the terrain skipped far segments, the same swap measured 320 to 450 ms (issue 605). The first Web measurement showed 1 s and 7 s frames everywhere; the measuring script had opened the game in a background tab, which the browser throttles. One run in six still read 857 ms while other workers were compiling shaders on the same machine.&lt;/li&gt;&lt;li&gt;Seven more tables moved their per-game state into their own session classes. The bathroom worker&amp;#x27;s first check failed on frame time (53 ms) because two other players were running on the laptop; on a quiet machine it read 22.3 ms. The engine&amp;#x27;s sight query carries no game, so one static remains, filed as issue 774.&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Five towers stopped working&lt;/h2&gt;
&lt;p&gt;The lead ran the whole tower check on the merged build and it failed in five places: Superglue and Airbrush Kid never fired, Gloss Coat and Dice Tower dealt damage but killed nothing, and the engine&amp;#x27;s Pull barely moved a dude. All had passed the day before, so the issue (783) lists the morning&amp;#x27;s merges as suspects. It is being diagnosed; no cause is claimed here.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The hex look on screen, by the owner; the glow mid-carry; the Web build with the new bases; whether borrowed and ghost minis wear the bases.&lt;/li&gt;&lt;li&gt;No shipped tower speeds a dude up yet; that verb has only been tried with a probe.&lt;/li&gt;&lt;li&gt;The price tags and the borrowed-tower label text are on-screen overlays that the worker&amp;#x27;s captures could not show.&lt;/li&gt;&lt;li&gt;The sandpit swap in real browsers, on phones, and swaps away from the sandpit.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Reports that ping a channel, and a game inside a chat server</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-09-0255-reports-that-ping-a-channel/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-09-0255-reports-that-ping-a-channel/</id>
    <updated>2026-10-09T06:55:00+00:00</updated>
    <summary>The report slip gained a chat bot, a ping for every filed report, an approve tick, and a page that runs the Web build as an activity.</summary>
    <content type="html">&lt;h2&gt;Reports that ping a channel&lt;/h2&gt;
&lt;p&gt;The report slip from the last post now has more to talk to. A Discord bot (issue 711) takes a report, an idea with a vote, the newest build or the trailer. Its handlers are plain functions, so a script called them with stand-in interactions against a local relay pointed at a fake issue tracker: two reports filed, a JPEG screenshot refused, an idea filed once not twice. Review found that the idea command posted and added reactions before answering Discord, which allows three seconds; it now answers first. The relay&amp;#x27;s limit of five reports an hour per address would cap every Discord user at once, since they share the bot&amp;#x27;s address (follow-up 713). The relay now pings a channel for every filed report (issue 744); its first test showed every report queued and no post, because a leftover local server held the port. Reports are filed for triage, and a tick reaction on the ping approves one, a cross declines it (issue 752). A second endpoint posts progress as an issue is approved, picked up, fixed and closed (issue 768); review pointed out that a title could carry an email address, now scrubbed.&lt;/p&gt;
&lt;p&gt;The owner also asked whether the browser build could be played inside the Discord server. The worker for issue 754 built a wrapper page and tested it behind a local server standing in for Discord&amp;#x27;s proxy; the handshake only answers pages framed by Discord, so the test called the boot step directly. It reached the tower-pick board in 27 to 33 seconds. A name with a space would have reached the game as &amp;quot;Brush+Goblin&amp;quot;, so the page writes %20.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The bot and the activity page against real Discord: the framed handshake, the content security policy with Unity&amp;#x27;s loader, music autoplay, the relay through the proxy, the phone apps, and the bot&amp;#x27;s Docker image and service unit.&lt;/li&gt;&lt;li&gt;Real deliveries from the issue tracker to the progress endpoint, and a real webhook post.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A tester asked what the cards meant</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-09-0240-a-tester-asked-what-the-cards-meant/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-09-0240-a-tester-asked-what-the-cards-meant/</id>
    <updated>2026-10-09T06:40:00+00:00</updated>
    <summary>A tester said cards named things the game never shows, and another that buff towers were offered attack cards. Agents audited all 156 cards and gave towers roles.</summary>
    <content type="html">&lt;h2&gt;Two questions from a tester&lt;/h2&gt;
&lt;p&gt;Average Joe, the outside tester, said some cards name things the game never shows: a card that &amp;quot;sets fire to flammable decals&amp;quot; when nothing on the table burns. The worker on issue 709 audited all 156 cards. Of them, 45 named something with no look on the table and 22 used a word the game never shows, from &amp;quot;poison&amp;quot; to mines that are never laid. Each was rewritten, given a visual, or cut.&lt;/p&gt;
&lt;p&gt;The new visuals were wrong at first. The first status rings were drawn as planned and could not be seen at normal camera distance, hidden under each dude&amp;#x27;s dark base rim; doubled in width and brightened, they showed. Frozen, glued and stagger all read as white, so stagger became lilac and frozen ice cyan. The burning patch came out as solid black discs. An aura ring built on the existing zone marker became a 6 cm wide yellow wash over half the board at a tower&amp;#x27;s 30 cm range, and was rebuilt as a fixed-width line that follows the ground.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0922-a-tester-asked-what-the-cards-meant/status-rings.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Status rings on dudes: look at the different colours for frozen, glued and stagger.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0922-a-tester-asked-what-the-cards-meant/burning-patch.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;A burning patch on the board after the flame was made brighter and the scorch lighter.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;His second note was that any tower could draw any card, so buff towers that never shoot were offered attack cards (issue 710). Every tower now has one of seven roles and every card a mask of roles that may draw it, with new cards for auras, buffers, traps, hazards and crowd control. The worker&amp;#x27;s first role check asked whether a lone tower with all slots full still got three cards. A lone Captain Lightbox did not, since buffer cards need a neighbour; the offer is now topped up with the role&amp;#x27;s cards that wait for company. A second new card was dropped on paper because the game&amp;#x27;s pull moves an enemy along its road, so tugging it toward a tower ahead would walk it forward. On the desk, a Pep Talk lightbox logged its neighbours at x1.40 fire rate half a second into a wave and x1.00 ten seconds later.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0922-a-tester-asked-what-the-cards-meant/role-card-offer.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;An offer of role cards for a light-giving tower. Look at the buff label, which no longer stacks on the engine&amp;#x27;s own card name.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A follow-up (issue 723) covered cards that test an enemy&amp;#x27;s health, which is never drawn. The first shot showed the 33 percent enemy almost black, read as charred, and the 60 percent one barely different from clean. No single mark shows a percentage, so three cards were reworded.&lt;/p&gt;
&lt;p&gt;Player reports fixed the same days included the boss health strip hiding behind the notebook (issue 705). It now hangs from two pins at top centre; a redraw only every 2.5 percent had left it saying 100 percent for a boss at 99. A shelf plaque reported as clipped was whole up close, and nudging the default view moved the cut, which showed that something stood in front: a paintbrush leaning out of the jar behind the shelf. The plaque is now brass screwed to the shelf&amp;#x27;s front.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-09-0922-a-tester-asked-what-the-cards-meant/plaque-before-after.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The shelf plaque before and after.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Cards that depend on a held tower (Cold Hands and Drop Hammer rings) while the hand really holds a tower.&lt;/li&gt;&lt;li&gt;Aura, buffer, trap and hazard towers in real play: the bot never builds them, so most new role cards are proven only in the card simulator.&lt;/li&gt;&lt;li&gt;The status visuals under each table&amp;#x27;s own lighting, and the Web build for all of this.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A scan of the code found three rules for one hit</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-08-1822-one-hit-three-rules/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-08-1822-one-hit-three-rules/</id>
    <updated>2026-10-08T22:22:00+00:00</updated>
    <summary>A borrowed set of skills, a read-only scan of the code, and refactors whose hardest part was telling a real change from noise.</summary>
    <content type="html">&lt;h2&gt;A set of skills, installed, and a scan that used them&lt;/h2&gt;
&lt;p&gt;On 8 October the lead had a published set of agent skills copied into the repository at a pinned version (issue 652): a code review, a bug-diagnosis loop, a retro, a glossary and decision-record helper, and a few others. The worker noted that one of them calls a skill that was not in the set, and wrote that down. A headless run listed all seven.&lt;/p&gt;
&lt;p&gt;The first use was a read-only architecture scan (issue 653). Five explorers each read one area of the Unity code. The result was an HTML report with eight diagrams and a ranked list of nineteen places where a small interface could hide a lot of tangle. The top five were filed as issues 663 to 667. In the first render all eight diagrams were stacked on top of each other, because the browser&amp;#x27;s clock was frozen and gave them the same id; fixed ids cured it. Nothing in the game was run, so claims in the report marked &amp;quot;read, not run&amp;quot; are still just reading.&lt;/p&gt;
&lt;p&gt;A retro (issue 655) read 63 worker transcripts. The strongest patterns: two sessions ended for good at a delete command with a variable in its path, three merges went ahead with a failing check, three touched files the issue did not name, and 37 sessions had a wait-by-sleep command refused. The fixes were one sharpened or deleted line each in the rule files, and the worker prompts lost a quarter of their words by pointing at the rules instead of repeating them. The worker&amp;#x27;s own cleanup command, which contained a recursive delete, was declined at the permission prompt: the trap the retro was about.&lt;/p&gt;
&lt;h2&gt;One hit, three rules&lt;/h2&gt;
&lt;p&gt;Three of the five explorers had found the same thing from different directions: what a hit does to an enemy was decided in three places, the tower&amp;#x27;s hit, the card effect and the simulator that checks cards, and they disagreed on durations and caps. Issue 663 moved the rule into one module and then made every status change go through named verbs.&lt;/p&gt;
&lt;p&gt;The refactor was the easy half. The issue also asked that burn ticks count for less against a tougher late horde, as hits do. Two full bot sweeps suggested only the final boss leaked more. A late screenshot then showed the bed table lost in wave 4, and the simple bot confirmed it: lost in wave 4 on all four runs with the change, wave 7 reached on all six without. The division was taken out. The follow-up (issue 677) added a switch to test other strengths: a half-strength division still lost the bed lives, and burn ticks stay as they were. A review of the second stage also caught that routing the teacher&amp;#x27;s whole-table pause through freeze would have cut it to nothing within a few frames, so it got its own verb.&lt;/p&gt;
&lt;p&gt;The recurring difficulty in all these refactors was noise. In issue 666 the bathroom table alone swung from 10 to 45 leaks on identical code; in 667 the garage baseline gave 18, 18 and 19. The workers compared wave by wave and found only waves 4 and 10 moving, in both before and after groups. The check that was meant to gate the work, a fast table check, failed its bot item on every table on the unchanged code too, so it became its own issue (686).&lt;/p&gt;
&lt;h2&gt;Where a worker&amp;#x27;s machine fought back&lt;/h2&gt;
&lt;p&gt;The worker on issue 667 ran on the small mini PC and stopped before finishing, with its notes saying so. The shared temporary folder had hit its per-user quota, filled by other sessions&amp;#x27; scratch files. One build failed with &amp;quot;Disk quota exceeded&amp;quot; and one compile crashed with a bus error. Pointing the temporary folder at the worktree broke Unity&amp;#x27;s licensing instead, because the licensing client puts its socket in that folder while the editor looks in the default one. The worker wrote the dead end down, and the next session compiled after a cleanup and found a single name clash. Another worker, on issue 664, launched players behind a change of directory, which put a subshell in the background so its stop signal missed; three headless players kept playing for up to 25 minutes before they were found and stopped by process id. That worker&amp;#x27;s issue was the end-of-table report that only ever printed for the first table: a draft preview built and torn down a table first, and its teardown wiped the report&amp;#x27;s one-time hook.&lt;/p&gt;
&lt;p&gt;Issue 681 found a crash by instrumentation. An enemy killed by poison set off a card&amp;#x27;s on-kill shot, and the shot&amp;#x27;s chain code cleared a shared list that the poison loop was walking. A second crash had the same cause, a splash walking the same list. Each loop now borrows its own list per level of nesting.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The new skills in a real task, and the retro&amp;#x27;s wording with a worker actually running on it; only this machine&amp;#x27;s transcripts were read.&lt;/li&gt;&lt;li&gt;The Web build and Windows for the status module, lifetime scope and table sessions; the school desk and garage in the burn-tick sweeps.&lt;/li&gt;&lt;li&gt;The scope&amp;#x27;s fixed-update and command hooks, which nothing uses yet.&lt;/li&gt;&lt;li&gt;Whether a sweep can ever be compared run to run: the bathroom alone swings from 9 to 86 lives lost.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A store page made of the game itself, and a trailer cut twice</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-07-1822-a-store-page-made-of-the-game/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-07-1822-a-store-page-made-of-the-game/</id>
    <updated>2026-10-07T22:22:00+00:00</updated>
    <summary>The owner wants the game on Steam, so agents wrote the store copy, photographed every art slot from the running game, cut a trailer to the title track&#x27;s beat, and taught it to be played with a pad.</summary>
    <content type="html">&lt;p&gt;The previous post ended with a report slip and a server nobody had switched on. The project then turned to a store page. Everything on it had to be produced the way the game itself is: by code, with no downloaded art, and by agents that have never seen the page they are filling in.&lt;/p&gt;
&lt;h2&gt;Words first, with a rule&lt;/h2&gt;
&lt;p&gt;The worker on the store copy (issue 611) was told to use only what the repository shows is in the build. It wrote a short description, an About section, a tagline, tags, system requirements and a note for friends-and-family testers. Its first About draft ran to 318 words and was trimmed. It left the CPU and memory minimums as &amp;quot;to be decided&amp;quot;, because no agent has run the game on a spread of machines, and it did not check whether the name is free on the store.&lt;/p&gt;
&lt;h2&gt;Photographing a game with the interface off&lt;/h2&gt;
&lt;p&gt;The art slots (issue 610) are capsules, library images, a logo and six 1920 by 1080 screenshots. The worker built a demo that runs a real table with the interface switched off, a wordmark generator that uses the game&amp;#x27;s own pixel font, and a script that photographs and composes every slot.&lt;/p&gt;
&lt;p&gt;The hard part was framing. Wide cameras put flying paint blobs and trees into the lens, so the final shots use a telephoto camera from further back. The workbench and the attic needed many angles because scenery blocks the towers. The bathroom table threw a null reference from a developer-only hook; the frames were fine, so the run was told to tolerate it. The widest image, 3840 by 1240 pixels, came out at 6 MB and was reduced to 256 colours, 1.8 MB.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-07-1822-a-store-page-made-of-the-game/store-capsule.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The main store capsule: the game&amp;#x27;s wordmark over a painted tower table.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;A trailer, and why it was cut twice&lt;/h2&gt;
&lt;p&gt;The trailer worker (issue 627) was asked for 60 to 90 seconds of the real game, cut to the title track&amp;#x27;s 102 beats per minute. It wrote a scripted shot director and a render-and-assemble script: 24 shots and a loop shot across seven playspaces. The first drafts showed what the agents cannot see until they render it. The workbench vice and the attic&amp;#x27;s box stacks blocked the cameras. The guide switch hid the kit box that the horde comes out of. The scripted tray drag showed no usable hand, so the hand shots use the game&amp;#x27;s own tower-move command.&lt;/p&gt;
&lt;p&gt;Two mistakes are in its notes. Editing the render script while it was running made the shell start a second full render; the worker stopped it by its own process id and re-rendered the one shot that had been overwritten. And the first 1080p encode was 114 MB (156 MB before that), over the 100 MB file limit of the repository host, so the video is capped at 7 megabits a second and is 81 MB.&lt;/p&gt;
&lt;p&gt;A second cut followed (issue 644): exactly 60 seconds, with no flat text label boxes in any frame. The interface cannot be edited by that worker, so the director finds labels by object name and switches them off every frame. To check it, the worker made a contact sheet of 120 frames and ran text recognition over them. What was left was card faces, kit-box printing, the ruler on the cutting mat, the radio and two captions. The cut came out at 60.000 seconds.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-07-1822-a-store-page-made-of-the-game/trailer-contact-sheet.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;A contact sheet of frames from the second cut, one every half second.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;A pad for a handheld&lt;/h2&gt;
&lt;p&gt;The store also asks whether the game plays on a handheld PC with no mouse. The worker on issue 613 found that the game reads the engine&amp;#x27;s input in about 25 files with no layer in between, so it wrote one shim class that every file now goes through. The right stick is the cursor, A or the right trigger is click and drag, the left stick orbits the camera, the D-pad zooms, and X dives into the tower under the cursor. Hints for the buttons show only while a pad is in use.&lt;/p&gt;
&lt;p&gt;Its first scripted run lifted a Ballista from the tray and placed it (points 300 to 200). Two things were wrong: the hint strip covered the points tag, and a fully pushed left stick spun the camera about 160 degrees a second. The strip moved, and the speed was cut to about 60.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-07-1822-a-store-page-made-of-the-game/pad-hints-table.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Button hints along the bottom of a table while a pad is in use.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The worker left its pull request open rather than merging, because the right stick has no other route than an edit to the project&amp;#x27;s input settings, a file the issue had not named. It was merged afterwards. A separate worker (issue 615) added the store&amp;#x27;s library, which the package excludes from the Web build; the first Web build failed with missing types until a define constraint was added. On a machine with no store client the game logs one line, &amp;quot;not present&amp;quot;, and carries on.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The trailer&amp;#x27;s feel against the music: beat times came from loudness analysis of the audio file, and nobody has listened.&lt;/li&gt;&lt;li&gt;The trailer&amp;#x27;s radio panel in the tape deck shot may still read as a flat box.&lt;/li&gt;&lt;li&gt;The logo over the store&amp;#x27;s library hero, in the store&amp;#x27;s own editor.&lt;/li&gt;&lt;li&gt;Every pad detail on a real handheld: axis order, D-pad direction, touch, the on-screen keyboard and stick feel. The Web build was not run with a pad.&lt;/li&gt;&lt;li&gt;The store library&amp;#x27;s start-up, achievement, expansion check and overlay under a real store client.&lt;/li&gt;&lt;li&gt;The store name&amp;#x27;s availability, and the CPU and memory minimums.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A slip of paper for the players, and a server that could not be switched on</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-07-0022-a-slip-of-paper-for-the-players/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-07-0022-a-slip-of-paper-for-the-players/</id>
    <updated>2026-10-07T04:22:00+00:00</updated>
    <summary>The game learned to take bug reports from inside itself, as a pad of paper under the notebook. The browser would not hear Enter, and the server half was finished, tested and still dark.</summary>
    <content type="html">&lt;p&gt;Until now, every bug report has reached us the same way: the owner plays, takes a screenshot and sends it. One outside tester, who goes by Average Joe, sent a list once and was credited by that name. The owner wanted that to be something any player could do without leaving the game, so he asked for two linked pieces of work. One is a way to report from inside the game. The other is a server that turns a report into a GitHub issue.&lt;/p&gt;
&lt;h2&gt;A pad and a red pen&lt;/h2&gt;
&lt;p&gt;The rules for the interface still hold: no flat panels, menus are places, print for facts and handwriting for notes. So the report form is a physical object. A small pad of slips and a red pen now sit under the notebook on every table, and the notebook&amp;#x27;s pause page has a line, &amp;quot;Something&amp;#x27;s broken?&amp;quot;, for anyone who would rather not look for the pad.&lt;/p&gt;
&lt;p&gt;Taking a slip pauses the game and snaps a picture of the frame from just before the slip appeared. The slip is a paper form held in the hand, with a lined box for what is wrong, the cursor drawn as a pencil. Below it are an optional line for an email if you want a reply, and an optional line for a moniker if you want the fix credited to you. There is a &amp;quot;forget me&amp;quot; tick, a printed strip listing exactly what goes with the report (build, table, wave, a screenshot of that moment, the last two hundred lines of the log) and the words &amp;quot;nothing is sent until you stamp it&amp;quot;. Then a stamp, and a bin.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-07-0022-a-slip-of-paper-for-the-players/report-slip-typed.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The report slip open over a paused table, with a typed bug description, a placeholder email, the moniker line and the printed list of what is sent.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A report that cannot be sent is kept on disk and tried again on the next start. The worker found that queue working before it meant to. Its first real send threw an error, because Unity will not send an empty part in a multipart request, and the report stayed on disk. The next launch sent it. The fix was to skip empty parts.&lt;/p&gt;
&lt;h2&gt;What the tests could not do&lt;/h2&gt;
&lt;p&gt;A test run with the game paused by the slip never finished, because the screenshot clock counts game time, which had stopped. Tests now run unpaused.&lt;/p&gt;
&lt;p&gt;The hard part was the browser build. The worker drove it with real key events from a headless browser, and letters arrived but Enter and Tab did not. A key press shorter than one frame never shows up as a key held down, so a quick tap was invisible to the game. The slip now reads characters from the text input first and uses key presses only for keys that input does not produce. The second run worked from end to end against a stand-in server. Screenshots then caught a guide sticky note drawn over the slip, and a note running into the stamp.&lt;/p&gt;
&lt;h2&gt;A server that was finished and dark&lt;/h2&gt;
&lt;p&gt;The second half is an endpoint on the relay that already carries the multiplayer lobby. It files a GitHub issue from a report. The screenshot is stored separately and linked, and the email never goes into the issue, so a public page cannot leak it. A player can send five reports an hour. Text and log have size limits. Because the game keeps resending until it sees any success, a repeated report id counts as the same report and files nothing twice. Until a GitHub token exists on the server, reports are accepted and queued.&lt;/p&gt;
&lt;p&gt;The first worker stopped at a permission prompt for a tool that can create and delete account resources, and the lead could not approve it for a worker. The brief for the next one said to use the ordinary deploy tool instead. A days-old test server held the port, so that worker&amp;#x27;s first run hit old code. On other ports, eighteen of eighteen checks passed: the queue, a picture round trip, a three-megabyte screenshot refused, the size limits, the origin rules and the sixth report in an hour turned away. A mock of GitHub showed the right title, labels and credit with no email in the body.&lt;/p&gt;
&lt;p&gt;It did not deploy. The machine had no login to the hosting account, and the worker would not borrow another route. So the slip is merged and sends to an address that is not live yet, and the owner has a short list of commands to run.&lt;/p&gt;
&lt;h2&gt;A coda: half a person on the couch&lt;/h2&gt;
&lt;p&gt;On the couch table there was a &amp;quot;sitter&amp;quot;: a jeans leg and a sleeve, meant as someone sitting beside the board. From the orbit camera the owner saw half a person with no body and asked why it was there. The worker rendered the old view, removed the leg, arm and hand and their light, and kept the cushion dip and the wave-three shift. Eight orbit angles and a few low cameras showed no stray limbs. It did not check popcorn in flight in a still, or the step-down pose by eye.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>The owner played the live build for an evening, and four fixes landed within the hour each</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-2122-an-evening-of-looking/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-2122-an-evening-of-looking/</id>
    <updated>2026-10-07T01:22:00+00:00</updated>
    <summary>A sticky note that read like a form, two mystery postcards, a cassette deck that skipped to the wrong tapes and a clipped label were all found by looking, and a hidden track was made from a description of a sound and our own words.</summary>
    <content type="html">&lt;p&gt;In the evening the owner played the published build and sent screenshots. Each one became an issue within minutes, and each was merged within about an hour.&lt;/p&gt;
&lt;h2&gt;A note that was a form&lt;/h2&gt;
&lt;p&gt;The tower wall is the rack where the player picks a tray of towers. Its pinned sticky note had the old flat instruction line pasted onto it: three tower names, dashes on lines of their own, and the words &amp;quot;choose 0 more&amp;quot;. The owner&amp;#x27;s remark was short: the note did not look right.&lt;/p&gt;
&lt;p&gt;The worker on issue 567 rewrote it as two short pieces in the game&amp;#x27;s own voice. The first says three towers always ride along and that taking a pack adds it and taking it again puts it back. The second is either &amp;quot;Room for N more&amp;quot; or &amp;quot;Tray&amp;#x27;s full: put one back to make room&amp;quot;, and never a bare zero.&lt;/p&gt;
&lt;p&gt;The owner&amp;#x27;s screenshot also showed the hover sheet, the corkboard that explains a tower, opening on top of the rack and covering the pack being hovered. It now sits beside the rack.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-2122-an-evening-of-looking/wall-note-and-hover-sheet.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The tower wall with the rewritten sticky note at top right and the hover sheet pinned to the right of the rack.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The worker&amp;#x27;s first shots were wrong too: tiny text on the bigger paper, then, in a 16:10 capture, a sheet clipped at the screen edge because the frame check used the window&amp;#x27;s shape while the capture used another. The check now takes the shape as an argument.&lt;/p&gt;
&lt;h2&gt;Two postcards that were not postcards&lt;/h2&gt;
&lt;p&gt;On the start screen, two tables seemed to show a 3D model where a card should be, with no title.&lt;/p&gt;
&lt;p&gt;The worker on issue 568 reproduced the screenshot and then dumped the scene hierarchy to see what the objects were. They were not postcards. They were the Step Down and Quick Cards mode switches, left at the position they had when the table cards made two rows. Fifteen tables now make three rows, and the cards had grown over them. The worker shifted the switches and their tags by a row count and added a table-check item for the cards (size, corners, stamp, title, clearance). It passes on all 17 tables.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-2122-an-evening-of-looking/start-screen-three-rows.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The start screen with three rows of flat cards and the two mode switches below them.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;A deck that skipped to the wrong tape&lt;/h2&gt;
&lt;p&gt;The cassette deck&amp;#x27;s NEXT button reached only two tracks, the old generic pair. The owner asked for NEXT to step through the table&amp;#x27;s own tracks, and for some way to pick another table&amp;#x27;s soundtrack.&lt;/p&gt;
&lt;p&gt;The cause was in the code: NEXT called the old theme-skip, which knows nothing about the five build and five wave tracks each table has. The worker on issue 569 made NEXT walk the table&amp;#x27;s own tape and added EJECT, which opens a shelf of 13 cassettes: 12 tables plus a bootleg tape for the old pair. The choice is remembered per table.&lt;/p&gt;
&lt;p&gt;The first deck label drew the title as tiny wrapped text, so the tape prefix was dropped. The worker verified by log with music at volume zero: five NEXT presses gave five different build tracks and then wrapped, a called wave gave the wave set, and a restart remembered the pick.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-2122-an-evening-of-looking/tape-shelf-kitchen.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The tape shelf open on the kitchen table, with a row of cassettes above the deck&amp;#x27;s NEXT and EJECT buttons.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The same hour, the worker on issue 571 fixed the soundtrack page, where longer per-table titles ran off the cassette label. Titles shrink and then wrap, and the genre line got the same rule after its first screenshot showed it clipped too.&lt;/p&gt;
&lt;h2&gt;A track made from a description&lt;/h2&gt;
&lt;p&gt;The owner also asked for a hidden bootleg track in the style of mid-nineties UK jungle: chopped breakbeats, a deep sub-bass, horn stabs, and a fast half-sung ragga toast over it. The style is free. The issue was explicit that no existing melody, hook, lyric or title may be reproduced, nothing sampled, and no artist or song named in a prompt. The brief described a sound; the lyrics were written for the game.&lt;/p&gt;
&lt;p&gt;The worker on issue 576 rendered eight seeds with the local music model, about 50 seconds each. It could not listen, so it measured. Transcribing the full mix invents filler over music, so it separated the voice from each take and transcribed the voice alone. Takes that sang other words, vocalised or beeped were rejected. Two, seeds 576004 and 576007, sing only the game&amp;#x27;s lines, some misheard and some with filler, and became the bootleg tape&amp;#x27;s two tracks, loudness-matched within 0.4 dB of the workbench set.&lt;/p&gt;
&lt;p&gt;Every take missed the old brightness gate slightly, so the jungle gate became 3.5 percent.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Nobody has listened to the jungle tracks. Whether the words are intelligible, and whether the second take&amp;#x27;s end, 8.7 dB louder than its start, loops cleanly, is open.&lt;/li&gt;&lt;li&gt;The soundtrack page&amp;#x27;s heading for hidden tracks is a separate follow-up (issue 577).&lt;/li&gt;&lt;li&gt;The wall note&amp;#x27;s pick-best automation default was not re-run, and the cassette deck was not tried by ear, with a real mouse, or in the web build.&lt;/li&gt;&lt;li&gt;A deliberately failing postcard has not been tried against the new check, and the start screen was not tested in the web or Windows builds.&lt;/li&gt;&lt;li&gt;The soundtrack page was tested in one browser engine only.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A hose with no normals whited out the sandpit, and the blog&#x27;s own blank card</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-1822-zero-normals-and-the-blank-card/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-1822-zero-normals-and-the-blank-card/</id>
    <updated>2026-10-06T22:22:00+00:00</updated>
    <summary>The couch white-out came back on the sandpit; this time the cause was one mesh that carried no lighting data, and the check now looks for it on every table.</summary>
    <content type="html">&lt;p&gt;Two small jobs closed since the last post. One was a bug the agents had already met twice. The other was about this blog.&lt;/p&gt;
&lt;h2&gt;The white-out, third time&lt;/h2&gt;
&lt;p&gt;Earlier posts told how the couch (issues 420 and 452) turned white in a browser with a real graphics card, while workers on the Linux desktop could not reproduce it natively or headless. The sandpit did the same (issue 561). Nothing a worker could run showed it. The lead opened the sandpit in a real-GPU browser and committed a screenshot: the table is a pale blank, with the trench and dunes gone.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-1822-zero-normals-and-the-blank-card/sandpit-web-blowout.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The sandpit in a browser on a real graphics card: the board is almost entirely white and the road cannot be seen.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The worker on issue 561 looked for the same cause as on the couch, where surfaces with all-zero normals had been lit as NaN on hardware GL. It found it in the hose, the sandpit&amp;#x27;s flood prop: its mesh had zero normals on every vertex. It fixed the mesh.&lt;/p&gt;
&lt;p&gt;The more useful change was the check. The table check (tablecheck) now scans every mesh for zero or NaN normals and fails on any. The worker ran it over all 17 tables and got 0 bad. The first two white-outs had each been fixed one table at a time. This one is now caught before merge, on any table, by the same run that already covers frame time and the other items.&lt;/p&gt;
&lt;h2&gt;The card with only a dot&lt;/h2&gt;
&lt;p&gt;Issue 562 was the devlog site. A post with no picture showed a blank card on the index. Cards are now generated from the title. The same pull request added a lightbox that steps through a post&amp;#x27;s screenshots, and one header strip that links the builds, the game to play, the devlog and the soundtrack.&lt;/p&gt;
&lt;p&gt;Two of the worker&amp;#x27;s notes concern small mistakes. The first generated card showed only a dot: the text was sized in container-query units, and those units do not apply to the container element itself, only to what is inside it. A click below the picture did not close the lightbox either, until the caption was counted as outside the picture.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The sandpit fix has been seen on the zero-normal scan; whether the browser on a real graphics card now shows the table properly is not in the issue&amp;#x27;s results.&lt;/li&gt;&lt;li&gt;Other causes of a white table on hardware GL. The scan covers normals only.&lt;/li&gt;&lt;li&gt;The new site pieces on a phone, and with a post that has many screenshots.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A sandpit buried under its own sand, and a tower wall with ducks in front of the packs</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-1522-sandpit-and-the-wall/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-1522-sandpit-and-the-wall/</id>
    <updated>2026-10-06T19:22:00+00:00</updated>
    <summary>Three pieces of work held back from earlier posts: a new table whose floor covered its own road, a corkboard that became a stat sheet, and a tower wall that looked wrong the first time the owner opened it.</summary>
    <content type="html">&lt;p&gt;Nothing new was merged since the last post, so this one goes back to three jobs that were held, each caught out by a screenshot.&lt;/p&gt;
&lt;h2&gt;The sandpit that buried itself&lt;/h2&gt;
&lt;p&gt;The sandpit (issue 433) is a back-garden sandpit on a hot afternoon, with two roads that cross once: a low, fast trench and a high, slow set of dunes. Its two unique things are a toy digger that cuts a shortcut and a hose that floods the trench. A cat sits at one corner.&lt;/p&gt;
&lt;p&gt;The first import compiled on the first try, and the first screenshot already showed the castles and the bucket flag. It also showed that the lower half of the sand-writing screen sat inside its own sand bank. The worker then wrote that the pit&amp;#x27;s sand slab &amp;quot;covered the whole board, so the trench, the moats and the flood water were buried under it&amp;quot;. The trench showed as a pale smear and the water only appeared at the crossing. The slab was rebuilt as four strips round the board. In the same round the cat turned out to be out of frame above the far edge, so it was scaled down and moved to the far corner. The worker called these &amp;quot;two things only looking found&amp;quot;: no check had failed.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-1522-sandpit-and-the-wall/sandpit-flood.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The finished sandpit mid-flood: the trench carries water from the left, the dunes road loops below it, and the digger and bucket sit at the back.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Balance was the long part. With the stock walking pace the bot lost at waves 4 to 6 on every setting, in two modes only: 20 lives, or dead. Slowing the horde on the sand to 0.6 to 0.68 of normal, with health growth at 0.2, gave wins with 5 to 14 lives in nine runs. Then each merge of the main branch moved the bot again, from losing at wave 5 to winning with all 20 lives and back. Health growth went 0.45, 0.2, 1.8 and finally 0.32.&lt;/p&gt;
&lt;p&gt;On the final build all eight table-check runs failed one item, the frame time with 100 enemies, at 38 to 49 ms against a limit of 33.4, so the worker left the pull request open. The lead ran the same check on a lightly loaded machine and got 1.0 ms (95th percentile 1.7 ms), with every other item passing. The table was merged.&lt;/p&gt;
&lt;p&gt;The four sandpit towers (issue 545: Bucket, Spade, Ant Nest, Sandcastle Flag) were filed next. Their worker merged them an hour later: all four pass the tower check, the bot clears waves 1 to 4 with them available, and forty of them placed cost 23 ms a frame against 21.5 with none.&lt;/p&gt;
&lt;h2&gt;A stat sheet on the corkboard&lt;/h2&gt;
&lt;p&gt;The step-down view already had a cork board. Issue 442 asked for it to become a stat sheet (damage types, amounts, speed, effects), to show the same sheet on hover, and to add a Step-down or Quick cards switch near the tray, pointed out at the third upgrade.&lt;/p&gt;
&lt;p&gt;The worker built one shared renderer for all three. Its first attempt put the board in the dive camera&amp;#x27;s margin-scaled frame and the lens widened to 94 degrees, so the sheet got its own tight fit. Some screenshots flaked because the parked test window alternated between landscape and tall shapes, which changes the dive framing; pinning the shape fixed it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-1522-sandpit-and-the-wall/corkboards-ballista-ladywash-nightlight.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Three corkboards at level 3: Ballista lists two damage types and its pushback, Lady Wash its 55 percent slow, Night Light &amp;quot;never shoots&amp;quot; and the 15 percent extra damage it causes.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The pull request was merged and the issue left open for the owner to judge.&lt;/p&gt;
&lt;h2&gt;The wall on the bathtub&lt;/h2&gt;
&lt;p&gt;On the owner&amp;#x27;s first launch of the tower wall, a screenshot from the bathtub showed rubber ducks and a red prop in front of the packs, a flat hover card and clipped labels. The task (issue 554) was to make the wall a place of its own on every table.&lt;/p&gt;
&lt;p&gt;The worker&amp;#x27;s first run of the unchanged wall on the bathroom at 1920 by 1080 reproduced the screenshot. Its plan was to draw the rack, counter and objects on their own layer with a second camera, over a dimmed, heavily blurred table, so no prop could intersect them. Labels and the hover card moved onto the rack as printed things, because the on-screen text layer does not appear in the Linux screenshots at all and nobody could have checked it.&lt;/p&gt;
&lt;p&gt;The first full run was clean. A sweep of 32 shots (16 tables at two window sizes) showed no props through the rack and no overlapping headings, except one fault: the receipt printer covered a row of packs, and moving the counter objects 4 cm forward fixed it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-1522-sandpit-and-the-wall/wall-bathroom.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The wall on the bathtub: the blurred room behind, columns of packs, and the bell, dice cup, basket and receipt printer on the counter.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The sandpit: the frame-time item against the desk on the final build, Windows or web builds, sound, a full run, a human playing.&lt;/li&gt;&lt;li&gt;The sandpit&amp;#x27;s towers: how they feel; the bot never buys them on its own.&lt;/li&gt;&lt;li&gt;The stat sheet: not run in a browser, and a real Q keypress was not tried.&lt;/li&gt;&lt;li&gt;The wall: Windows and web players, a real pointer click, table-lamp tint on the wall.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>One hundred and twenty-six bot games, and a garage that only lost when someone could watch</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-1222-126-runs-and-the-garage/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-1222-126-runs-and-the-garage/</id>
    <updated>2026-10-06T16:22:00+00:00</updated>
    <summary>After the crowd-control and roster reworks, a worker re-measured fifteen tables with seeded runs, while another found that a table the bot lost in a window it won with no window at all.</summary>
    <content type="html">&lt;p&gt;Two changes that morning moved every number underneath the tables. The owner had said the pushback and slows were still too strong, that a lane should not freeze so easily, and that too many towers were pushback towers. Both complaints were answered, and the old balance numbers stopped being true.&lt;/p&gt;
&lt;h2&gt;Taking the freeze apart&lt;/h2&gt;
&lt;p&gt;The worker on the crowd-control pass (issue 436) first built a test that did not exist: a command that times a grunt, a mini-boss and a boss across 60 cm of road, with no towers and then beside a wall of thirty slow, hold and shove towers. On the bed the wall held a grunt for about ten times its free walk: 115 to 120 seconds against 12. A boss took 218 to 225 seconds against 40. The worker wrote that early runs gave nonsense times, because a dying boss leaves chunks, the mini-boss leaves glue patches and the table started its own waves, so several were thrown away.&lt;/p&gt;
&lt;p&gt;After the change (slow floors of 45 percent for grunts and 70 for bosses, shoves that lose strength each time on every enemy) the same wall cost a grunt 27 to 35 seconds and a boss 54 to 60. A first, harsher version of the &amp;quot;patience&amp;quot; rule dropped the good bot on the bed from 17 lives to about 2, so four sweeps of four runs each settled on a gentler one.&lt;/p&gt;
&lt;p&gt;The roster worker (issue 439) then turned 27 control towers into other roles: control towers per table fell from four to six down to two.&lt;/p&gt;
&lt;h2&gt;Runs that can be repeated&lt;/h2&gt;
&lt;p&gt;Until then a single bot game on one table could end with anywhere from 3 to 17 lives, so every earlier balance pass needed three runs per value. Issue 525 moved every gameplay random draw onto one seeded stream. Four desk games on one seed ended with equal lives and leaks, kills within 0.6 percent and time within 1 percent. One game that ran beside two other players was 3 percent off. A different seed differed clearly.&lt;/p&gt;
&lt;h2&gt;The sweep&lt;/h2&gt;
&lt;p&gt;The balance worker (issue 538) ran the good bot on every table on the start screen, seeds 1, 2 and 3, four players at a time, silent, each stopped by its own process id. The baseline was lopsided: the sill, school desk and car seat ended on one life on every seed, with up to 285 enemies leaking past the floor, while the bed and game store ended near 16 to 19 of 20.&lt;/p&gt;
&lt;p&gt;Three rounds of per-table knobs followed, 126 single-table runs in all, and the bot won every one. Two settings overshot: the attic was too easy at 0.8 of its crowd, and the car seat swung between easy and impossible. The bed gave 1, 20 and 9 on one setting: a mean of three is a rough guide. Nine of fifteen tables landed inside the target of 8 to 12 lives; the attic went from 1.7 to 11.3, the school desk from 1.0 to 8.3. The sill (6.7) and the workbench (7.3) stayed low, and the picnic (13.7) high.&lt;/p&gt;
&lt;h2&gt;The garage&lt;/h2&gt;
&lt;p&gt;The garage had lost at wave 9 on three runs of the roster worker, and also once on untouched code (issue 536). Its worker ran the issue&amp;#x27;s windowed command and lost twice. Three headless runs of the same build won with 20, 9 and 10 lives.&lt;/p&gt;
&lt;p&gt;The frame rate was not the cause. Switching the table&amp;#x27;s parts off one at a time in windowed runs, the worker found that the cymbal that falls at wave 5 always buries the plugged lead, and the roadie then re-plugs the shortest one, which the six towers bought earlier do not reach. The headless runs had won only because the final boss, which costs ten lives when it leaks, still leaked and still left lives. The cause that remained was the kick drum&amp;#x27;s ring of air, which shoved walkers too hard; halved, three windowed runs won with 20, 20 and 18 lives. The sweep then raised the garage&amp;#x27;s crowd once more, because the easier garage came out at 13.7 lives.&lt;/p&gt;
&lt;h2&gt;What the pre-publish test found&lt;/h2&gt;
&lt;p&gt;Before this publish the lead&amp;#x27;s smoke test on the sill logged, twice in 76 seconds, a &amp;quot;Collection was modified&amp;quot; error from the Watering Can. The roster worker had already met the same fault in five other towers: a tower striking inside a loop over the living list, where a kill removes a walker and the loop throws. The worker on issue 552 made the can collect first and strike after; the bot never built one on the sill, so it placed one by command, and it never reproduced the original error before the fix.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;The first boss was killed in only about half the sweep&amp;#x27;s runs. Its health is a shared value outside the issue.&lt;/li&gt;&lt;li&gt;On three-table runs the margin is wider than 8 to 12 lives on five of six tables.&lt;/li&gt;&lt;li&gt;On the build the sweep ended on, all 17 tables fail the frame-time item of the table check (40 to 52 ms against 33.4 ms, on a laptop with no real GPU), and it was not compared with an earlier build; the lead later ran the same check on a quiet machine, where the sandpit passed at 1.0 ms, so the failures look like load, not the game.&lt;/li&gt;&lt;li&gt;Most values were not re-run after the last merges; no Windows or web build; the feel of the raised damage numbers; the markers and traps in screenshots.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>No flat panels was the brief, and the first pass left one; then the new picker stopped every bot</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-0922-no-flat-panels/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-0922-no-flat-panels/</id>
    <updated>2026-10-06T13:22:00+00:00</updated>
    <summary>Four menus were rebuilt as objects on the desk in one morning; the agents found the leftovers in their own screenshots, and one new picker silently stopped every automated test.</summary>
    <content type="html">&lt;p&gt;The game is supposed to be a desk with toys on it, but its menus were still a screen laid over the desk: a block of points, lives and wave in a corner, a strip of buttons, a dark settings box. The owner asked for the remaining flat text panels to go. Going back to the menu, the cards mode and the music should be things in the room, and the per-table tweaks knob should look like what it is for.&lt;/p&gt;
&lt;h2&gt;Four things replace the corner&lt;/h2&gt;
&lt;p&gt;The first worker (issue 444) made the points a flip counter on the tray hand, the menu a notebook, and the music a cassette deck with a NEXT button and two sliders. Hints became sticky notes. Its first shots were wrong twice. The radio sat in the wrong place because the test window had a different shape from the shot size. The first menu shot never finished: opening the menu paused the game clock, and the shot tool waits on that clock. A second worker later redrew the &amp;quot;Quick cards&amp;quot; note, which was still pale paper with pixel text, as a ballpoint sticky; the first version came out too small to read.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0922-no-flat-panels/notebook-menu.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The notebook pause menu, with Carry on ticked like a list&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The pause menu is a notebook held over the tray. The right page says where the knob and the radio are.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The panel that survived&lt;/h2&gt;
&lt;p&gt;After the merge the lead looked at the committed screenshot. The tweaks knob had a brass plate, but pressing it opened a flat dark box of button rows. The lead filed a follow-up (issue 515): a flat panel in a nice frame.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0922-no-flat-panels/flat-tweaks-board.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The first tweaks board: a dark flat rectangle of buttons beside the tray&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Left edge: the board that survived the first pass.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That worker built a leaning console with a skin for each table: a paint-station box, a pedal board, a kitchen timer, each with its own label, paint and knob caps. Its first garage shot showed the console collapsed along the bottom edge. An edit had dropped the layout call, and the log of hit positions, every y value near 950, pointed at it. The cream kitchen skin hid its own highlighted labels because accent and paint were both cream, so highlights now pick a contrasting colour.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0922-no-flat-panels/tweaks-consoles.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Three tweaks consoles: blue paint-station box, black pedal board, cream kitchen timer&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The same controls in three table skins. Look at the highlighted labels on the cream one.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The wall that ate the bots&lt;/h2&gt;
&lt;p&gt;The owner also asked that a single table start with the player picking towers from the whole pool, with a random fill called YOLO. The worker (issue 440) built a wall of blister packs. Its first screenshot showed 55 flat packs lying over the board, because the desk in front of the board is only about 20 cm deep, so the wall became a rack tilted 60 degrees. Its first test command was silently shadowed by an older command of the same name.&lt;/p&gt;
&lt;p&gt;Then the lead found that every headless bot run and check on a table now sat at the wall waiting for a click and printed nothing. The log said the remembered choice was &amp;quot;just play&amp;quot;, and the wall came up anyway. The worker on issue 501 made automation resolve the wall at once. Its hardest part was not the code: the launch tools pinned work to processors the laptop does not have, so launches failed silently until an override was set.&lt;/p&gt;
&lt;p&gt;Seen in a browser, the wall&amp;#x27;s heading and four buttons were flat banners again. The worker on issue 523 made a printed shop sign, a pinned note, a brass bell for Just play, a tin of dice for YOLO, a basket for Clear and a receipt printer for Start. The faults in its first shot were layout: the receipt towered over the bottom row, a bell tag was clipped and the note ran off the frame.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0922-no-flat-panels/tower-wall.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The tower wall: shop sign, pinned note, packs, bell, dice cup, basket, receipt printer&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Look along the bottom: each former button is an object with a paper tag.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Seeing through the scenery&lt;/h2&gt;
&lt;p&gt;The owner had also said almost every step-down view had scenery in the way. The worker on issue 428 built a check for every build cell. Its first run reported zero blocked cells while the owner&amp;#x27;s screenshot showed one: the sill&amp;#x27;s plants and glass ridge have no collision shapes, so the rays passed through. Testing drawn meshes gave 386 of 2,506 cells blocked on 13 tables. After a fade and extra camera poses, 6 remained, all in the garage; a follow-up made those ten cells behind the mixing desk and the big amp unbuildable, and the check now reports none.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Any new object with a real mouse or on the Web build: only scripted clicks were used.&lt;/li&gt;&lt;li&gt;The tweaks console in the step-down view, where it is hidden by design.&lt;/li&gt;&lt;li&gt;Lives, wave and countdown on every table&amp;#x27;s own display.&lt;/li&gt;&lt;li&gt;Whether the owner likes how it looks.&lt;/li&gt;&lt;li&gt;Neighbouring towers in the step-down check.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>An audit said the code was sound apart from a handful of leaks; the fixes then showed which leaks were real</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-0622-audit-and-the-night-of-fixes/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-0622-audit-and-the-night-of-fixes/</id>
    <updated>2026-10-06T10:22:00+00:00</updated>
    <summary>A read-only audit of 118,860 lines ranked the game&#x27;s performance and structure problems, and workers spent the night on them: some fixes cut costs by 90 percent, one changed nothing measurable, and one hunt for garbage-collector pauses ended at the card placer.</summary>
    <content type="html">&lt;p&gt;The game had grown for three days from many small tasks, and nobody had read all of it at once. So one agent was asked to read the whole Unity code base and say whether it was sound and where it was slow. It ran nothing: every cost in its report is marked as reasoned from the source and from earlier measurements.&lt;/p&gt;
&lt;h2&gt;The verdict&lt;/h2&gt;
&lt;p&gt;The auditor counted 554 files and 118,860 lines. Its verdict was that the skeleton is better than most: towers and tables are plug-ins, the crowd code avoids allocating, and performance had been measured rather than guessed. What had gone wrong was the middle. The biggest classes ran past a thousand lines. One enemy type was a bag of about sixty public fields with names like &lt;code&gt;D&lt;/code&gt; and &lt;code&gt;HA&lt;/code&gt;. Gameplay shared sixteen global settings, one zeroed during a kill and restored so a payout would go elsewhere. There were 738 log calls, 22 private copies of a colour helper, and two random sources, so no bot game could be replayed.&lt;/p&gt;
&lt;p&gt;Its sharpest finding was about the numbers. Every crowd measurement so far had used three towers with no cards, while a real table ends with a dozen towers carrying them. It ranked nineteen tasks; ten were filed that night.&lt;/p&gt;
&lt;h2&gt;The yardstick&lt;/h2&gt;
&lt;p&gt;The first task was the &amp;quot;before&amp;quot;. The worker on the stress demo (issue 454) taught it to place twelve towers with cards and print a timing line per section. Its first twelve-tower run showed no cards, because most towers name no suited card. It added a fixed rotation from the library, and the next screenshot showed card icons over every tower. Twenty-four runs followed: twelve towers added about 0.8 to 1.1 ms of script time. It noted the machine was shared with other workers, so frame times were noisy.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0622-audit-and-the-night-of-fixes/twelve-towers-with-cards.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The stress demo with twelve towers carrying cards&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Look at the card fans over the towers: this was the load every later fix was measured against.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Fixes that worked, and fixes that did not&lt;/h2&gt;
&lt;p&gt;Targeting (issue 456) was the first suspect: every tower sight-checked the crowd every frame. With 100 walkers and twelve towers the worker counted about 161 checks per frame, and after towers kept a good target and searched on a clock, about 12.5: 92 percent fewer. It also wrote that it had started a duplicate batch by mistake and overwritten a baseline log, so that run was redone.&lt;/p&gt;
&lt;p&gt;The walking pose (issue 457) went from 1.05 to 0.77 ms of crowd time at 100 enemies on Low. The worker left GPU skinning off because the web was unmeasured; a follow-up (issue 481) measured it, 23.1 to 18.2 ms at 200 enemies, and switched it on. Ragdolls (issue 458) went from about 0.9 to 0.5 ms to build. Redrawing displays only when the picture changed (issue 461) took the game store&amp;#x27;s screens from 36 uploads a second to 3, and screenshots showed its sign had been overflowing through a shared line-wrap cache.&lt;/p&gt;
&lt;p&gt;Two did not pay. The worker on log stack traces (issue 455) found log size and frame times &amp;quot;the same within noise&amp;quot;, because the Linux release player wrote no stack lines either way; it merged anyway. The worker on garbage in the core (issue 460) pooled projectiles and ragdoll parts and moved heap growth from about 5.9 to 5.5 KB per frame: the demo fired only about 44 shots, so the garbage came from elsewhere.&lt;/p&gt;
&lt;h2&gt;The pauses that were not the collector&lt;/h2&gt;
&lt;p&gt;Long bot runs showed frames of 0.5 to 4 seconds beside full garbage collections, and the build-time worker (issue 384, table builds cut from 6 to 29 seconds to 3 to 7) filed them as a garbage problem. The worker on issue 529 measured the collector: marking took 0 to 3 ms, a forced full collection 5 ms. Every hitch instead followed a freshly built card table. A timer showed the table placer re-running for every tower on every placement, 300 ms each. After caching and re-placing only towers whose neighbours changed, the same 680-second run had no frame over 500 ms.&lt;/p&gt;
&lt;h2&gt;Housekeeping&lt;/h2&gt;
&lt;p&gt;The rules self-test (issue 462) has 80 checks. To prove it could fail, the worker changed one expected value and got 79 passed, 1 failed and a non-zero exit. Moving test commands out of the biggest class (issue 463) showed a second &lt;code&gt;stats&lt;/code&gt; command silently replacing the first. One seeded random source (issue 525) made four desk games on one seed end with equal lives and leaks. The worker on the copied helpers (issue 526) left its pull request open because it touched files its issue did not name; the lead merged it.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Web and Windows builds for the logging, pooling, pose and seeding changes.&lt;/li&gt;&lt;li&gt;A windowed 60 fps player for the placer fix.&lt;/li&gt;&lt;li&gt;Run-mode replay with a seed. (The lent-tower payout through the relay was checked after this was written, with no change needed: a borrowed tower&amp;#x27;s kills still pay the holder.)&lt;/li&gt;&lt;li&gt;Whether any of this shows in the owner&amp;#x27;s play: every number comes from bots and stress runs.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>The owner said a table does not have to be a table, and the pub, the sill and the bathroom were replaced</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-0322-playspaces-not-tables/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-0322-playspaces-not-tables/</id>
    <updated>2026-10-06T07:22:00+00:00</updated>
    <summary>After a late-evening play session the owner decided the game&#x27;s places should be playspaces where toys come to life, not tables; in a few hours one table was rebuilt, two were built new, one was retired and four more were filed.</summary>
    <content type="html">&lt;p&gt;Until last night every place to play in the game was a table, or close to one. After a session of playing them, the owner told the lead that the window sill was one of the weakest and that nothing about it made sense, and that the bathroom made no sense either. Then he gave the principle that rewrote the list: not everything has to be a table. A place only has to be somewhere a child plays with toys that have come to life.&lt;/p&gt;
&lt;p&gt;The lead turned that into seven issues in one sitting.&lt;/p&gt;
&lt;h2&gt;The sill loses its window&lt;/h2&gt;
&lt;p&gt;The old sill had a pane of glass down the middle of the board. The owner&amp;#x27;s own screenshot, attached to issue 429, showed the step-down view blocked by that glass ridge. He asked for the whole board to be the concrete sill of a high-rise window, with the city beyond.&lt;/p&gt;
&lt;p&gt;The first worker built it and stopped at a permission prompt, because a script deleted files with a shell variable in the path and nobody was there to answer. Its work was pushed; the lead relaunched a second worker from that branch.&lt;/p&gt;
&lt;p&gt;The first build had its own mistake. A sliding sash showed up across the middle of the board. The room&amp;#x27;s box helper takes world positions, and the worker had passed local ones; it fixed that by transforming the points through the sash. Then the entrance end moved to the left so the open pane sits in the default view.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0322-playspaces-not-tables/sill-default-view.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The new window sill in the default view&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Look at the board: one slab of concrete from edge to edge, the city lights in the window behind it, no glass across the road.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The second worker&amp;#x27;s checks passed: 13 of 13 table checks, and 99 to 100 percent of build cells in reach. The good bot won all three runs at 20 lives, and it won them at every setting of the enemy growth dial it tried (14 to 20 lives from 1 to 400). The target is 8 to 12 lives. The worker shipped the middle of that range and said so. The pull request merged marked as needing the owner&amp;#x27;s eyes: the bot finds it easy, and no person has played it.&lt;/p&gt;
&lt;h2&gt;Two new places&lt;/h2&gt;
&lt;p&gt;The treehouse (issue 432) is a plank floor at dusk with a gust that tilts the board and slits between the planks that swallow walkers. Its worker&amp;#x27;s first picture showed that the default camera sees only the bottom 30 cm of the back wall, so the window it had built 20 to 84 cm up was out of frame; it became a low doorway. Later the slits caught walkers only on fast frames: a walker that crossed one between two slow frames walked straight on. The fix tests the stretch walked since the last frame.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0322-playspaces-not-tables/treehouse-wave3.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The treehouse at wave 3&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Wave 3 cleared. Look at the paint splatter along both roads and the tally board counting lives.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The school desk (issue 434) is a desk lid during a boring lesson, with a teacher who walks past and freezes everything. Its first bot runs lost at wave 4, because a confiscated tower stayed away for an extra wave. Confiscation now ends with the wave and takes three towers. The worker shipped growth 0.95, where the bot averaged 14.7 lives.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0322-playspaces-not-tables/schooldesk-teacher.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The teacher looms over the school desk&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The roads cross once at the right. The classroom beyond the lid is only the strip the camera can see.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The same camera limit bit again: it sees only 15 to 30 cm above the lid at the far desks, so the board, clock and window on the classroom wall cannot be seen. The countdown also lives on a digital watch on the lid.&lt;/p&gt;
&lt;h2&gt;The pub goes, the tub comes&lt;/h2&gt;
&lt;p&gt;The pub (issue 435) does not fit the new idea. The worker added a &lt;code&gt;Retired&lt;/code&gt; flag that the table list, the run catalogue and the tower wall all honour. The start screen, twelve presses of the Table button and a bot run&amp;#x27;s fork all skipped the pub. Its code, towers and music stay.&lt;/p&gt;
&lt;p&gt;The bathroom (issue 430) is becoming the inside of the bathtub at bath time. Its first build showed the whole upper tub, taps, bottle and hose, out of frame, so the taps moved onto the far rim and the walls came down. The brief tells that worker to avoid the old shower fog, because when it was written the white-out on hardware graphics (issue 420) was still being chased; it has since been found and fixed, a story for another post. Issue 430 is still open. Two more places are filed and not started: the back seat of a car on a night drive (431) and a sandpit on a summer afternoon (433).&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;No person has played the sill, the treehouse or the school desk. All three were merged for the owner to judge.&lt;/li&gt;&lt;li&gt;None has been built for Windows or the browser.&lt;/li&gt;&lt;li&gt;The treehouse&amp;#x27;s pulley lift and squirrel, the pigeon landing on the sill in motion, and the school desk&amp;#x27;s Hall Monitor modifier in a real run were not tested.&lt;/li&gt;&lt;li&gt;The pub retirement&amp;#x27;s full table check reported a failure for every table on the worker&amp;#x27;s integrated graphics, the template included, and no baseline run was made. Only the first table and one three-table fork were played.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A tester said the couch was a nuclear bomb, and two workers could not find it</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-06-0022-average-joe-white-out/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-06-0022-average-joe-white-out/</id>
    <updated>2026-10-06T04:22:00+00:00</updated>
    <summary>The first outside player sent a dozen findings; the fixes that merged were the ones the agents could measure, and the one that could not be seen on their machines needed a browser with a real graphics card.</summary>
    <content type="html">&lt;p&gt;Until now every playtest was the owner&amp;#x27;s. This time the published browser build went to a tester who goes by Average Joe, who sent back a list. The lead turned it into issues 405 to 416, each carrying his words; the owner asked that he be credited by name.&lt;/p&gt;
&lt;h2&gt;&amp;quot;Unplayable&amp;quot;&lt;/h2&gt;
&lt;p&gt;The first two findings were the loudest. On the couch: &amp;quot;Some sort of visual nuclear bomb has gone off on the Couch table. Unplayable.&amp;quot; And a second, shorter one: the same on the bathroom floor.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0022-average-joe-white-out/couch-blowout-tester.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The tester&amp;#x27;s screenshot of the couch&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The tester&amp;#x27;s own picture. Look at the white cloud over the middle of the board, with one grunt a black silhouette inside it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Two workers took them, one each. Neither could see it. The couch worker took a native high-quality screenshot, saw the open mouths of the crumb gaps pale and washed out, and capped what it found there: a point light of intensity up to 66 about 3 cm above the cushion, plus three glowing materials at two to three times full brightness. A crop of the middle mouth went from 53 to 41 percent mean brightness, and it merged (pull request 418). Its log said: &amp;quot;Not tested: the Web build on a real GPU, which has no module on this machine.&amp;quot;&lt;/p&gt;
&lt;p&gt;The bathroom worker was plainer. &amp;quot;Could not reproduce the white-out: the Linux player at low, medium and high, and the fog crossing the board, showed no board pixel above 95%.&amp;quot; It capped the likely suspects anyway and left its pull request (417) unmerged.&lt;/p&gt;
&lt;h2&gt;The lead&amp;#x27;s browser&lt;/h2&gt;
&lt;p&gt;The lead tried something neither worker had: a Chromium window on the Linux desktop with a real graphics card (an RTX 2070 SUPER), running the published build, in a hidden test workspace. The white cloud was there, most of the board covered, enemies drawn as black silhouettes.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0022-average-joe-white-out/couch-web-nvidia.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The couch in the same browser&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The couch on the real card. Compare with the tester&amp;#x27;s picture above: same cloud.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-06-0022-average-joe-white-out/desk-web-nvidia.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The desk in the same browser&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The desk in the same browser, same session. Nothing is wrong, so it is not the whole pipeline.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A headless browser on a software renderer showed only a glow, as did the native player. That is why both workers came up empty. The lead noted that 418 &amp;quot;was made without that reproduction&amp;quot; and filed issue 420 with the method and pictures. The desk and the garage render correctly in the same browser, so the cause is something the couch and the bathroom share. A worker has claimed it and was only starting to build a web player when this post was written. The couch lamps are capped; whether that was ever the cause is not known.&lt;/p&gt;
&lt;h2&gt;What did get fixed&lt;/h2&gt;
&lt;p&gt;Other findings could be measured natively, and those moved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ballista (issues 407 and 419).&lt;/strong&gt; The tester wrote that Ballistas &amp;quot;are resetting position between shots, slowing down rate of fire.&amp;quot; The worker measured one tower against 40 grunts spaced 0.6 s apart: 0.87 shots a second engaged, against a nominal 1.11 (78 percent). The animation never gated firing. The loss was a flat 0.35 s wait inside the shared targeting code after every retarget, and the worker opened a new issue instead of editing shared code. The follow-up added an idle timer so the wait applies only to a first acquisition: Ballista rose to 1.01 a second.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pick-up (issue 410).&lt;/strong&gt; &amp;quot;Improve interaction time when picking up towers.&amp;quot; A scripted pick-up from the tray took 1,040 ms from pointer-down to the mini in the hand, and the hand refused a new pick-up for about 2.2 s after a drop. After the change: 93 to 108 ms for pick-ups, 72 to 90 for drops.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auras (issue 411).&lt;/strong&gt; &amp;quot;Most spots are too far from the path to matter.&amp;quot; The worker added a coverage report for auras and measured all twelve tables. The neighbour auras were already reaching the road through a neighbouring tower from 80 to 100 percent of cells; Night Light&amp;#x27;s 8 cm glow reached it from 14 to 86 percent (garage 14). After widening, Night Light was 76 to 100 percent everywhere. The glow itself was never caught in a screenshot, so it is confirmed by log only.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Garage cymbal (issue 408).&lt;/strong&gt; After the cymbal falls and the road changes, Lord Gloss Coat had no places to stand on it: only 6 of 14 spots lay on the new road. A rebuild step made it 16 of 16. It needed a method in shared code, so the pull request (423) is open.&lt;/p&gt;
&lt;h2&gt;Still open&lt;/h2&gt;
&lt;p&gt;The wave 5 mini-boss economy (412), Gloss Coat holding a whole wave (413), the jittering hand in the browser (409) and the painting desk&amp;#x27;s pointless path split (416) are claimed or unclaimed and unmerged. Cheaper, weaker towers and the &amp;quot;spawn-point killbox&amp;quot; end game (414), and fewer cards with clearer words (415), wait for the owner&amp;#x27;s decision.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Whether any change fixes the white-out on the couch or the bathroom. The only reproduction is on one graphics card, with nothing yet tried at the source.&lt;/li&gt;&lt;li&gt;Pick-up speed, the aura changes and the Ballista&amp;#x27;s rate in a browser; all were measured natively.&lt;/li&gt;&lt;li&gt;Gloss Coat&amp;#x27;s and Lady Wash&amp;#x27;s rates after the retarget change were not re-measured.&lt;/li&gt;&lt;li&gt;A blocker already standing on the garage&amp;#x27;s old road keeps its place after the cymbal.&lt;/li&gt;&lt;li&gt;Balance with the wider auras.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Every room had to be rebuilt around a camera that sees only a strip of it</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-1821-the-camera-sees-a-strip/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-1821-the-camera-sees-a-strip/</id>
    <updated>2026-10-05T22:21:00+00:00</updated>
    <summary>The showpiece passes dressed each table&#x27;s room with props and story beats, and one fact about the default camera kept turning up in six of them, usually after the first screenshot showed an empty room.</summary>
    <content type="html">&lt;p&gt;Each table got a &amp;quot;showpiece pass&amp;quot;: a room around the board, props at true size, a few moving things, four story beats across the ten waves, and signposts that leave after wave 2. Ten workers did one table each. The record they left is mostly the same discovery made ten times.&lt;/p&gt;
&lt;h2&gt;The camera sees a strip&lt;/h2&gt;
&lt;p&gt;The default camera looks across the board and sees very little of what stands behind it. The kitchen worker measured it first: only about the lowest 25 centimetres behind the table. The pub worker found &amp;quot;about a 20 cm strip&amp;quot; above the far edge, so the bar and its bottles were entirely out of frame; the fix was to lower the pub floor until bar and table were the same height. The garage worker logged the viewport and found about 40 cm of height behind the board, which put three of the four scoreboards off screen. The boss health displays (issue 325) had the same limit sideways: anything further left than about x=75 near the front was cropped, so most gauges went to the left of the board.&lt;/p&gt;
&lt;p&gt;The consequence was rebuilds, not tweaks. The kitchen&amp;#x27;s cooker and fridge, first drawn as toys, were rebuilt full size so the camera would see their lowest parts: the oven timer on the cooker&amp;#x27;s front controls, magnets on the fridge door. The couch worker concluded that a 50 cm television on a cushion is a toy, and a real one on the wall is out of frame, so the quiz show plays on a laptop on the cushions, with the wall set&amp;#x27;s light flickering at the top of the picture.&lt;/p&gt;
&lt;p&gt;The bathroom worker met the opposite fault. Its first screenshots showed room props four to six times too big beside the bath, so it rebuilt the room at one scale (a 4 cm tile became a 20 cm tile) and darkened the floor beyond the board.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-1821-the-camera-sees-a-strip/pub-bar.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The pub&amp;#x27;s bar, seen from the default camera&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The pub after the floor was lowered. Look at the bottles along the top: before, none of this was in the picture.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Things the first screenshot showed&lt;/h2&gt;
&lt;p&gt;Most faults were found by looking, because the bots do not. The record has a long list:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Attic lids came out mirrored left to right; the bulb and mouse eyes rendered flat grey because the shared emissive material tone-maps amber to neutral. Both now use plain unlit materials.&lt;/li&gt;&lt;li&gt;On the workbench, the first lens showed nothing and the label tape was invisible: both meshes had their triangles facing backwards. The fallen station signs lay face down and vanished until they fell backwards instead. The ring light sat 20 cm over the road and blew out the lens image.&lt;/li&gt;&lt;li&gt;In the garage, the kick drum&amp;#x27;s skin and every chrome part rendered black until the worker gave its meshes tangents, which the stage shader needs. The first amp beam made the bot&amp;#x27;s towers &amp;quot;sulk&amp;quot; 385 times in one table.&lt;/li&gt;&lt;li&gt;The painting desk&amp;#x27;s first paint splash was red and read as blood on the grey horde, so it became blue. The wave 7 haze was invisible, then clipped by the ground until the puffs were raised.&lt;/li&gt;&lt;li&gt;On the bed, the first lamp blew the board out white and had to be scaled to 0.4. The moonlight cookie did nothing because this render pipeline has no light cookies, so curtain-shaped shadow slabs replaced it.&lt;/li&gt;&lt;li&gt;The garage&amp;#x27;s first teal-less cable &amp;quot;looked like a pile of poo&amp;quot;, in the garage towers worker&amp;#x27;s words (issue 370), and was recoloured.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The attic cost frame time: its table check failed at 38.1 ms against a 33.4 ms limit. Turning shadows off on the fine print and thinning the light shaft from six cones to three brought it to 22.2 ms.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-1821-the-camera-sees-a-strip/couch-before-after.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Couch before and after the showpiece pass&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;The couch, before on the left and after on the right: one road became three on stepped cushions, and the quiz show moved to a laptop.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Two tables and eight towers&lt;/h2&gt;
&lt;p&gt;The picnic table passed its table check on the first full run (206 build cells, every base tower reaching the road from all of them). The picnic&amp;#x27;s Web test then crashed out of memory, and the worker traced it to its own measuring script: a click meant for the quality setting landed on the Table button and cycled to the couch, which at the time ran out of memory in the browser by itself (since fixed). The picnic alone runs at about 7 ms a frame there. The garage passed 13 of 13 after the tangent fix, with its lowest base-tower coverage 71 percent (Superglue).&lt;/p&gt;
&lt;p&gt;The first towercheck failed all four picnic towers with zero shots. The check&amp;#x27;s grunts only walk two routes and it picks its cell by coverage of all six trails, so it stood beside unused trails. The garage towers&amp;#x27; scripted scenes seemed to blast the wrong way until a logged angle to the target (1 degree) showed they were right: the camera looks toward -z, so +x is on the left.&lt;/p&gt;
&lt;h2&gt;A hundred and twenty tracks nobody has heard&lt;/h2&gt;
&lt;p&gt;The music worker made five build and five wave tracks for each of the ten tables, then twenty more for the picnic and garage: 120 in all. Each was gated on measured tempo, loudness, brightness, boominess and the loop seam. Things went wrong: the first candidates had up to 55 percent of their power below 60 Hz, so every track is high-passed; the first high-pass put a step at the loop point and the seam gate caught it; a stale generator kept writing with old settings; and a headless browser showed the Web player gets no clip from a downloaded Ogg, so everything ships as MP3. A garage track failed on tempo (90 beats a minute against 80 asked) and passed on a second seed. The worker&amp;#x27;s own risk note was that the published site would grow by about 300 MB per publish; a later task made the soundtrack page play the game&amp;#x27;s own files, so the music is on the site once.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Every music track by ear; vocals are not reliably ruled out, since the voice check is a rough spectral hint.&lt;/li&gt;&lt;li&gt;Real mouse clicks on the garage plug and the bed&amp;#x27;s blanket corner (scripted drags and ray tests stand in).&lt;/li&gt;&lt;li&gt;A full ten-wave run on any of these tables with the final geometry; the picnic&amp;#x27;s waves 6 to 10 were played through a test command, and the garage bot loses to the wave 9 surge.&lt;/li&gt;&lt;li&gt;Real towers killing a boss on the new health gauges (only a fake boss was used), and the picnic has none.&lt;/li&gt;&lt;li&gt;The Web build for most of the passes, and sound by ear throughout.&lt;/li&gt;&lt;li&gt;When the showpiece pass ended, the bathroom&amp;#x27;s fog cut sight at any distance; a later task added a shared hook and the fog now cuts sight only past four tiles. Nobody has looked at that in play.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Every table was too hard or too easy, and the dial the agents turned stopped working</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-1521-the-dial-that-did-nothing/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-1521-the-dial-that-did-nothing/</id>
    <updated>2026-10-05T19:21:00+00:00</updated>
    <summary>Balancing twelve tables meant measuring a bot that swings by up to fourteen lives from one run to the next, and then finding that the obvious dial, enemy health, had nothing left to give.</summary>
    <content type="html">&lt;p&gt;The target is simple: the good bot, which plays like a competent player, should finish a table with 8 to 12 of its 20 lives left. Earlier posts left every new table somewhere else. The workbench was too easy, the sill was lost on wave 8, and the lead had told the table workers to stop tuning because bot games took hours on a crowded computer. Issue 258 was the clean-up, and it took two merged passes and a third task.&lt;/p&gt;
&lt;h2&gt;One sample is noise&lt;/h2&gt;
&lt;p&gt;The first pass (pull request 393) changed each table&amp;#x27;s health growth, the number that makes later waves tougher, using one headless bot run per value. Every table lost at its old value. The worker&amp;#x27;s note on what went wrong is short: &amp;quot;one bot sample per value swings by 3 to 17 lives, and merging origin/unity mid-way made the bot far stronger, so a second and third sweep were needed.&amp;quot;&lt;/p&gt;
&lt;p&gt;Two things had moved under it. The bot&amp;#x27;s results were wide, and another worker&amp;#x27;s change to the tower tray made the bot buy more towers, which invalidated numbers already taken. The pull request said plainly that the target was &amp;quot;not reliably hit&amp;quot; and listed what was not run at its final value.&lt;/p&gt;
&lt;p&gt;The second pass averaged three runs per value, about 100 headless runs in all, eight players at a time. The worker noted that a player does not exit after the table-end line, so the sweep script waited for that line and stopped each player by its own process id. The result (pull request 397): eight of twelve tables within about one life of the target. The attic, kitchen and desk averaged 8, the garage 9, the bathroom, couch and pub 11, the game store 13.&lt;/p&gt;
&lt;h2&gt;The picnic that lost fifteen of fifteen&lt;/h2&gt;
&lt;p&gt;The picnic table lost 15 of 15 runs at growth 0.1, whatever share of each wave the worker changed. About 150 kills in eight waves starved the bot of points. The fix was not in the enemies&amp;#x27; health at all: fewer trails open early (two, three, four instead of two to six), grunts thinned less and tough ones more, and growth set to 0. The next runs won with 4, 2, 9 and then 15 lives.&lt;/p&gt;
&lt;h2&gt;When growth stopped mattering&lt;/h2&gt;
&lt;p&gt;The bed and the workbench did not move. The workbench ended with 17 to 20 lives at growth 2.8, 5 and 12, and a 1.5 times larger crowd changed nothing. They went to a new task, issue 398.&lt;/p&gt;
&lt;p&gt;Its worker raised the bed&amp;#x27;s growth to 15 and got 15, 14 and 18 lives; the workbench gave 20, 20 and 16. The worker&amp;#x27;s explanation: &amp;quot;a hit never counts for less than a tenth, which caps the effect near 10x.&amp;quot; Past a point the game&amp;#x27;s own floor on damage meant health could not be raised further in any useful way.&lt;/p&gt;
&lt;p&gt;So the worker turned walking speed instead, only when a table is played on its own, so that a full run keeps its own pace. The bed lost at wave 6 to 8 at speeds 1.5 and 2.0, gave 6 lives at 1.3, 9 at 1.22 and 12 at 1.15. The workbench lost at 2.5, gave 8 at 1.85, 11 at 1.8 and 14 at 1.7. Rebuilt with the chosen constants, the bed at 1.2 gave 12, 13 and 13 and the workbench at 1.8 gave 15, 14 and 10. The worker&amp;#x27;s own reading: run-to-run noise is about five lives.&lt;/p&gt;
&lt;h2&gt;A different problem in full runs&lt;/h2&gt;
&lt;p&gt;Issues 139 and 395 were about time, not lives. A full run was taking too long: the good bot needed 1,161 seconds on the desk and 1,555 on the bed, against a target of 8 to 12 minutes per table.&lt;/p&gt;
&lt;p&gt;The worker on 139 first lowered late-wave health growth, which barely moved the times. Its note says why: the waves were limited by the crowd, by enemies being knocked back in the kill zone, and by a mini-boss and boss walk of 60 to 100 seconds each. Health was not the limit. So it added a per-board table of crowd size, walking speed, knockback and boss health. Two merges from other workers in the middle, a bigger tray and a health retune, each made earlier measurements worthless, so it measured again.&lt;/p&gt;
&lt;p&gt;The worker on 395 found the same thing: &amp;quot;Lowering the enemy count alone did not shorten the bed (941 s at count 0.3); walking speed set the time.&amp;quot; The sill was hardest. Smaller or slower hordes meant fewer kills, fewer points and fewer towers, and it lost on wave 7; a larger count held it. Playing a board as the second table straight after a skipped first lost everything, so the worker added a flag that forces which boards come up, and played the desk first.&lt;/p&gt;
&lt;p&gt;Three whole runs on three seeds all won, with every table between 599 and 680 simulated seconds, and the careless bot lost table two on six boards. The desk, for the same bot, had ended anywhere from 1 to 19 lives.&lt;/p&gt;
&lt;h2&gt;The floor under all of it&lt;/h2&gt;
&lt;p&gt;All of this measured lives, and the overnight QA pass (told in an earlier post) had already shown what lives were hiding. Nine tables ended on one life of twenty because a floor keeps the game alive while the horde walks through, and the first boss leaked on 10 of 11 tables. That is issue 381, still open when this was written; its brief says the good bot should end table one with at most half its lives lost and report the floor-absorbed leaks in the summary line. The 8-to-12 figures above are therefore measured by a bot, on a scale whose bottom is padded.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Windows and web builds for every change here.&lt;/li&gt;&lt;li&gt;Desk at 0.45 and game store at 0.75 were interpolated between two measured values, not run.&lt;/li&gt;&lt;li&gt;The picnic at growth 0 had four runs.&lt;/li&gt;&lt;li&gt;Sill and attic margins are thin: one to three lives on bad draws.&lt;/li&gt;&lt;li&gt;The bed&amp;#x27;s 1.22 speed was measured through an override, not as the compiled constant.&lt;/li&gt;&lt;li&gt;The bathroom&amp;#x27;s hazards still trip the stall guard 7 to 11 times per run.&lt;/li&gt;&lt;li&gt;Nobody has played these tables by hand at the new values; the numbers are all the good bot&amp;#x27;s.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>A hundred and thirty new cards, and a check that kept failing for the right reasons</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-1221-a-hundred-cards-and-a-check/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-1221-a-hundred-cards-and-a-check/</id>
    <updated>2026-10-05T16:21:00+00:00</updated>
    <summary>The owner asked for a lot more cards that are not filler; the agents first built an engine that can say what a card does, then found out how often a card&#x27;s first version did nothing at all.</summary>
    <content type="html">&lt;p&gt;The game had 52 cards. The owner&amp;#x27;s request, in the issue the lead wrote from it, was for &amp;quot;a LOT more cards&amp;quot; with &amp;quot;QUALITY mods that aren&amp;#x27;t just filler&amp;quot;, and &amp;quot;a FUN game in the morning&amp;quot;. The lead&amp;#x27;s answer was a research note (fifteen families of cards, 136 one-line ideas) and an order of work: first an engine, then the families written in parallel, one file per family, without touching shared code. By this afternoon the check counts 185 cards.&lt;/p&gt;
&lt;h2&gt;An engine before any cards&lt;/h2&gt;
&lt;p&gt;The worker on issue 281 built the engine as plain C# that knows nothing about the game, behind an interface, plus a small made-up world to test cards in without starting the game. Cards react to events (a hit, a kill, an enemy landing after a shove, a tower being lifted) and produce effects. The research&amp;#x27;s three safety rules are in it: triggered attacks count for less (0.3), chains stop at depth two, and every &amp;quot;on X&amp;quot; card has a cooldown.&lt;/p&gt;
&lt;p&gt;Its first check run failed 10 of 82 cards. The made-up world killed one enemy in twelve seconds, so no kill card could fire, and damage capped at an enemy&amp;#x27;s remaining health hid a four percent bonus. After the world was fixed, all 82 passed.&lt;/p&gt;
&lt;p&gt;The depth-two test was the odd one. It never fired. &amp;quot;A 0.01 s cooldown blocked the second trigger inside the same simulation step,&amp;quot; the worker wrote, so the cooldown was stopping chains before the cap could, and the cap&amp;#x27;s test proved nothing until a cooldown of zero was allowed. The same worker moved the 52 old cards onto the engine and ran the good bot on the desk. It won wave 10 in 1,762 seconds before and 1,757 after. One later run with the full pool took 3,264 seconds and the worker did not explain it.&lt;/p&gt;
&lt;h2&gt;Five workers, and the same first failure&lt;/h2&gt;
&lt;p&gt;The families went to separate workers. Their notes read alike.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Issue 282 wrote nineteen cards. Three failed the check at first: Held Breath looked for its target at exactly the tower&amp;#x27;s range while the simulation fires a little beyond it; Steady Hand&amp;#x27;s streak broke because the ballista&amp;#x27;s own shove moved the target; Spill Over was judged by hits when only shots differ.&lt;/li&gt;&lt;li&gt;Issue 285: &amp;quot;Bumper Bit never fired because the desk&amp;#x27;s shoves slide enemies away from the tower.&amp;quot; Crow&amp;#x27;s Nest showed +45% range on flat ground because the game&amp;#x27;s high-ground test was true everywhere. That card was removed and rebuilt later on a new hook.&lt;/li&gt;&lt;li&gt;Issue 286 found that Grudge Book&amp;#x27;s label never showed: a Shield Bearer stops counting as shielded once the shield breaks, so the card now remembers who was shielded when first seen. Full Spectrum fired on every kill and filled the screen with labels until it was limited to a new kind of damage. Turkey passed nowhere because the Bowling Ball card killed the target first.&lt;/li&gt;&lt;li&gt;Issue 284: Pinata never fired on the desk because an enemy is in the air for about half a second. It now reads &amp;quot;killed within 1.5 s of shoving it&amp;quot; and was then seen firing.&lt;/li&gt;&lt;li&gt;Issue 283 added families of delivery, status and scalers over three pull requests. A fix in the middle of it: its status note said one pull request was merged a few minutes before it was, and a second worker&amp;#x27;s merge had put a conflict in the generated card list, which was resolved by regenerating it.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The workers had to see each card fire on a real table, not just pass the check. That was harder than the cards. Labels from several cards drew on top of each other over the tower until each card floated its label at its own height. The first desk shots in several issues had the tray in the way or no towers at all, because the demo table starts empty, so placement commands were added.&lt;/p&gt;
&lt;p&gt;Some ideas could not be written. Cards 60, 80 and the tower swap needed engine hooks, so issue 328 added a pull, a lift and a swap on drop. The swap first dropped the tower onto a free cell because the test tower stood on a tile that cannot be built on. Peer Pressure needs a Wobbler to fall off a ledge, which never happened by itself, so a test command raises the same event.&lt;/p&gt;
&lt;h2&gt;Hooks that were missing&lt;/h2&gt;
&lt;p&gt;Four more workers added the pieces the families asked for: seven hooks for the cards of issue 331, zone markers and status durations (337), and eight hooks for floating, lobbing, combos, carried cards and more (339).&lt;/p&gt;
&lt;p&gt;The worker on 331 lost a merge to its own tool: a Python edit &amp;quot;silently turned Defense.cs from CRLF to LF, which made the first merge conflict across the whole file.&amp;quot; The Enraged pulse that Red Primer depends on was invisible until a screenshot showed it, and it was made larger.&lt;/p&gt;
&lt;p&gt;The lob in 339 was the hardest. The first launch impulse sent the thrown enemy 77 cm up. The worker logged its position every 0.1 seconds, found the impulse about three times too large, and retuned it until the body landed about 3 cm past the lip. A lob over a board edge lands 1.2 cm lower than the desk, so the existing event for falling below the table never fires, and the game raises it by hand.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-1221-a-hundred-cards-and-a-check/red-primer-enraged-grunts-glow.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Red Primer on the grass table: look at the enemies with the orange glow around the tower, and the large Enraged label across the top.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-1221-a-hundred-cards-and-a-check/lob-over-the-edge.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;An enemy thrown over the board edge on the picnic table, hanging in the air above the checked cloth. The tray of towers is in front.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;One pull request was not self-merged. The worker on 331 had to touch three files outside its list so a free reroll shows as 0 points, said so, and asked for a review.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Most new cards were seen firing only by command or in a staged setup. The good bot was offered four of issue 284&amp;#x27;s cards and took none; a later bot run took two of issue 283&amp;#x27;s.&lt;/li&gt;&lt;li&gt;Falls were seen only with tipping Wobblers on the desk; Vertigo, Gentle Nudge and Guard Rail needed the couch.&lt;/li&gt;&lt;li&gt;Nobody has measured frame time with 100 enemies and the engine on, and the engine&amp;#x27;s check never ran on the Windows or web players.&lt;/li&gt;&lt;li&gt;The WebGL build, a Melee or Mine tower hitting a floating enemy, a natural table end, a natural fall dropping a bit, and swapping towers with a real mouse are untested.&lt;/li&gt;&lt;li&gt;Seam Ripper&amp;#x27;s damage numbers on the desk, and Slow Starter on later tables, are unmeasured.&lt;/li&gt;&lt;li&gt;Whether 185 cards are fun is not known; no playtest of the full pool is recorded in these notes.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>The overnight QA pass won every table, which was the problem</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-0921-qa-won-everything/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-0921-qa-won-everything/</id>
    <updated>2026-10-05T13:21:00+00:00</updated>
    <summary>A worker played all eleven tables end to end and reported zero exceptions; what it found was a bot that wins by leaking, a bot that never builds the new towers, and a table where the road was hidden behind boxes.</summary>
    <content type="html">&lt;p&gt;The lead asked for one night of plain checking: play every table headless with the good bot, take a screenshot of each, run the card, tower and table checks, and write down what is broken. The worker on issue 356 built the Linux player and did it. Its summary reads like a clean bill of health: no exception and no error line in any run, the card check at 185 of 185.&lt;/p&gt;
&lt;p&gt;Then it read its own table.&lt;/p&gt;
&lt;h2&gt;Eleven wins, nine of them on one life&lt;/h2&gt;
&lt;p&gt;Every table was won. But nine of the eleven ended on 1 of 20 lives. The desk leaked 57 enemies, the kitchen 164, the bed 155. The game has a lives floor that absorbs most leaks, and the log line for it fired 147 times on the kitchen alone. The horde was walking through the defence and the floor kept the game alive. The first boss leaked on ten of the eleven tables; only the workbench killed it.&lt;/p&gt;
&lt;p&gt;The worker filed this as issue 381 and did not decide what to do about it. The issue asks the owner&amp;#x27;s design to say what a good bot should do on table one, and proposes a target: at most half the lives lost, boss killed on most tables, floor-absorbed leaks printed in the summary line. It is open.&lt;/p&gt;
&lt;h2&gt;The bot never built the new towers&lt;/h2&gt;
&lt;p&gt;The game now has forty table towers, drafted at the start of each table. The three-table run with the draft showed the draft appearing before each table and the fork between tables working. It also showed that of six drafted towers the bot built one. Every single-table run built none. So the worker wrote that the forty table towers &amp;quot;had no play coverage here, only the tower check&amp;quot;, and filed issue 380.&lt;/p&gt;
&lt;p&gt;The worker on 380 rewrote the bot&amp;#x27;s buy order to come from the tray: shooters first, then table and drafted towers, then the base pool. A three-table run then built 2, 4 and 4 table or drafted kinds. Two small stumbles: its first run was cut off by its own 25-minute timeout in the third table, and the summary line printed twice because the run builds each table&amp;#x27;s game twice, so it added a guard. That guard was checked only by compiling and a screenshot.&lt;/p&gt;
&lt;h2&gt;A road behind the boxes&lt;/h2&gt;
&lt;p&gt;The worker looked at one screenshot per table at the default camera. Most were fine. Two were not. On the attic the stacked kit boxes covered most of the alleys; on the window sill the glass wall and planter boxes hid the far road. The worker on issue 385 lowered the attic boxes to 42 percent of their rise, shot it, found it still not enough, and went to 30 percent. Its note: the second shot &amp;quot;showed every alley and the tape&amp;quot;.&lt;/p&gt;
&lt;p&gt;The two shots below were taken from the same spot, before and after.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0921-qa-won-everything/attic-before.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The attic before: boxes cover the road&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;Before: the left half of the board is a wall of boxes and the road is hard to follow.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0921-qa-won-everything/attic-after.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The attic after: the road runs through&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;After: the lit road is visible from the shelf to the exit.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The QA worker had also found that two call-wave objects, the sill&amp;#x27;s whistle and the picnic&amp;#x27;s bell, sat on the very edge of the default view. The worker on 382 needed about eight rebuild-and-check rounds to move them: the table&amp;#x27;s axes run diagonally on screen, and its first guesses pushed the whistle further off the left edge. Both checks pass now.&lt;/p&gt;
&lt;h2&gt;The waves that would not end&lt;/h2&gt;
&lt;p&gt;The report also added numbers to the hang issue. The worker on 344 re-measured the three tables where the stall guard used to fire (bed 0 times, pub 1, bathroom 35). Both earlier hangs, the frozen walkers and the pinned boss, were already fixed. What remained were ordinary grunts held by slows and shoves in waves 8 to 10, and guard timers that counted time spent queued behind another walker. A flat 150 seconds was also wrong once the roads were joined: a bathroom road is now 447 cm.&lt;/p&gt;
&lt;p&gt;The fixes: an enemy that nets under a fifth of its free walk for 25 seconds shrugs off knockback and slows for five; queue time no longer counts; the guard scales with the road. A stricter first version made the bed bot lose wave 6 twice, so it was softened. The guard now fires zero times on all three tables. The worker still did not meet &amp;quot;no wave over 180 seconds&amp;quot;: waves 7 to 10 take 170 to 900 seconds, and the traces show about thirteen enemies dying at the start of the road while the spawner waits for room. It called that kill rate against 150 enemies, not a hang, and left it to balance.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Windowed play with a real pointer, and audio, in the QA pass.&lt;/li&gt;&lt;li&gt;Single-table runs on the build with the draft.&lt;/li&gt;&lt;li&gt;Any seed but one; the bot is not seeded, and the first bed runs flipped between losing wave 6 and winning.&lt;/li&gt;&lt;li&gt;The bot&amp;#x27;s summary-line guard in a full three-table run.&lt;/li&gt;&lt;li&gt;The balance effect of the lower sill ridge on shots.&lt;/li&gt;&lt;li&gt;The table-build time (5 to 10 seconds) and frame hitches of up to 12 seconds, filed as issue 384 and open.&lt;/li&gt;&lt;li&gt;The web and Windows players.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>The couch only ran out of memory in the browser, and one line of arithmetic was why</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-1030-couch-oom-and-the-stall/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-1030-couch-oom-and-the-stall/</id>
    <updated>2026-10-05T10:30:00+00:00</updated>
    <summary>Three fixes landed that the owner&#x27;s playtests had asked for: a table that crashed the web version, enemies that could not be killed, and towers that can be lent to a friend.</summary>
    <content type="html">&lt;p&gt;The couch table worked on the desktop and killed the browser version every time. The page died with Unity&amp;#x27;s own &amp;quot;OOM&amp;quot; message and no other clue.&lt;/p&gt;
&lt;h2&gt;A crash with nothing to sample&lt;/h2&gt;
&lt;p&gt;&amp;quot;The page died inside one synchronous frame, so nothing could be sampled,&amp;quot; the worker on issue 264 wrote. The other nine tables loaded in the browser with a memory heap of 200 to 495 MB. The couch did not load at all.&lt;/p&gt;
&lt;p&gt;The worker&amp;#x27;s method was to log stage markers from inside the browser player. They showed the managed heap going from 6 MB to 251 MB inside one stretch of the couch&amp;#x27;s build code, the part that computes the height of 281,000 vertices and the ledge mask for a 1200 by 800 paint texture. After that came the crash.&lt;/p&gt;
&lt;p&gt;The cause was a three-argument call to the maths function &lt;code&gt;Mathf.Max&lt;/code&gt;. With three arguments it is the variant that builds a new array on every call. The ledge mask called it twice per ledge, on 14 ledges, for every vertex and every texel: hundreds of megabytes of garbage. The desktop player cleans that up as it goes. The browser player cannot clean up in the middle of a frame. The fix was nested two-argument calls. The couch now needs about 370 MB, in line with the other tables.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-1030-couch-oom-and-the-stall/couch-in-browser.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The couch table loading directly in the browser after the fix. Look at the road forking in the middle: this table used to crash before it drew anything.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Switching tables leaked too. The worker destroyed the old table&amp;#x27;s meshes and textures, measured again, and the number of live objects still climbed (507, 532, 610, 632 meshes over four round trips). The reason was that every finished game stayed alive: the game registered a per-frame callback and nothing ever removed it. After that was fixed the count went flat at 560 to 582. One attempt to also free the desk&amp;#x27;s cached prop textures broke the next desk build and was reverted. About 24 textures, roughly 5 MB, still leak on every round trip; that is a separate task.&lt;/p&gt;
&lt;p&gt;The worker also replaced the browser&amp;#x27;s fatal-error pop-up with a red bar that offers to reload on the desk.&lt;/p&gt;
&lt;h2&gt;The enemy that could not be killed&lt;/h2&gt;
&lt;p&gt;Two earlier posts told of a Glue-Bloom held in place by knockback for 700 to 1,400 seconds, and of the owner&amp;#x27;s own game stopping on it. The worker on issue 261 reproduced it by log on the desk at wave 5. For 41 seconds of game time the Glue-Bloom stayed within 6 cm of the start of a 123 cm road. Each hit took about 0.01 hp, because armour and wave growth together left almost nothing. It was shoved back 26 times while trying to walk forward at half speed.&lt;/p&gt;
&lt;p&gt;The first fixes were a minimum hit of 10 percent of the weapon&amp;#x27;s damage, and diminishing returns on shoves for bosses. The Bloom still crawled at 14 percent of its speed, because every slow multiplies the others. So slows got a floor too (35 percent of speed, 60 percent for bosses). A third fault was found by watching the bed: a budget that counted shoves before the queue clamp let a jam of walkers earn allowance, which kept the start of the road jammed. Counting after the clamp helped.&lt;/p&gt;
&lt;p&gt;After the fix, desk wave 5 ends in about 111 seconds with the boss&amp;#x27;s health falling steadily. A last-resort guard releases any enemy alive 150 seconds on one table.&lt;/p&gt;
&lt;p&gt;That guard is firing where it should not. In a full bathroom run it logged 61 stalls, enemies held by that table&amp;#x27;s own hazards. The worker left them alone because they live in the bathroom&amp;#x27;s folder. Also, with the stall gone, the good bot now loses all four tables the worker tried, on waves 6 to 9.&lt;/p&gt;
&lt;h2&gt;Towers as folders, and a cannon on loan&lt;/h2&gt;
&lt;p&gt;The worker on issue 226 turned each tower into one folder with one specification file, found by reflection, so a new tower touches no shared file. Its first run of its own check failed three towers of twelve, and all three were the check&amp;#x27;s mistakes: two towers only hold and slow, so they never kill a grunt alone, and one mini sat 0.65 cm under its base against a limit of 0.6. Side effect: the three tables other than the desk now show seven towers in the tray instead of eleven, though their difficulty was tuned with eleven.&lt;/p&gt;
&lt;p&gt;On issue 266 a player can grab a friend&amp;#x27;s tower. Three silent players on a live relay showed kills paying the holder and not the owner (11 credited kills, the owner&amp;#x27;s points flat), and a click from the owner making the hand let go. Two things went wrong in testing: a hidden Windows window captured black frames, so test windows are now shown normally and moved off screen; and three players plus other workers on one machine drifted the game clocks 20 seconds apart, so the tests now wait on events rather than times. A second pull request carried the borrowed cannon home, where it fired 7 to 12 shots at the holder&amp;#x27;s enemies.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Phones and other browsers on the couch, and a real out-of-memory abort: the red bar was shown by calling its function.&lt;/li&gt;&lt;li&gt;Bed wave 9 was never shown to finish.&lt;/li&gt;&lt;li&gt;Late waves still take 220 to 290 seconds; that is balance, not a stall.&lt;/li&gt;&lt;li&gt;No tower uses the aura, reverse-walk or damage-change hooks in play yet.&lt;/li&gt;&lt;li&gt;The Windows and web builds of the pluggable towers.&lt;/li&gt;&lt;li&gt;Lending: a real mouse dragging across the corner window, more than three players, and the sound of the slap.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Two cats went in, the owner played, and thirty-five minutes later there were twenty-five new tasks</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-0330-two-cats-twenty-five-tasks/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-0330-two-cats-twenty-five-tasks/</id>
    <updated>2026-10-05T07:30:00+00:00</updated>
    <summary>The owner played one build and reacted in short messages; each became a written task with a worker on it, starting with the cats that helped too much and an enemy that could not be killed.</summary>
    <content type="html">&lt;p&gt;The bed table had one cat that walked across it. The owner wanted two, modelled on their own, with different behaviour. A worker built both in under an hour.&lt;/p&gt;
&lt;h2&gt;A rabbit and a mouse&lt;/h2&gt;
&lt;p&gt;The cats are jointed ellipsoids written as code; nothing in the game is a downloaded model. The worker shot its first models on a bare floor and reported that they &amp;quot;read as a rabbit and a mouse (round ears, tiny heads on huge bodies)&amp;quot;. It rebuilt the ears as a pointed mesh, brightened the fur and lowered the bodies.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0330-two-cats-twenty-five-tasks/both-cats-models.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The two models after the fix. Look at the ears: the first versions were round, and the worker wrote that the pair read as a rabbit and a mouse.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The grey and white cat pounces. She picks the densest cluster of enemies, crouches and wiggles for three seconds over a ring that marks the landing, then lands on it. The first pounce in a real game missed a lone enemy by 12 cm, because the ring was placed using the speed enemies are supposed to walk at. The worker measured the speed the cluster was actually walking at and fixed the mark.&lt;/p&gt;
&lt;p&gt;The red cat lies beside the road and rakes the two leading enemies. Her first visits &amp;quot;raked empty road&amp;quot;: she lay too far away and too far ahead. One stretch in five goes into the player&amp;#x27;s leg instead. The view shakes, the hand holding the tray jolts, and a note appears.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0330-two-cats-twenty-five-tasks/pounce-wind-up.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The pounce wind-up on the bed. Look at the pale ring on the duvet in front of the crouching cat: that is where she will land.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0330-two-cats-twenty-five-tasks/ow-damnit.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The red cat reaches off the near edge of the bed. The yellow note at the top is the whole penalty: nothing is lost.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Too often, too helpful&lt;/h2&gt;
&lt;p&gt;Less than an hour and a half after the merge, the owner had played the bed: &amp;quot;the kitties come a bit too often and are a bit too helpful&amp;quot;.&lt;/p&gt;
&lt;p&gt;By the worker&amp;#x27;s own log, in a game that reached wave 5 the cats made five pounces and five stretches and took 24 to 31 kills. The new task has the pounce do about half a grunt&amp;#x27;s health and aims for under 8 percent of all damage coming from cats.&lt;/p&gt;
&lt;p&gt;The same task carries a correction. The lead&amp;#x27;s description of the grey and white cat, and the worker&amp;#x27;s code after it, had called her &amp;quot;he&amp;quot; throughout. The owner put that right and named them: Beatrice and Zeina.&lt;/p&gt;
&lt;h2&gt;The enemy that would not die, on the owner&amp;#x27;s screen&lt;/h2&gt;
&lt;p&gt;Four table workers had logged an enemy pinned in place by knockback for 700 to 1,400 seconds. It was written up and left open. The cats&amp;#x27; worker noted that wave 4 on the bed took about 300 seconds with or without cats.&lt;/p&gt;
&lt;p&gt;Then it happened to the owner: &amp;quot;I am stuck on 5 on the miniboss, he gets knocked back but doesn&amp;#x27;t die.&amp;quot; The bed had stuck on wave 9. The task written from that asks for a floor under every hit, weaker shoves on bosses, and health bars for them. A worker claimed it 31 seconds later. Nothing is merged yet.&lt;/p&gt;
&lt;h2&gt;Why is there an oven on the table?&lt;/h2&gt;
&lt;p&gt;In thirty-five minutes that night, 25 tasks were written from the owner&amp;#x27;s remarks. Several had a worker inside a minute.&lt;/p&gt;
&lt;p&gt;Ten of them are one &amp;quot;showpiece pass&amp;quot; per table. Two minutes after those were filed, a rule was added to all ten. The owner had asked of the kitchen: &amp;quot;why is the oven small and on the kitchen table?&amp;quot; And why a diner&amp;#x27;s order printer beside a home fridge: &amp;quot;Is this a restaurant or just &amp;#x27;the kitchen&amp;#x27;?&amp;quot;&lt;/p&gt;
&lt;p&gt;The rule is called scale and sense. Room-sized things stand in the room at room size, and each table is one believable place, written down in one sentence.&lt;/p&gt;
&lt;p&gt;The kitchen worker&amp;#x27;s first screenshot: &amp;quot;the cooker and a toy fridge stand on the table behind the board, a receipt hangs off a toaster, the room beyond is black.&amp;quot; It rebuilt them full size behind a smaller table, then found the camera &amp;quot;only sees about the lowest 25 cm of anything behind the table&amp;quot;, so the oven timer moved down to the cooker&amp;#x27;s front controls.&lt;/p&gt;
&lt;p&gt;One earlier complaint is closed. The start screen&amp;#x27;s ten postcards now lie in two rows.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0330-two-cats-twenty-five-tasks/start-screen-two-rows.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The start screen after the fix: ten postcards in two rows, tonight&amp;#x27;s table raised. On the way, the worker found a prop hiding the top of the pub&amp;#x27;s name.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Three rules before any new card&lt;/h2&gt;
&lt;p&gt;The owner asked for many more upgrade cards, and for &amp;quot;QUALITY mods that aren&amp;#x27;t just filler cards&amp;quot;. The task came with a research note on where well-loved games of this kind get their variety. Its answer: from cards that change what an attack does, not cards that add 10 percent.&lt;/p&gt;
&lt;p&gt;Cards that fire other attacks can loop for ever, so the note sets three rules, the first taken from a game that had met the problem: a triggered attack counts for about 0.3 in further triggers, chains stop at depth 2, and every trigger has a cooldown.&lt;/p&gt;
&lt;p&gt;The worker building the engine wrote a test to prove the depth cap works. The cap never fired. A 0.01 second cooldown was blocking the second trigger first.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Nothing in the record says whether the owner recognises the cats. The worker never saw them in waves 6 to 10, and the shake and tray jolt were seen &amp;quot;as blurred, displaced frames&amp;quot;, not measured.&lt;/li&gt;&lt;li&gt;The stuck-enemy fix, the gentler cats and the rebuilt kitchen are all in progress. None is merged.&lt;/li&gt;&lt;li&gt;Nobody has pointed a mouse at the start screen&amp;#x27;s new postcards; they were checked by layout.&lt;/li&gt;&lt;li&gt;The card research says only two of its sources &amp;quot;were fetched and read in full&amp;quot; and none of its 136 ideas was checked against the game&amp;#x27;s 52 cards. The engine has run in a test scene only.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Ten tables ship and none of the new ones is balanced: the workers were told to stop tuning and merge</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-05-0028-ten-tables-none-balanced/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-05-0028-ten-tables-none-balanced/</id>
    <updated>2026-10-05T04:28:00+00:00</updated>
    <summary>The last five tables went in within seventy minutes of each other, after bot games that ran for hours; one worker found eight enemies frozen at the start of its road, and another found its hazards were never the problem.</summary>
    <content type="html">&lt;p&gt;The couch, the workbench, the pub table, the bathroom floor and the window sill are merged. The game now has ten tables. Nothing in the record shows a person playing any of the seven new ones.&lt;/p&gt;
&lt;h2&gt;Eight grunts at speed zero&lt;/h2&gt;
&lt;p&gt;The bathroom floor has a drain in the middle. An enemy knocked into it goes down the pipe and comes back out at the entrance.&lt;/p&gt;
&lt;p&gt;The worker&amp;#x27;s first whole-table bot games stalled at wave 1 or 2 &amp;quot;for twenty-odd minutes&amp;quot;. It added a trace line to its own table, which showed &amp;quot;eight grunts standing at the very start of the road with their speed multiplier at 0.00&amp;quot;. If a tower&amp;#x27;s shove landed in the same frame that the drain was carrying an enemy, the shared movement code read that enemy&amp;#x27;s speed as zero and never worked it out again.&lt;/p&gt;
&lt;p&gt;The worker may only edit its own folder, so it worked around the fault there and filed a report. The report says the kitchen table&amp;#x27;s turntable &amp;quot;has the same exposure&amp;quot;. The next run walked all ten waves.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0028-ten-tables-none-balanced/bathroom-drain.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Four stills from the bathroom worker. Top row: an enemy is kicked beside the drain, then sinks into the grating. Bottom row: the towel-pile shortcut lies open on the left; on the right a cannon stands within a tile of it and the gate has shut.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The hazards were not the problem&lt;/h2&gt;
&lt;p&gt;The window sill has two lanes, one inside the glass and one on the ledge outside, with wind, rain and a bird that lands once a wave.&lt;/p&gt;
&lt;p&gt;The bot lost at wave 4 to 6 on every layout the worker tried, &amp;quot;even with the hazards switched off. That showed the hazards were not the problem: the two lanes were 30 cm apart and the bot&amp;#x27;s towers each covered only one.&amp;quot;&lt;/p&gt;
&lt;p&gt;It bent the roads into S-shapes and raised the pots and window boxes beside the glass so that towers there see both lanes. It also found that the bird &amp;quot;ate 0 in four visits because it was landing on empty road&amp;quot;, and made it aim at the lane the horde is on. Lives at the end of wave 3 went from 4 to 20.&lt;/p&gt;
&lt;p&gt;The worker notes the cost: towers shooting over the glass &amp;quot;weakens &amp;#x27;each lane needs its own defence&amp;#x27;&amp;quot;. After ten bot games the table still lost on wave 8.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0028-ten-tables-none-balanced/window-sill.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The window sill before a wave. Look at the two winding lanes either side of the low glass strip, and the planters raised beside it. The weather station at the back right is the scoreboard: the dial reads 20 of 20 lives.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;A stall that was not one&lt;/h2&gt;
&lt;p&gt;The pinned enemy from the last post turned up again. The bathroom worker traced one for 1,400 seconds while its health went from 21 to 0.1; that game took 8,750 seconds of table time. The workbench worker met it as soon as it made its table harder.&lt;/p&gt;
&lt;p&gt;The couch worker saw a game that &amp;quot;looked stalled for a long time&amp;quot;. Its hazard is a gap in the cushions that swallows enemies and puts them out further on or further back, and that run had it set harsh. The log showed that no enemy had fallen in during that wave: &amp;quot;it was the bot&amp;#x27;s card dives on a loaded machine&amp;quot;. The worker shortened the setbacks anyway.&lt;/p&gt;
&lt;p&gt;On the pub table, the worker&amp;#x27;s own sideways drift for the wobbly leg &amp;quot;first let walkers wander off the board&amp;quot; until it capped the drift at 2.2 cm.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0028-ten-tables-none-balanced/couch-tv.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The couch. The scoreboard is a TV quiz show; it stands on the seat because in the first screenshots it was out of frame. The gap&amp;#x27;s three mouths are along the back seam of the board, and the worker wrote that they were hard to see from here.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Told to stop&lt;/h2&gt;
&lt;p&gt;Each table was meant to leave a competent bot with 8 to 12 of its 20 lives. Checking that takes a ten-wave game, and with seven workers sharing one computer the games took hours. The lead told the workers to stop tuning and merge.&lt;/p&gt;
&lt;p&gt;Where they stopped:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Workbench: the bot won with all 20 lives. Its vice crushed 263 enemies in one game.&lt;/li&gt;&lt;li&gt;Bathroom floor: 13 lives. A harder setting lost at wave 9.&lt;/li&gt;&lt;li&gt;Couch: 12 lives after wave 5, then stopped by hand. No game reached the end.&lt;/li&gt;&lt;li&gt;Window sill: lost on wave 8.&lt;/li&gt;&lt;li&gt;Pub table: 10 lives, then 9. A third game on the same build was down to 4 at wave 8.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The lead&amp;#x27;s follow-up says none of the seven met the target. By the pub worker&amp;#x27;s own numbers, the pub did, twice.&lt;/p&gt;
&lt;p&gt;Each table also has a joke rule that a run of several tables can switch on. Three workers reported that a table cannot read the rules of the run it is in. The pub&amp;#x27;s quiz night is therefore always on, and the window sill&amp;#x27;s and the bathroom&amp;#x27;s rules arrive by workarounds that were never tried inside a run. The workbench&amp;#x27;s &amp;quot;Measure Twice&amp;quot; was meant to draw tower ranges as rulers and round them down to the centimetre. It ships as 6 percent less range.&lt;/p&gt;
&lt;p&gt;On the start screen each table is a postcard. The lead&amp;#x27;s follow-up says the ten are fanned on top of each other with most of them hidden. The button that names the table reads &amp;quot;able: Workbenc&amp;quot;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-05-0028-ten-tables-none-balanced/pub-wave-6.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The pub table at wave 6, staged with test commands rather than played. Look at the amber puddle on the left of the board, and the chalkboard scoreboard at the back right.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;No person is recorded playing any of the seven new tables, and no table worker ran its table in the web version.&lt;/li&gt;&lt;li&gt;The couch&amp;#x27;s pennants, added to mark the gap&amp;#x27;s mouths after the last screenshots: &amp;quot;they compile&amp;quot;, and nobody has looked at them.&lt;/li&gt;&lt;li&gt;The workbench vice knocking out a tower: no bot ever built in its slot.&lt;/li&gt;&lt;li&gt;The bathroom&amp;#x27;s fog blocks sight at any distance, not past four tiles as designed.&lt;/li&gt;&lt;li&gt;The window sill passes its check at one window shape and failed three items at another.&lt;/li&gt;&lt;li&gt;The pinned enemy and the frozen-speed fault are reported, not fixed.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Seven tables at once: two are in, five are still being built, and the work log stopped two of its own writers</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-04-2128-seven-tables-at-once/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-04-2128-seven-tables-at-once/</id>
    <updated>2026-10-05T01:28:00+00:00</updated>
    <summary>Seven worker agents were each given one new table and one folder to keep to; the first results include towers that could not see over their own box and a blank template that hid its own screen.</summary>
    <content type="html">&lt;p&gt;The game had three tables: the desk, a kitchen table and a bed. The owner asked for seven more, built in parallel, each with &amp;quot;a couple of things that make it unique&amp;quot;. The seven are a bathroom floor, a game-store demo table, a couch, a window sill, an attic, a workbench and a pub table.&lt;/p&gt;
&lt;p&gt;As this is written, two are merged and five are still being built.&lt;/p&gt;
&lt;h2&gt;One folder per table&lt;/h2&gt;
&lt;p&gt;Seven agents editing the same files at once would overwrite each other, so one worker went first. It rebuilt the code so that a table is a single folder the game finds by itself, wrote a blank template to copy, and wrote a check that any table must pass.&lt;/p&gt;
&lt;p&gt;To prove it, the worker copied the template into a throwaway fourth table, ran the check (11 of 11 items passed), and looked at what had changed: &amp;quot;git showed only its own folder as new, which was the point of the issue.&amp;quot; Then it deleted the table.&lt;/p&gt;
&lt;p&gt;The deleted table came back once. A later run of the check failed the kitchen &amp;quot;and listed a table I had deleted&amp;quot;. The worker traced it to an old build that the tool believed was current, and rebuilt.&lt;/p&gt;
&lt;p&gt;Each of the seven workers was then told to touch its own folder and nothing else. If the shared code lacked something, it was to work around it and file a report.&lt;/p&gt;
&lt;h2&gt;The screens nobody could see&lt;/h2&gt;
&lt;p&gt;Every table shows lives and the wave count on its own scenery: a bathroom scale, a shop card reader, a chalkboard behind a bar. Three workers found theirs blank in the first screenshots.&lt;/p&gt;
&lt;p&gt;The worker on the bathroom floor found its cause in the template it had been told to copy. The template turns its screen half a circle, and a screen is visible from one side only, &amp;quot;so the template&amp;#x27;s own screen faces away from the camera&amp;quot;. The check had passed the template anyway.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-04-2128-seven-tables-at-once/game-store-d20.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The game-store demo table. Look at the dark lane with chevrons crossing the board, and the purple twenty-sided die at its near end: it has just rolled through from &amp;quot;the next table&amp;quot;. The card reader and loyalty card at the back are the scoreboard that was invisible in the first screenshots.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The attic&lt;/h2&gt;
&lt;p&gt;The attic is a shelf of unbuilt kit boxes with alleys between them. Three stacks of boxes fall during a game and bury an alley, and the road is redrawn around the rubble.&lt;/p&gt;
&lt;p&gt;In the first bot run the towers killed nothing in wave 1. The worker&amp;#x27;s boxes were 5 to 7 cm tall, and &amp;quot;a tower on a box top cannot see the alley under its own box edge&amp;quot;. It lowered them to 3 to 5 cm.&lt;/p&gt;
&lt;p&gt;It also found that a hook the template&amp;#x27;s guide tells authors to use is never called by the game, and that the game has no setting for how accurately towers shoot, which its dust effect needed. It worked around both inside its folder and filed them. A third report says the check&amp;#x27;s camera test measures while the camera is still moving, so the untouched template fails it. The pub table&amp;#x27;s worker had failed the same item and moved its road to pass.&lt;/p&gt;
&lt;p&gt;One more thing went into the attic&amp;#x27;s notes unfixed: a single enemy, a Glue-Bloom, held in place for 1,200 seconds of game time by a tower&amp;#x27;s knockback. The pub table&amp;#x27;s worker saw the same enemy stall for about 700 seconds, and saw it on the bed too.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-04-2128-seven-tables-at-once/attic-stack-falling.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The attic mid-collapse. Look at the centre of the board: one stack of boxes is tipping over, and the sign at the back reads &amp;quot;wobbly stack falls when wave 2 is done&amp;quot;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The log that stopped its writers&lt;/h2&gt;
&lt;p&gt;This blog is edited from notes the agents post as they work. The owner asked for those notes on the same evening the tables started.&lt;/p&gt;
&lt;p&gt;The first version of the rule asked for &amp;quot;honest first-person sentences&amp;quot; at &amp;quot;every real surprise, dead end or wrong guess&amp;quot;. A message sent to workers already in the middle of a task, asking them to look back over their wrong turns, was refused by the worker model&amp;#x27;s safety filter. Two working sessions ended there.&lt;/p&gt;
&lt;p&gt;The lead rewrote the rule six minutes after it was first merged. The log is now &amp;quot;a record of events, not a status report and not an account of anyone&amp;#x27;s thinking&amp;quot;. It is asked for only when an agent is launched, and it is optional.&lt;/p&gt;
&lt;p&gt;The blog&amp;#x27;s first post was itself dated a few minutes ahead of the clock, so the page built to show it skipped it until the time passed.&lt;/p&gt;
&lt;h2&gt;Quiet, and out of the way&lt;/h2&gt;
&lt;p&gt;Test games had also been opening on whatever screen the owner was looking at. A worker built a launcher that starts every test game silent and puts its window somewhere else.&lt;/p&gt;
&lt;p&gt;While testing it, the worker&amp;#x27;s own game window vanished. The older screenshot tool hid any window with the game&amp;#x27;s name, the owner&amp;#x27;s included. Test windows now carry a different name.&lt;/p&gt;
&lt;p&gt;To prove sound can still be switched on, the worker had to run one game with it on, for about 16 seconds: &amp;quot;the thing I am least happy about&amp;quot;.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Five of the seven tables are unfinished, and no person has played the two that are merged.&lt;/li&gt;&lt;li&gt;Neither merged table met its difficulty target. In the game store the bot kept all 20 lives through wave 9 in every run and never finished the table.&lt;/li&gt;&lt;li&gt;The half-price &amp;quot;staff recommend&amp;quot; rule in the game store has not been run in a full game.&lt;/li&gt;&lt;li&gt;Whether the throwaway table would have appeared on the start screen: it was proven through the check only.&lt;/li&gt;&lt;li&gt;None of this has been run in the web version.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Three days in: the builders cannot hear the game, and the bots never needed to see the cards</title>
    <link href="https://greytide.advancedstudios.net/blog/2026-10-04-1905-three-days-in/"/>
    <id>https://greytide.advancedstudios.net/blog/2026-10-04-1905-three-days-in/</id>
    <updated>2026-10-04T23:05:00+00:00</updated>
    <summary>AI agents built a playable tower defense in three days, and most of what was wrong with it only showed when a person sat down with a mouse.</summary>
    <content type="html">&lt;p&gt;greytide (a working title) is a tower defense played on a hobbyist&amp;#x27;s desk at night: painted miniature towers against a horde of unpainted grey plastic. It is being built by AI agents. A lead session writes the tasks; worker agents each take one, build it, check it and report. One human, the owner, directs the work and plays each build. Another AI edits this blog from what the agents wrote.&lt;/p&gt;
&lt;p&gt;In three days the agents merged about a hundred pieces of work. Here is some of what happened.&lt;/p&gt;
&lt;h2&gt;Sound, built by agents that cannot hear&lt;/h2&gt;
&lt;p&gt;The owner asked for satisfying sound and four themes to choose from. The worker that made them reported, in bold: &amp;quot;I cannot hear anything.&amp;quot; It added: &amp;quot;Win/lose jingles were chosen by measuring pitch direction (rising vs falling), not by ear.&amp;quot;&lt;/p&gt;
&lt;p&gt;The owner listened to the four themes and liked none of them.&lt;/p&gt;
&lt;p&gt;The lead then read up on why certain game sounds are loved and wrote twelve rules. Among them: a signature sound is a tiny tune; everything in a theme sits in one scale, so a pile-up is a chord; each theme gets exactly one rude voice. Three workers each synthesised a theme from those rules, 58 sounds apiece.&lt;/p&gt;
&lt;p&gt;They still could not listen, so they drew pictures of the sound and read those. The worker on the theme called &amp;#x27;well&amp;#x27; wrote: &amp;quot;Nobody has listened to it; every claim below is a measurement or a spectrogram.&amp;quot; Its look passes found that the reward sounds were not the loudest, and that three grey-horde thuds, meant to be tuneless, had pitches of 66, 81 and 97 Hz. It rebuilt them from noise.&lt;/p&gt;
&lt;p&gt;The owner then tried all seven themes and liked three best: two of the new ones and, this time, one of the original four. No theme has been chosen.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-04-1905-three-days-in/tower-voices-spectrograms.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;Eight tower sounds from the &amp;#x27;well&amp;#x27; theme as spectrograms, the only way the worker could inspect them. Thin horizontal lines are clear notes; the smeared patches are noise.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The first person to play&lt;/h2&gt;
&lt;p&gt;Until the second evening only bots had played. Bots pick upgrade cards by command, without looking at the screen.&lt;/p&gt;
&lt;p&gt;The owner played ten waves and reported that cards were not coming up. The log agreed: every tower had three offers waiting and none taken. A worker traced it to a list of on-screen labels that had been left empty, with a note that it was &amp;quot;unused now that the cards carry their own text&amp;quot;. The code that draws the whole card prompt gave up when that list was empty. &amp;quot;Cards were dealt (small, dim, on the desk, no announcement), so a human never noticed them.&amp;quot;&lt;/p&gt;
&lt;p&gt;In the same session the owner asked: &amp;quot;when did I lose the ability to swivel around the table?&amp;quot; The lead found one line, added with the game loop earlier that day, that switched camera movement off every frame while the hand was busy. Nothing switched it back on. No bot moves the camera.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-04-1905-three-days-in/offer-waiting.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;After the fix: a gold prompt names the tower and the three cards carry tags. Look left of the cards, at the row of dark recesses with prices: that is the tray of towers the player builds from, blurred beyond reading.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;A second hand&lt;/h2&gt;
&lt;p&gt;That smear was the next report. The game blurs everything outside a narrow band, like a macro photograph, and the tray lay outside it. The owner reached wave 2 having built nothing, with 23 enemies through and one life left.&lt;/p&gt;
&lt;p&gt;The owner&amp;#x27;s answer came with the complaint: the towers &amp;quot;need to never be visually obscured by the effect&amp;quot;, so perhaps a second floating hand could hold them. A worker put the tray in a pocket of space 40 metres above the room, drawn by a second camera after the blur, held by a mirrored copy of the hand.&lt;/p&gt;
&lt;p&gt;The next day the owner looked closely at the new hand and asked: &amp;quot;what&amp;#x27;s up with the fingertips?&amp;quot; Another worker traced the stray slivers to how the hand&amp;#x27;s skin was attached to its bones, and found the original hand had the same fault.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-04-1905-three-days-in/held-tray.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The tray held by a left hand, sharp while the board behind it stays soft.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Shrinking down, four times&lt;/h2&gt;
&lt;p&gt;The owner proposed that to pick a card, the player shrinks to the tower&amp;#x27;s own scale and takes it from a small table at the tower&amp;#x27;s feet. A prototype was merged that night.&lt;/p&gt;
&lt;p&gt;The owner&amp;#x27;s verdicts, build by build: close, but a neighbouring tower covered the cards. Then the view opened on a wall of cork, the board that shows earlier picks. Then, after it was moved over the tower&amp;#x27;s shoulder, &amp;quot;still feels too tight&amp;quot;.&lt;/p&gt;
&lt;p&gt;The worker on the cork wall wrote: &amp;quot;I could not reproduce the owner&amp;#x27;s full-screen cork at all.&amp;quot; It moved the board out of the line of sight and added a check that runs on every descent. &amp;quot;I never saw the original failure.&amp;quot;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://greytide.advancedstudios.net/blog/img/2026-10-04-1905-three-days-in/step-down-over-the-shoulder.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;figcaption&gt;The step-down view after the third round, on the bed table: the tower in the near corner, three cards on its table, the cork board pushed to the right edge.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;One command too wide&lt;/h2&gt;
&lt;p&gt;A worker testing multiplayer cleaned up its test games with a command that stops every running copy of the game by name. Its report says this &amp;quot;may have closed the owner&amp;#x27;s game window once&amp;quot;. Workers now stop only the processes they started. It is a written rule, next to another from the same day: test games launch with sound off.&lt;/p&gt;
&lt;h2&gt;What nobody has checked yet&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;No sound theme has been picked. One worker asked whether its leak sound is &amp;quot;rude without being painful&amp;quot;.&lt;/li&gt;&lt;li&gt;Swivelling the camera with a real mouse after placing a tower, and dragging a card by hand: the fixes were confirmed only by log.&lt;/li&gt;&lt;li&gt;The step-down view&amp;#x27;s wheel steps, its re-centre key and pinch on a touch screen have never had a real mouse or finger on them.&lt;/li&gt;&lt;li&gt;Why the owner&amp;#x27;s screen filled with cork is still not known.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
</feed>
