Direct vs. ripple: direct changes represent edits to the class definition itself (verified via OMC getSourceFile & AST inspection). Ripple changes reflect semantic evolution inherited from modified library dependencies in the transitive closure — the class's own source file was untouched.
Total classes and the simulation-eligible subset, sampled at the first commit of each year.
Distribution across all classes under the active ordering.
Median 38.7 commits per version on the first-parent chain.
Median 8.7: date ordering interleaves merged branches and inflates churn 4.4×.
Ripple attribution is provisional — derived from changed-file path prefixes.
The long right tail is the library-wide sweep commits.
Unknown verdicts are never counted as passes.