1. Síntoma
Sin un gate, un build podía salir con Last Run roto en un idioma o un esquema de control, un grafo de historia que aún citaba capítulos inalcanzables, o un save de cloud que pisaba un archivo local más nuevo. Playtestear una máquina en un idioma lo ocultaba.
2. Impacto en el jugador
Un Last Run en el idioma equivocado, celdas de mando que nunca vieron el tutorial, o un restore de cloud que se come el progreso son fallos de jugador. No son “Steam caído”. Son checks que faltaban antes de que el depot saliera live.
3. Reproducción
Leer en package.json los scripts qa:release:logic y qa:release. Correr el target de lógica en CI o en local; tiene que poder fallar. El log de desarrollo de v0.4.89–v0.4.91 indica Last Run Electron EN/ES × KBM/mando 4/4 y qa:release en verde como condición de pase. No pegar Steam Guard, logins de builder ni Partner IDs en notas públicas.
4. Ownership del sistema
Scripts: qa:release:logic y qa:release. Cloud: play/systems/steam-cloud.js (nombre de archivo remoto, debounce, backup antes de overwrite). Saves: save-schema / state. Harness de Last Run: last-run-qa-runner.js. El versionado de la etiqueta marketing/juego es otro pipeline documentado y no es este incidente.
5. Supuesto erróneo
Si corrió en el PC del desarrollador, está listo para Steam. El sync de cloud es “problema de Steam”. Un pase de Last Run en inglés con ratón cubre español y mando. Estar en la tienda equivale a release engineering.
6. Causa raíz
El release es una matriz: idioma × input × save/cloud × grafo de historia × exe empaquetado. Una sola partida muestrea una celda. Autosave-antes-de-cargar y overwrite de cloud son bugs de orden; solo aparecen con dos máquinas o un New Game cuando ya hay archivo en cloud. Sin un script npm con nombre que falle el build, esas celdas siguen siendo opcionales.
7. Arreglo mínimo
Hacer bloqueante qa:release:logic (tests + validate-release + grafo de historia). Añadir celdas Electron de Last Run idioma × dispositivo. Documentar reglas de cloud: no pisar antes de cargar; New Game debe subir la run nueva; rechazar schemas futuros desconocidos. Dejar los datos admin de Steamworks fuera de los casos públicos.
8. Test de regresión
qa:release:logic es el paquete automatizado. last-run-qa-runner.js codifica la matriz de 4 celdas de Last Run. steam-cloud.js queda cubierto por tests de flush en el log. Esta página de la Academy no vuelve a ejecutar esos binarios.
9. Validación de release
Log de desarrollo 15 ago 2026, v0.4.89 (persistencia/cloud/grafo) y v0.4.91 (qa:release en verde, harness Last Run). La ficha pública de Steam sigue en store.steampowered.com/app/4901100/. Aquí no se publican contraseñas de depot ni Partner IDs.
10. Lección generalizada
Publicar es una checklist que puede fallar, no un screenshot de la tienda. Codifica idioma, input y persistencia como celdas. Nunca pongas la identidad admin de Steamworks en textos educativos. Una IA que “solo sube el build” se salta los únicos tests que pillan Last Run y el orden de cloud.
Evidencia pública
- Scripts de package.json qa:release y qa:release:logic (unit + grafo de historia + validate-release + QA Electron).
- Log de desarrollo de CONTRABAND, 15 ago 2026, v0.4.89–v0.4.91.
- play/systems/steam-cloud.js (solo conducta pública: archivo de save con nombre, debounce, backup).