I think you're mixing up `PushPromiseFrame.promised_stream_id` and `Stream.promised_stream_id` - the former is just an attribute that gets set when the frame is parsed, while the latter keeps track of the promised stream ID of the `PUSH_PROMISE` frame across a sequence of a `PUSH_PROMISE` and zero or more `CONTINUATION` frames. I think more comments would do the trick here; there's a lot of subtle logic in `Stream.receive_frame` that's quite difficult to infer.