fix!(lua): G.GAME state survives menu+start — a previous run's won flag marks later losses as wins

Abierto
#232 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
48/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
lua, python
Área
api, backend, testing

Línea de trabajo

Comienza con la ruta menu→start en start.lua y luego inspecciona src/lua/utils/gamestate.lua:739 y play.lua:125 para ver cómo se serializa y consume won. Reproduce una victoria seguida de una derrota en una instancia de larga duración usando los trazados de acciones o los paquetes de reproducción indicados, y compara cada ejecución con un simulador en un proceso nuevo. Se considera terminado cuando los cuatro campos de estado indicados se reconstruyen en cada ejecución y bot.py no registra las derrotas como victorias.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Description

Starting a new run via menu + start on a long-lived instance does not fully
reset run state. We catalogued four distinct cross-run leaks, each confirmed by
replaying the identical action trace on a vanilla-faithful simulator (fresh
G.GAME every run) and diffing the full gamestate after every action.

  1. G.GAME.won — after any win in the session, a later run's GAME_OVER
    loss reports won = true. 16 instances observed; e.g. seed ESVPE7W2: 696
    chips vs Amber Acorn, unambiguous loss, live gamestate won = true — leaked
    from the previous run's ante-8 win on the same instance.
    src/lua/utils/gamestate.lua:739 serializes the raw global
    (state_data.won = G.GAME.won), so the stale value flows straight to
    clients; play.lua:125 also branches on it.
  2. G.GAME.last_tarot_planet — a fresh run's first Fool copied the tarot
    last used in the previous seed's run.
  3. G.GAME.pool_flags — gros_michel_extinct leaked: a run that never
    owned a Gros Michel was offered Cavendish in the shop (seed LS4ECDCB).
    Extinction only rolls for owned jokers at round end, so this is
    vanilla-impossible in-run.
  4. G.GAME.used_jokers key loss (mechanism unidentified, same family):
    live's shop offered j_banner while Banner sat in play (seed LS6VZ3ES) —
    impossible under the no-repeat pool. RNG forensics showed both sides drawing
    identical raw picks from the same stream; the sim resampled per no-repeat,
    live kept the duplicate, i.e. live had lost the key.

Root cause is presumably in how the run is rebuilt through the menu→start path
versus a fresh process launch (possibly SMODS-side), but balatrobot's start
endpoint is the natural place to defend against it.

Impact

This corrupts benchmark results, not just convenience:

  • balatrollm runs its whole task list through long-lived instances (the
    executor's port pool starts instances once) and starts each run with
    menu+start. bot.py ends a run as won when gamestate["won"] is truthy — so
    a loss that occurs on an instance after that instance has produced any win can
    be recorded and published as a win (run_won in the leaderboard data and
    the CC0 dataset).
  • Leaks 2–4 make seeded runs non-reproducible: shop and consumable outcomes
    depend on what earlier seeds did in the same instance.

Suggested Fix

In start.lua, after the run initializes, explicitly reset the leak-prone keys:
G.GAME.won = false, clear last_tarot_planet, and verify pool_flags /
used_jokers are freshly built. Alternatively (or additionally), document that
benchmark-grade data requires one process per run.

Repro bundles (action trace + both gamestates + field diff) available for every
seed cited.

Lenguaje dominante
Python
Estrellas
80
Forks
23
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de coder/balatrobot

Todos los issues de coder/balatrobot

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.