It is possible for `get_html` to change the state of the module. We've implemented a toy XBlock that does just this (it aggregates the number of views, a number that is incremented on render). So we want to ensure that use case is caught.

We do maintain a list of dirty bits, and XBlock save performs a nop if there is nothing to write. See our XBlock PR that implements this: https://github.com/edx/XBlock/pull/34 particularly XBlock.save in core.py