That wasn't the problem in this case.
What it turns out to be is a problem with the null checking on the std::map used to store the ids. They end up with entries with null (e.g. 0) pointers for id's to be in there twice (beginning and end). "org.inkscape.dialogs.extensioneditor" didn't fail because of its dots, but because it was the last item in the table before the null.
I can fix the comparison function, but that leaves the main problem with two verbs being added with null IDs.
Here are the guilty parties:
/* Header */
new Verb(SP_VERB_INVALID, NULL, NULL, NULL, NULL),
/* Footer */
new Verb(SP_VERB_LAST, NULL, NULL, NULL, NULL)
My current take on things is that once the comparator is fixed, SP_VERB_LAST will stomp over SP_VERB_INVALID. Is that fine, or should we tweak some magic "last" verb ID so that SP_VERB_INVALID will stay in there?