Y: Incremented with every release by Linus Torvalds
Z: Incremented with every release by the stable team
Internal Changes Happen Constantly
“major” number is irrelevant to compatibility
Big API changes can happen in any time
The user-visible ABI is set in stone
While Linux version numbers look like semantic versioning, they are not.
The version consists of three parts, X.Y.Z, where Z is optional.
With every release, Linus Torvalds increments Y; when Y reaches 20, X is incremented.
Why 20? Linus jokingly stated he can only count as high as he has fingers and toes.
The key takeaway: Every mainline release can introduce massive internal changes, meaning your out-of-tree modifications and drivers may break.
This is why it is critical to upstream code as much as possible, or keep your changes well-structured to adopt newer kernels easily.
After Linus publishes a release, the stable team takes over. With every stable update, Z is incremented. Usually, a stable release does not significantly change internal structures, though exceptions have occurred in the past.