I'd say the idea is that the implementation of a command/procedure needs to do the checking. In your example, arithmetic addition is usually provided by expr [0], which checks the expression it is fed before trying to calculate anything.
When you would like to concatenate strings (including numbers), you would use quoting or commands/procs made for that purpose instead.
My guess is that Dr. Hipp’s (SQLite author) meticulous and prolific use of testing ferrets out so many bugs that the ones that are left wouldn’t be caught by static typing.
In contrast, folks who rely heavily on static type systems may not write so many tests. For example I put more energy into making sure that my Haskell types capture the problem I’m trying to solve, so that the compiler flags my mistakes and exposes poor assumptions.
In that case, I can't imagine writing any significant amount of TCL and not having reached a point where you have a runtime error that would have been prevented had you had a static type system.
Am I missing something?