After managing a fork of Arbitrum for the past six months, there were many gotchas and "aha" moments which I wish clicked earlier on to avoid an overwhelming feeling of stupidity. One of those things being chain version management. Here I'll try to better demystify the different core components that are versioned and how they interplay.
High level
At a high level, there are four interwoven versioned entities:
Nitro software - L2 backend or node software
Nitro contracts - parent chain system contracts
ArbOS version - refers to core L2 execution engine
Consensus version - Versioned hash used to refer to a specific arbitrator machine artifact