In the Rive format docs it explains the following:
Following the properties is a bit array which is composed of the read property count / 4 bytes. Every property gets 2 bits to define which backing type deserializer can be used to read past it.
However as per the Cpp impl and from what I could tell from actually decoding the RIV files; for every 4 properties a whole u32 appears to be allocated - which the explanation doesn't mention. Should be updated for clarity for anyone trying to work with the format.
https://help.rive.app/runtimes/advanced_topics/format