My favourite thing about this CastlevaniaBot project is that it had to be programmed to be imperfect so that the game remained interesting:
When speedrunners play through Castlevania, they perform maneuvers that make the game as deterministic as possible. For example, at the end of Level 1, they discovered that if they break the block and collect the shot upgrade with a particular timing sequence, then the boss will respond with a favorable pattern, resulting in a quick win.
No matter how skilled they are, humans cannot fully tame the RNG [random number generator]; however, since CastlevaniaBot can control button presses at frame granularity, it could take that speedrunning concept to the extreme by playing exactly the same game during each run. If it did, it would hardly be better than a TAS [tool-assisted speedrun] recording. Instead, CastlevaniaBot deliberately introduces minute errors and delays into its actions using its own external RNG to avoid deterministic gameplay. For instance, when it whips a high candle it intentionally delays the jump and the whip strike by a few random frames. Tiny changes like that have a significantly effect on how the game plays out.