# Issue #188 Artifact — SPA cutover hardening (asset versioning + rollback) ## Scope Acceptance for `[READY][SPA][P11] Cutover hardening`: 1. Dokumenteret strategi for cache-busting/versionering af SPA assets i Django staticfiles/reverse proxy setup. 2. Konfigurerbar rollback-procedure for `USE_SPA_UI` (trin-for-trin, target <10 min). 3. Smoke-artefakt for både SPA on/off i samme release-vindue. 4. Ingen gameplay-ændringer. ## 1) Asset versioning/cache-busting strategi Implementeret i SPA shell render-path: - Konfiguration i `partyhub/settings.py`: - `WPP_SPA_ASSET_BASE` (eksisterende) - `WPP_SPA_ASSET_VERSION` (ny) - `lobby/ui_views.py` injicerer `spa_asset_version` til template-context. - `lobby/templates/lobby/spa_shell.html` appender `?v={{ spa_asset_version }}` på: - `styles.css` - `main.js` Effekt: - Ny release-version (fx SHA/tag) kan tvinge cache-miss i browser/proxy uden ændring af route. - Rollback kan pege på tidligere stabil version-token med samme mekanisme. ## 2) Rollback playbook (`USE_SPA_UI`) — target <10 min Dokumenteret i `docs/spa-cutover-flag.md`: 1. Sæt `USE_SPA_UI=false`. 2. Sæt `WPP_SPA_ASSET_VERSION` til sidste stabile release-token. 3. Deploy/reload app-processer. 4. Verificér legacy routes (`/lobby/ui/host` + `/lobby/ui/player`). 5. Kør hurtig smoke sanity. 6. Log trigger/timestamp/resultat i smoke artifact. ## 3) Smoke artifact for SPA OFF/ON i samme release-vindue Dokumenteret i: - `docs/UI_SMOKE.md` (sektion: "Samme release-vindue: SPA OFF + ON verifikation") - `docs/STAGING_GAMEPLAY_SMOKE_ARTIFACT.md` (template udvidet med release-window check + `WPP_SPA_ASSET_VERSION`) Krav: - OFF-pass (legacy) og ON-pass (SPA) køres i samme deploy/release-vindue. - Begge passes logges i samme artifact med UTC timestamps og version-token. ## Non-goals bekræftet - Ingen gameplay-regler ændret. - Ingen API-kontrakter ændret. - Ingen UX-redesign; kun drift/cutover-hardening.