Adding that info to .fnx is a good idea. But I'm not sure it will solve the problem demonstrated in the test, only in different order.
Say the app adds field "a" w/ omitNorms=false and commit(). Then .fnx records that field "a" stores norms and you can call IR.setNorms. Afterwards it adds field "a" w/ omitNorms=true – now what? Do we fail the addDocument() (I think we should)? If we don't, then norms will be merged away, according to trunk's semantics.
So I think we should fix the jdocs + throw the ex from IR.setNorms in this issue, and open a separate one for tracking norms in .fnx + fixing the scenario I've described above?
Do we have a ready-to-use exception? If not, how about IllegalArgEx (cause the field is an illegal arg, but weak), IllegalStateEx (cause the field does not track norms, but that ex is usually associated w/ Threads' states), IllegalOpEx (is there such ex)? At any rate, we must throw a RuntimeEx (at least in 3x) to not break apps, compile-wise.