Ah, I see now. We didn't have that problem with axes because there you always remove the last one. We didn't have it with servers, because server IDs are managed on the server-side. We didn't have the problem with expressions either, because expressions aren't referenced by a persisted ID (only by their current list index while refreshing a graph).

I think the approach of having a dynamic list with constantly increasing numeric IDs for format strings is better than having this static list though (which needs to be persisted for every widget). It's kind of like objects and their IDs are handled in a database. And the select input should automatically do the right thing when adding and removing elements to/from the list. So yeah, I think I prefer that.