fix(crash): carteira cripto injetada não é bug do jogo — window.ethereum para de abrir issue (#403) - #406
Conversation
…eum para de abrir issue (corosolto#403) A corosolto#403 e a corosolto#404 chegaram como classe `codigo`, alpha.172, com origem e stack apontando para a PRÓPRIA PÁGINA: TypeError: undefined is not an object (evaluating 'window.ethereum.selectedAddress = undefined') TypeError: undefined is not an object (evaluating 'window.ethereum.emit') Origem: https://www.csbrasil.online/:1:16 Stack: global code@https://www.csbrasil.online/:1:16 Não é defeito do jogo, e a prova é tripla. `window.ethereum`, `selectedAddress` e qualquer identificador web3 NÃO existem em nenhum arquivo do repositório, e `git log --all -S` não devolve um único commit para nenhum dos dois (o `mint-assets.json` é o registro do gerador de modelos 3D da mint.gg, não tem web3). O fingerprint publicado reproduz EXATAMENTE `crashFingerprint('error', <mensagem>, 'https://www.csbrasil.online/:1:16')` — `ab1ad30e` na corosolto#403 e `e32cd1e4` na corosolto#404 —, ou seja o `e.filename` é a própria página, `lineno=1`, `colno=16`. E o único frame é `global code@`: nenhum arquivo do jogo aparece na pilha. É extensão de carteira cripto injetando script INLINE no documento. O `index.astro` já dizia isso em comentário desde antes: "extensões de carteira injetam vários". Causa: o `isExternalCrash` inocenta por ORIGEM, e o Safari reporta script de extensão injetado no mundo da página com o filename da página. O atalho `if (sourceOrigin === ownOrigin) return false;` decidia "é nosso" antes de qualquer outra prova, nenhuma das regex seguintes mordia (OPAQUE_RE, AMBIENTE_RE, CACHE_SPLIT_RE, RECOVERABLE_RE, MEDIA_ABORT_RE) e o `classifyCrash` caía no `return 'codigo'` final, que escala. As irmãs corosolto#138 ("Cannot redefine property: ethereum") e corosolto#166 ("Failed to connect to MetaMask") são a MESMA família, mas traziam `chrome-extension://` no source/stack e já caíam na EXTENSION_RE — seguem `externo`, e a régua as fixa como fixture. O que era novo em corosolto#403/corosolto#404 é a forma sem esquema de extensão em campo nenhum. Correção em duas camadas espelhadas, o mesmo remédio das BUG-51/72/73: - src/lib/error-provenance.mjs — CARTEIRA_RE e o ramo em `isExternalCrash`, na MESMA posição e pelo mesmo motivo da VENDOR_RE: antes do atalho same-origin, porque a carteira roda no próprio domínio mas o código é de terceiro. A linha continua gravada no `js_error`; some o disparo automático, não o dado. - src/pages/index.astro — a MESMA redação em `origemDoJogo`. Nenhuma cota nova: carteira cai no balde do TETO_EXTERNO que a BUG-51 já abriu (ao contrário do TETO_MIDIA, que a BUG-73 precisou criar). Com `interna === false` o erro também deixa de virar `erroDoBoot` e `lancamento.fail` — uma carteira que estoura durante o boot podia ser acusada de ter derrubado o carregamento do jogo. O corte é ESTREITO: exige o NOME do global injetado (`window.`/`globalThis.`/`self.` + ethereum|solana|tronWeb|…), nunca a forma da mensagem. Cobre a FAMÍLIA de carteiras e não uma regex por incidente — que é a crítica que a BUG-72 fez ao padrão antigo. Medido (helper e `origemDoJogo` reais, extraídos do fonte, sem browser): corosolto#403/corosolto#404 classificadas externo ............ 0/2 -> 2/2 corosolto#403/corosolto#404 abrem issue ...................... 2/2 -> 0/2 cliente inocenta a carteira ................ 0/5 -> 5/5 vizinhas que continuam `codigo` ............ 5/5 -> 5/5 (inalterado, de propósito) Custo declarado, na população real e não estimado: reclassificando as 90 issues `crash-auto` do repositório com o helper de antes e o de depois, exatamente 2 mudam de classe — a corosolto#403 e a corosolto#404. As outras 88 ficam idênticas (51 `codigo`, 25 `externo`, 12 `recuperavel`). NENHUMA outra issue deixa de abrir. Régua: EP16 em tools/eval/error-provenance-check.mjs (npm run eval:error-origin, já no check:fast e no check:deploy — nenhum passo novo no portão). Classifica os payloads REAIS das duas issues, confere os fingerprints publicados contra a receita (fixture "arrumada" deixa de bater e acusa), exige que 5 mensagens vizinhas continuem `codigo` e EXECUTA o `origemDoJogo` recortado do fonte — regex de fiação sozinha aprovaria `function origemDoJogo(){ return true; }`. Carrega ainda uma INVARIANTE DE HONESTIDADE: varre `src/` e `public/js/` e fica VERMELHA no dia em que o jogo tiver um `window.ethereum` de verdade, para o corte não virar mordaça silenciosa sobre código nosso. Mutantes novos: sem-carteira, carteira-ampla e sem-carteira-cliente, todos acendendo EP16. Cláusulas 15->16, matriz de mutação 42/42. BUG-75 no KNOWN-BUGS.md. O bloco gerado de autoria do colaborar.md (pt e en) foi regenerado com `npm run docs` porque este commit muda o `git shortlog` da branch - mesmo passo que o corosolto#382 e o corosolto#389 deram, e sem ele o eval:docsautoria não tem como medir. NÃO VERIFICADO: não há browser nesta máquina, então a reprodução com uma extensão de carteira de verdade não foi feita — a régua mede a CLASSIFICAÇÃO, não a injeção. A tabela `js_error` do Supabase não foi consultada. No portão local, `audio:check` reprova por falta dos assets de áudio (gitignored, ausentes nesta máquina): reprova IDÊNTICO na árvore limpa de origin/main, antes de qualquer mudança deste commit. Os outros 56 passos passam, e o check:deploy fecha 30/30. Closes corosolto#403 Closes corosolto#404 Signed-off-by: nunreasonable <rafaelpasquarella@gmail.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Agent: Claude Code (Opus 5)
|
@nunreasonable is attempting to deploy a commit to the rubenmarcus' projects Team on Vercel. A member of the Team first needs to authorize it. |
|
🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label |
csbrasil-bot classificationNote @nunreasonable abriu 5 arquivo(s) · +90 −2, base main. O que mudou
Labels
|
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- docs (3):
KNOWN-BUGS.md,colaborar.md,colaborar.md - backend (1):
error-provenance.mjs - site (1):
index.astro - arnês (1):
error-provenance-check.mjs
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
limpo pelos critérios das minhas ações desta rodada
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
— maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡
|
Esbirro · plantão da produção · 🕵️ check vermelho parado neste PRCaution Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.
Vermelho: Rabo do log: — de plantão: vi, registrei, hora no relógio 🕵️ |
|
🤖 autofix: o conserto encostou em arquivo fora da lista de permissão, então não commitei nada. Rode |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão. Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
1 similar comment
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
Esbirro · plantão da produção · 🕵️ check vermelho parado neste PRCaution Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.
Vermelho: Rabo do log: — nada fora do normal no meu turno 🕵️ |
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- docs (3):
KNOWN-BUGS.md,colaborar.md,colaborar.md - backend (1):
error-provenance.mjs - site (1):
index.astro
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
pente fino passado: nenhum achado que eu defenda em voz alta
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
— maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡
Dois defeitos apareceram no PRIMEIRO disparo real da automação, e os dois eram meus: 1. O commit de regeneração do autofix não levava o trailer `Agent:`. O agente_check cobra esse trailer de TODO commit do PR, então o bot consertava a doc e reprovava o mesmo PR no passo seguinte. Atingiu #400, #405, #406, #365, #372, #373 e #375 de uma vez. 2. O job `avaliar` do preview-bot rodava `python3 scripts/ci/ensure_labels.py` sem nunca ter feito checkout - "No such file or directory". O passo era resto do desenho antigo: o preview por etiqueta morreu quando ele virou build-sem-segredo + deploy-sem-código, então a etiqueta não é mais necessária e o passo saiu. A AF7 guarda o primeiro: todo `git commit` do bot tem de levar `Agent:` e `Signed-off-by:`, que são exatamente os trailers que o CI cobra de gente. Bot que não cumpre a própria régua da casa não ajuda ninguém. O mutante `commit-sem-trailer` remove o Agent e acende. Agent: Claude Opus 5 (Claude Code) Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label |
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 preview no ar → https://csbrasil-28aji5mqv-rubenmarcus-projects.vercel.app |
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- docs (3):
KNOWN-BUGS.md,colaborar.md,colaborar.md - backend (1):
error-provenance.mjs - site (1):
index.astro
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
pente fino passado: nenhum achado que eu defenda em voz alta
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
— todo bug confessa no diff, eu só faço o interrogatório 🤡
|
Esbirro · plantão da produção · 🕵️ check vermelho parado neste PRCaution Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.
Vermelho: Rabo do log: — de plantão: vi, registrei, hora no relógio 🕵️ |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label |
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label |
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 preview no ar → https://csbrasil-88h0wtay2-rubenmarcus-projects.vercel.app |
|
🤖 preview no ar → https://csbrasil-qr16mrnfl-rubenmarcus-projects.vercel.app |
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- docs (3):
KNOWN-BUGS.md,colaborar.md,colaborar.md - backend (1):
error-provenance.mjs - site (1):
index.astro
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
limpo pelos critérios das minhas ações desta rodada
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
— maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡
|
Esbirro · plantão da produção · 🕵️ check vermelho parado neste PRCaution Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.
Vermelho: Rabo do log: — de plantão: vi, registrei, hora no relógio 🕵️ |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label |
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
Agent: csbrasil-bot (autofix) Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label |
|
🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso. |
|
🤖 preview no ar → https://csbrasil-3v9o6apn6-rubenmarcus-projects.vercel.app |
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- docs (3):
KNOWN-BUGS.md,colaborar.md,colaborar.md - backend (1):
error-provenance.mjs - site (1):
index.astro
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
limpo pelos critérios das minhas ações desta rodada
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
— maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡
|
Esbirro · plantão da produção · 🕵️ check vermelho parado neste PRCaution Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.
Vermelho: Rabo do log: — de plantão: vi, registrei, hora no relógio 🕵️ |
O que é
A #403 e a #404 chegaram como classe
codigo, alpha.172, com origem e stack apontando para a própria página:Não é defeito do jogo. É extensão de carteira cripto injetando script inline no documento.
A prova, tripla
window.ethereum,selectedAddresse qualquer identificador web3 não existem em nenhum arquivo do repositório, egit log --all -Snão devolve um único commit para nenhum deles. Omint-assets.jsoné o registro do gerador de modelos 3D da mint.gg, não tem web3.crashFingerprint('error', <mensagem>, 'https://www.csbrasil.online/:1:16')— ou seja oe.filenameé a própria página,lineno=1,colno=16.global code@: nenhum arquivo do jogo aparece na pilha.O próprio
index.astrojá dizia isso em comentário desde antes: "extensões de carteira injetam vários".Causa
O
isExternalCrashinocenta por origem, e o Safari reporta script de extensão injetado no mundo da página com o filename da página. O atalhodecidia "é nosso" antes de qualquer outra prova; nenhuma das regex seguintes mordia e o
classifyCrashcaía noreturn 'codigo'final, que escala e abre issue.As irmãs #138 e #166 são a mesma família, mas traziam
chrome-extension://e já caíam naEXTENSION_RE. O que era novo aqui é a forma sem esquema de extensão em campo nenhum.Correção — duas camadas espelhadas (mesmo remédio das BUG-51/72/73)
src/lib/error-provenance.mjs—CARTEIRA_REe o ramo emisExternalCrash, na mesma posição e pelo mesmo motivo daVENDOR_RE: antes do atalho same-origin, porque a carteira roda no próprio domínio mas o código é de terceiro. A linha continua gravada nojs_error; some o disparo automático, não o dado.src/pages/index.astro— a mesma redação emorigemDoJogo. Nenhuma cota nova: cai no balde doTETO_EXTERNOque a BUG-51 já abriu. E cominterna === falseo erro deixa de virarerroDoBoot/lancamento.fail— uma carteira que estoura durante o boot podia ser acusada de ter derrubado o carregamento.O corte é estreito: exige o nome do global injetado, nunca a forma da mensagem. Cobre a família de carteiras e não uma regex por incidente — a crítica que a BUG-72 fez ao padrão antigo.
Custo declarado, medido na população real
Reclassificando as 90 issues
crash-autodo repositório com o helper de antes e o de depois:codigo->codigoexterno->externorecuperavel->recuperavelcodigo->externoNenhuma outra issue deixa de abrir.
Régua
EP16 em
tools/eval/error-provenance-check.mjs(npm run eval:error-origin, já nocheck:faste nocheck:deploy— nenhum passo novo no portão):codigo(a palavra solta num texto nosso, crash dentro de arquivo do jogo, e o crash do script inline da própria página);origemDoJogorecortado do fonte — regex de fiação sozinha aprovariafunction origemDoJogo(){ return true; };src/epublic/js/e fica vermelha no dia em que o jogo tiver umwindow.ethereumde verdade, para o corte não virar mordaça silenciosa sobre código nosso.Mutantes novos —
sem-carteira,carteira-ampla,sem-carteira-cliente— todos acendendo EP16. Cláusulas 15 -> 16, matriz de mutação 42/42.BUG-75noKNOWN-BUGS.md.Verificação
npm run check:deploy— 30/30npm run check:fast— 56/57; a única reprovação éaudio:check, e ela reprova idêntico na árvore limpa deorigin/main(os assets de áudio são gitignored e não estão nesta máquina)NÃO VERIFICADO: não há browser nesta máquina, então a reprodução com uma extensão de carteira de verdade não foi feita — a régua mede a classificação, não a injeção. A tabela
js_errordo Supabase não foi consultada.Closes #403
Closes #404