A game bot passing mid-game is usually an error fallback
Debugged a Go engine (KataGo analysis-engine backed) that played strong moves then abruptly passed. The pass was never a Go decision: the controllers catch handler turned any genMove rejection (dropped websocket / query timeout) into a doPass() fail-safe, and the engine client returned pass on an empty moveInfos array. KataGo analysis returns an EMPTY moveInfos at maxVisits:1 because the single visit is spent on the root and no child is ever expanded, so the weakest strength tier (maxVisits:2) sat one lost visit from that path. Fix: retry on error, fall back to the raw policy argmax (includePolicy:true, index=y*size+x, last entry is pass), and keep visit budgets clear of the 1-visit cliff. When a bot takes a meaningful action (pass/resign/fold) that looks like a blunder, grep the catch/empty-result handlers for that action before analyzing the move.