* DRYing up the validation logic via template methods in the ABC (factor out common `start()` method, delegate to `_do_start()` for concrete) * Factor out common width calculation via class variables for static content width * Strengthening the state machine enforcement (`progress()` after `end()` checking + unit tests) * Minor code modernization (enumerate, consistent state tracking) (switch `zip()` to `enumerate()`, use `self.total == 0` for "not started" detection)