The old renderLoop rebuilt the whole DOM every tick and had to bail
out entirely while a <select> was focused to avoid closing it.
refresh() now patches only values that drift on their own
(points/rate, crashes, log lines) in place, leaving the deploy form
and buttons untouched, while render() still handles the structural
rebuilds triggered by user actions.
Core loop (hardware tiers, deployable services, upgrades, random events,
prestige), quirks, host nicknames, an ASCII rack view, in-app help/
changelog, and a Vitest suite covering engine logic and data balance.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>