All tasks #109-#114 implemented. GA_Gun runs tick-speed virtual bullets with hit% fitness. CMA_Gun, GF_Gun, and virtual guns selector removed from bot (libs kept on disk). Spec: #115.
shotsFired/shotsHit tracked in EvoBot. onBulletHit increments hits. onGameEnded logs battle hit% to stderr.
tickGA() returns bool on new champion. EvoBot.nim saves weights immediately on champion emergence via existing saveChampionIfBetter path. Round-end save kept as safety net.
EvoBot.nim fires using champion's ANN power output. Energy guard added. Cold start fires immediately with random/loaded weights.
GA runs synchronously in tickGA() called from onScannedBot. PopSize unified to 64. Background thread removed. Champion hot-swapped on fitness improvement.
New module libs/vbullets.nim. 64 candidates, spawnBullet/stepBullets/hitRate API. Circle-rect hit detection. Assert-based self-check for geometry.
ANN updated to 91→16→8→2. forward() returns (gf, power). Power output: tanh rescaled to [0.1, 3.0]. NumWeights=1626. Self-checks pass.