Keeping a semi-organized set of things here for now about the IOS tree that can hopefully be integrated into articles in the future.
(I'm talking about when IOSes stopped being monolithic)
IOS30 and IOS31 (which might be twins) start at CID 2. A modular IOS can't fit into 2 contents, so they must have had monolithic versions. Modularization was probably done through some kind of tool.
Also worth noting that many generic changes to IOS increment the version by the same amount (e.g. 3.7 -> 4.7), often seen in exploit fixes, so it is very possible that these were incremented the same amount. IOS28v1288 is 2.4 versions ahead of IOS22v772, and IOS30v1037 is 1.9 versions ahead of IOS22v772, but it may or may not make sense to increment the semimajor version, depending on when they did so in other cases. (TODO: what kind of rules did they use to update version numbers elsewhere?)
Random new observation: the first released version of IOS30 is v4.13, while the main version of IOS20 is v0.12. IOS30 also did not have an FW WiiConnect24 user agent in v1037. It’s possible that IOS30 was forked from IOS20, although that seems strange, since IOS20 is also from a very old branch. The WiiConnect24 version in IOS30 is also a direct increment of 1 superversion (1.0FC3 to 184.108.40.206), which may be the same thing as what happens with IOS version increments, and things were merged in later.
IOS was first split into modules on April 25 2007, seen in the KD, NCD, and WD build dates in IOS28v1288.
Core IOS modules were given $IOSVersion strings on June 7 and June 8, seen in the version strings of FS, IOSP, OH0, OH1, and DI, as well as the build dates where they exist, in IOS28v1288.
IOS modules were split to separate content files on June 12, seen in the ES $IOSVersion string in IOS28 and IOS30.
KBD was built on June 18.
SSL was split out (or possibly initially built?) on June 21.
The other modules (besides ES, FS, IOSP) were given $IOSVersion tags on June 28.