I understand that the relay chain needs to store proofs for a certain amount of final blocks if a dispute occurs. But it's not clear to me what the implementation decisions were for explicitly writing certain things to Polkadot's runtime storage (such as the bit fields for availability and the
onChainVotes from the
Why is writing this to Polkadot's runtime storage really necessary if it's only needed per block? Assuming there's a good reason, why can't it work outside the runtime?