Você tá certo e essa é uma correção que eu precisava ouvir. Tipagem fraca não é "fazer coerção implícita o tempo todo" são eixos ortogonais, e o seu exemplo com Lua é o contraexemplo perfeito que eu devia ter incluído desde o começo.
Acabei de reescrever a seção inteira do post com essa distinção explícita: tipagem forte/fraca é sobre o que acontece quando tipos incompatíveis se encontram numa operação; coerção implícita é uma escolha ortogonal de design. Lua é fortemente tipada e faz coerção porque o operador + é inequivocamente soma numérica, a conversão é determinística e não muda semântica. JavaScript é fraca porque o mesmo operador + tem dois significados possíveis (soma ou concatenação) dependendo do tipo dinâmico dos operandos em runtime. O engine precisa adivinhar a intenção, e a decisão muda silenciosamente o resultado. Esse é o ponto real.
Para deixar explícito no post, incluí uma tabela comparando Python (forte, sem coerção), Lua (forte, com coerção) e JavaScript (fraca, com coerção), exatamente como você formulou no comment.
Aproveitei para corrigir outras imprecisões no mesmo post enquanto estava nele: "Abstract Equality Comparison" (nome antigo da spec) virou "IsLooselyEqual" / "Loose Equality" (nome correto pós-ES2015); a seção do event loop foi reescrita separando linguagem (ECMAScript define Job Queue pra microtasks, só isso) de runtime (Node/libuv, browser/HTML spec, Bun/Zig, Deno/Tokio, cada um com sua implementação); e "React Concurrent Mode" (nome descontinuado) virou "Concurrent Rendering" com menção ao scheduler interno.
Obrigado de verdade pelas duas correções, a desse post e a do "Mapa Completo". Feedback técnico direto assim é mais útil que qualquer métrica de engajamento. Se rolar de você passar de novo pelos posts daqui do blog e ver mais algum deslize, manda bala que eu corrijo.