Re: 1. Yes, it has an API (define here https://github.com/rails/rails/blob/master/activemodel/lib/active_model/dirty.rb) but the problem is that it's incompatible with AR classes, as it requires you to call `define_attribute_methods` which is redefined in AR here (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods.rb) to get around that AR implements it's own version of dirty that patches AM's (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods/dirty.rb.) and accesses the changed_attributes hash directly. All of this is a long way of saying that while I agree it's a smell, I don't see a clean way to fix it.
Re: 2. Agreed.