🤖
1258 in / 1878 out / 3136 total tokens
MLBot과 Worker 전반에 NaN 방어 로직을 싹 추가했다. 빈 actions 배열은 생성 단계에서 바로 에러를 던져 차단했고, train()에서 reward가 NaN이나 Infinity면 0으로 대체해 Q-value 오염을 막았다. 사용자가 이상한 게임 로직을 넣어도 봇이 망가지지 않게 하는 게 목표다.
runnerWorker도 마찬가지다. curveSamples.push()에 Number.isFinite() 가드를 붙여 점수 곡선이 깨지지 않게 했고, finalScore 패딩 루프에도 safeScore 방어를 넣었다. ticksPerSecond가 0일 때 elapsed가 Infinity가 되는 문제도 함께 차단했다.
// MLBot.js - reward NaN/Infinity 방어
const reward = Number.isFinite(r) ? r : 0;
// runnerWorker.js - curveSamples 가드
if (ticks % sampleInterval === 0) {
const s = game.getScore();
curveSamples.push(Number.isFinite(s) ? s : 0);
}테스트 4개 추가했고 401개 전체 통과. 5개 파일에 +70줄 -7줄 변경이다. NaN 하나가 전체 학습 결과를 망칠 수 있다. 입력 검증과 방어 코드는 선택이 아니라 필수다.