Are you sure you need to mess with all that dirty'ness?
The docs for addDirtyRect say:
playdate.graphics drawing functions now call this automatically, adding their drawn areas to the sprite’s dirty list, so there’s likely no need to call this manually any more.
I'm just a beginner on all this stuff, but I've done some basic stuff with sprites so far and haven't needed to mess around calling 'dirty' on anything.
(caveat: I've been using Lua, in case the APIs are very different.... but it doesn't seem so)
Okay, so I think I understand what the confusion might be.
Using markDirty on a specific sprite marks the sprites bounds as dirty.
In this specific example you will notice that the bounds are just the paddles size.
In order to allow the paddle to move across the entire width of the bottom row, you would actually want to not dirty the sprite, but instead, dirty the rect of where you expect the sprite to move through.
Here is an example that allows arbitrary movement:
I hadn't dug into this yet but in another bug I just discovered that markDirty() doesn't actually flag the sprite for redraw, only marks the drawn bounds dirty, as you say. I believe that fix will also make the original code here work as expected. I still don't have a good grasp on where this is a problem.. It seems like it'd be causing more trouble than it apparently is.