Long-standing Rails convention of putting business logic in ActiveRecord models (with lifecycle hooks like before_update/after_create) and keeping controllers thin. Rafael Zamaris cites fat-model thin-controller as a historical Spree design choice that contributed to maintainability problems, encouraging users to monkey-patch private methods on core models (e.g. OrderContents#add_to_line_item) to customize behavior — which service objects with dependency injection later replaced.