So much love for Snakebird! (That game was inspiration for me to make two mobile games)
The later levels were put in very late on, and so there was an intended solution, and then it turned out it could be done with less players and we didn't have time to adjust. I agree that having red herring puzzle elements just for the sake of it is mostly just frustrating to the player.
Implying a wrong solution? Fair game.
Putting in elements that actually don't need to be used? Less great.
As for the input recording? I thought we'd need a really clever solution due to memory constraints, but it turned out to not be an issue. Basically we're just recording the joystick vector and the state of the action button every single frame, and storing it in an array that is as long as the time you have for the level. (10 seconds = 600 frames = new FrameInput[600])
Then, each frame we increment the frame number by one. If the player is being controlled, that input data is stored to the array. If the player is not being controlled, the data is read from the array and used as the input for that frame instead. We used an integer for button state so we could tell the difference between button down, and button hold.
If we really needed it to be memory efficient, we could have instead stored the four directional buttons as bitflags, and then stored all five buttons in a single byte. 600 frames of data would then be 600 bytes. But premature optimisation is the root of all evil and all that, turns out we didn't run into any problems for this gamejam doing it like this.
Hope that made sense! If there's anything else you'd like to know just ask! ^_^
(-Joe)