It feels like I'm getting into a nice rhythm of alternating between improving my Cryptopals codebase, and extending it to deal with new challenges. After I got basic documentation done for some of the code, I started splitting out code from one of the more bloated modules. After I was satisfied with that, I got through the tenth challenge.
For the eleventh challenge, I'm going to consider things carefully, because I feel like every time I've done the eleventh challenge, the details of plumbing things together and having deterministic tests are more involved than the challenge description makes them sound.
One thing the description is making me ponder, and I'll hold off on this until I see where the challenges are going, is rewriting things to go from creating streams based on other streams, to picking a "main" stream where applicable, and expressing the current stream types as a bunch of composable stream transformers. The question of whether this makes sense to do for this project comes down to how many of the functions I'm going to have to write are going to look like "take a plaintext and produce a ciphertext with no other input". Also, how efficiently I can actually apply those transformations to a concrete stream.
I believe that, if I don't peek ahead, the correct course of action is "build that function signature out of existing components". And peeking ahead would probably just confuse me.
So, that's my plan for tomorrow. And my plan for now: try to sleep.