Comment made by: khinsen
After a bit of thought, I think the right solution is to treat symbol macros like ordinary symbols in evaluation. This means that global definitions (defsymbolmacro) use namespaced symbols, whereas local symbol definitions (symbol-macrolet) accept only plain symbols and raise an exception for qualified symbols, just like let does.
With those rules, the way tools.macro handles namespaces in correct code is correct, but it doesn't do the required error handling because it lets you symbol-macrolet qualified symbols.
Note also that according to those rules, your example code is not correct. You have to write
(symbol-macrolet [~'type$ ...] ...)
and
(defmacro caster [x]
`(~'type$ ~x))
although you might then prefer to write the latter as
(defmacro caster [x]
(list 'type$ x))
but that's a matter of taste.