Yeah I agree, it would be nice at this point to have a documentation on how you intend to design the changeSet data structure.
For example, does it allow to add a command to a nested key? 

E.g. suppose you have the following lazy actions:
1) add a new machine;
2) create an LXC container inside the machine in 1;
3) add a unit to the LXC in 2.
The execution order is obviously important here, and we two nesting levels.

Here is another example:
1) add a unit to a machine;
2) remove that unit.
This should result in a no-op when the queryset is committed. Will this kind of logic be handled here?

Another example (sorry, I write too much):
1) create a new service;
2) change settings for that service;
3) change settings for that service again.
In this case, I guess the more convenient thing to do is ignoring 2. With the current approach, it looks like we would execute both 2 and 3.

I'd like to knwo what do you think about the following.
What about having a single addCommand(changeSet, key, command) method allowing for nested keys? e.g. "machine-new-1.lxc-new-1.django/2"? If this is crazy, please ignore me.

Another question: it seems you designed commands to be a linked-list-like array. I am ok with that if we are sure we can easily traverse the tree and modify/remove existing keys. Right now it seems the only traversing enabled automatically executes the next command, and this feels dangerous.