There's a maxim that one should avoid making any semantic distinction
that is signaled by a difference in capitalization. The chief problem
with such distinctions is that they are hard to read aloud to others and
so you introduce the possibility of transmission errors whenever someone
fails to realize that q does not equal Q, etc.
It also makes loss of information possible whenever someone naively
case-folds your data. (Sword will, for example, manifest this error, if
the morphology codes are encoded as proposed and then used for a
morphology lexicon, as we've done for other systems. But we should be
able to fix this problem, in theory.) It's also common, not just in
Sword, to case-fold prior to performing a search. So the distinction
between q & Q, h & H, etc. will be lost by most applications that
perform searches over tagged data, unless case-sensitive searches are
possible and specifically designated.
I don't necessarily have a recommendation for what to use instead, since
you have > 26 stem codes for Hebrew. Some options would be to use
2-character codes for each stem type (but I do recommend using a
constant width for all stem codes). You could also use all 26 letters
and then add another non-letter like @ or & to represent the 27th stem-type.
The coding looks good otherwise (to this Semitic languages neophyte).
--Chris