Effectively the only Z-Machine extension to ever gain traction was the introduction of the unicode opcodes. The 1.1 proposal wasn't ever fully ratified, possibly in part because there was no way to detect the new opcodes other than by checking whether the VM set the version to 1.1, which it couldn't do unless it fully implemented the new spec. There was no way to partially implement the proposal.
I suggest that we introduce a feature testing function, ie, a gestalt opcode. It would have the same syntax as Glulx's @gestalt, and an opcode number of EXT:127: @"EXT:127S". Opcodes EXT:128-255 would then be available for further extensions.
But, how can we detect whether this gestalt opcode will exist or not?
Following David Kinder's suggestion
we will set the VM interpreter number to 20, but only for games with a serial number of 100000-820000 (ie, from 2010 until 2082, when serial numbers will start overlapping with the original infocom ones.) This means that old games which actually cared about interpreter numbers will not run the risk of getting confused.
Now, I just need to decide where a good place for a registry of gestalt selectors and new opcodes should be. I'll be taking submissions and will be happy to assign codes to those with reasonable extension proposals.
I intend to implement this in Gnusto. I hope other VM maintainers will get on board too.Edit
: The draft proposal has been posted at http://curiousdannii.github.com/if/zspec12.html