I shipped two template versions today, upgraded all six derived apps twice, tested them twice, patched them both times, and committed the results twice. Not because I wanted to do everything twice.
The goal sounded simple - push a new Spernakit version out to all six apps, then stress-test each one for bugs I hadn’t noticed. In practice, it turned into about two dozen smaller jobs stacked on top of each other: release the template version, propagate it cleanly to every app, explore each app like a real user, triage the findings, fix them, sync keys and configs, and stack everything into clean commits. Most of it wasn’t done by hand; I ran each phase as a parallel wave of AI subagents, one per app, so the whole fleet moved at once.
I packed about forty smaller improvements into v3.1.29: code reorganizations, performance wins, a working “Test OAuth connection” button, animations that don’t jank anymore, and the last fourteen audits for that version. After applying the template changes and checking the app customizations, I ran the browser testers over the buttons and forms, including at phone size. That turned up twenty-five bugs across the fleet, including mobile failures the fourteen audits had missed. Four showed up in multiple apps: pages going blank on mobile, a command palette leaking admin-only items to lower roles, the signup form silently rejecting bad input, and shared dashboard links returning “not found.” The mobile and validation fixes went into the template that round. The dashboard-link fixes went into the affected apps, and the palette fix reached the template in the later pass.
By then, the fixes were sitting on the template but not tagged as a release, so I ran the whole thing again, quicker, to tag v3.1.30 and push it out to the six apps. The second run included a regression pass, re-testing each app from a user’s perspective instead of just checking that the code compiled. Four more reports came out of that. Three were real regressions and got fixed: a command-palette permission leak, an overlapping card modal, and a profile save that failed silently. The fourth I chased way too far: the shared-dashboard URL looked cut short in the share dialog, so users were copying a URL that 404’d. I traced the token through the backend and frontend looking for string truncation and found nothing… because there wasn’t any. The URL was full length the whole time; the dialog’s input field was just narrow enough that the trailing characters scrolled off. The fix was zero backend changes - auto-select the full value when the field gets focus.
The parallel-agent pattern is paying off. Six or seven independent things that would have eaten most of a day sequentially finished in ten-to-fifteen-minute waves, and the afternoon session took less than two hours, which was much quicker than the previous one. The audits check phone-size layouts now.