You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Cierro la sub-etapa 2.3 con el patron de motor host ya estandar (drift
+ comportamiento + goldens). El bloque A* del motor (`_walk_passable`,
`_snap_walkable`, `_heuristic`, `engine_astar`, lineas 1097-1214 de
agemki_engine.c) es 100% portable: puro algoritmo, sin VGA, sin
malloc, sin globals del game loop. Por eso la copia byte-exact en
tests/engine_host/lib/astar.c funciona sin parches.
Por que estas tres garantias:
- Drift: el regex captura el bloque entero del motor y lo compara
byte-a-byte contra la copia. Si tu cambias engine_astar manana, el
test rojo te avisa antes de que el SHA-256 de los goldens diverja
por motivos no obvios.
- Comportamiento (50 casos sobre 5 walkmaps): rangos de longitud,
reachability esperada, primer/ultimo waypoint coherentes con
start/target tras snap. Si el motor pierde la capacidad de encontrar
rutas, el test falla con un mensaje legible (`expected 0 to be >= 14`),
no solo con "SHA cambio".
- Goldens deterministas (manifest.json): SHA-256 del raw del runner
por caso. Cambiar el orden de expansion, los costes 10/14, o el
tie-breaking altera el hash y rompe el test.
Walkmaps elegidos para cubrir las situaciones reales del motor:
- room_open: ruta directa, valida diagonales y clamping de coords.
- room_with_obstacle: bloque 12x6 forzando detour por arriba/abajo.
- corridor_l: forma de L, A* tiene que doblar.
- maze_simple: pasillos en patron #, varias rutas posibles.
- disconnected: barrera vertical, valida que `return 0` cuando no
hay ruta funciona.
Un guardarrail explicito: el caso `corr/snap-radius-cap` documenta que
`_snap_walkable` esta acotado a radio 4 celdas. Si Javi amplia el radio
en el motor (cambiando el `r <= 4` en agemki_engine.c:1107), este caso
empieza a devolver una ruta y el SHA cambia. Es un anclaje sobre una
decision de diseno que de otra manera pasaria desapercibida.
Decision: NO escribi reimpl JS del A* (a diferencia de CRC32 y PCX).
Para algoritmos con tie-breaking sensible al orden, replicar la logica
en JS aporta poco: si la JS no es identica al C el bit-exact falla por
motivos que no son bug. Drift + goldens dan suficiente cobertura.
Documentado en la seccion "Como anadir un nuevo modulo" del README.
Por que `astar_batch` ademas de `astar`: 50 spawns en Windows costarian
~2.5s solo en arrancar el binario. Una sola spawn que lee 50 lineas de
stdin + cachea el ultimo walkmap_path entre casos del mismo mapa
reduce el coste a ~150ms cross-platform.
Tambien anoto F-07 en tests/FINDINGS.md (descubierto en este mismo
trabajo): `runner.dSYM/` se colaba en `git status` porque la regla
gitignore tenia un comentario inline. El fix va en commit aparte.
Estado: 311 tests verde (257 + 54). Tiempo total npm test: ~10s,
identico mac+windows x Node 22+24.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments