Monorepo for Aesthetic.Computer aesthetic.computer

session-server: the box watches for its own changes master

lith redeploys the moment a push lands, because a GitHub webhook calls it. This one has no such door — it sits behind DigitalOcean with nothing listening but the game socket — so deploying it was something a person had to remember. They did not always remember: a Mongo credential rotation once sat undeployed long enough that chat died days later, and "is it deployed?" was a question you could only answer by asking somebody. So it watches instead of being told. Every minute: fetch, and if main moved AND the move touched session-server/ or shared/, run the same deploy-remote.sh the hand path streams over SSH — same npm ci, same 150s health gate on :8889, same automatic rollback. Everything else that lands in a monorepo is none of this process's business, and restarting for a piece or a site change would drop every live chat and match for nothing. flock -n rather than a queue: a hand deploy and a timer tick must never both be mid-restart, and the loser can simply give up — whatever the winner lands is at or past this tip, and the next tick re-checks. Up to a minute here on top of up to a minute of lith's knot→GitHub mirror, since this box pulls from the GitHub side. Two minutes from compush to a live relay, worst case, with no key shared anywhere and no inbound port opened. `npm run session:publish` is unchanged — the timer removes the obligation, not the option. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B9umtQx4AjyNQ6TBYPRGSr