O sintoma parecia corrupção
Depois de um update manual, opencode --version parou de funcionar. O pacote global dizia opencode-ai@1.18.25, mas o launcher ativo era um arquivo ASCII de 479 bytes que apenas informava que o pós-instalação não havia sido executado.
O que realmente aconteceu
A transação npm install --global opencode-ai@1.18.25 terminou com exit 0. O log, porém, registrou que o npm 12 bloqueou o script postinstall porque opencode-ai não estava coberto por allowScripts. Os payloads Linux x64 foram baixados e estavam íntegros: ambos eram ELF e respondiam 1.18.25 diretamente.
Essa diferença é operacionalmente decisiva. “O pacote foi instalado” não significava “o binário efetivo está pronto”. A versão do manifesto estava correta; o caminho executado pelo usuário, não.
Reparo mínimo, sem ampliar o blast radius
O lote foi tratado como B1/R1: snapshot do launcher, rollback nomeado e nenhuma alteração em configuração, autenticação, banco, servidores, npm policy ou outros CLIs. Em vez de reinstalar tudo, o postinstall.mjs já presente no pacote foi executado uma única vez para materializar o payload correto.
Evidência depois da correção
O launcher passou a ser um ELF x86-64 de 184.682.624 bytes. opencode --version, opencode --help, opencode serve --help e opencode run --help passaram. O pacote continua em 1.18.25, que era o latest observado; nenhum upgrade adicional foi necessário.
Há uma nuance para a próxima arqueologia: opencode version não é subcomando válido nesta versão e é interpretado como caminho de projeto. O probe correto é opencode --version.