The outage: deploy did rm -rf on the web root, THEN docker cp. Anyone loading
in that window — or holding a cached index.html from before it — asked for a
hashed bundle that no longer existed, and nginx answered with HTML: "Failed to
load module script... MIME type of text/html". Exactly what got reported.
Two changes:
- Merge instead of swap. Hashed bundles never collide, so old builds' assets
stay alive for stale HTML while the new index.html takes over. No gap, no
orphaned caches. Disk is a few MB per deploy; prune by hand if it ever
matters.
- The verify step now follows the chain the browser follows: fetch the live
index.html, extract the script src, and assert it serves as
application/javascript. A 200 on the page proved nothing — the page was
200 all through the outage.
Verified live: page → index-CmCk0pc0.js → application/javascript, and the
game boots to the title screen on partly.party/toastsim.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dice show the criss-cross (drawn 1.6x true size — honest proportions
vanish against the board at game camera distance); wedges explode 0.28
from center so gaps and uneven angles read. Slices keep the fan. Plus
scripts/deploy.sh (partly.party/toastsim, cratewars pattern) — pending
an ssh permission grant to run the final docker cp step.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>