Skip to content

fix(crash): arnes de automacao apontado para producao nao e crash do … - #587

Merged
rubenmarcus merged 2 commits into
corosolto:mainfrom
nunreasonable:fix/573-arnes-de-automacao-abre-issue
Sep 17, 2026
Merged

rubenmarcus merged 2 commits into
corosolto:mainfrom
nunreasonable:fix/573-arnes-de-automacao-abre-issue

Conversation

@nunreasonable

Copy link
Copy Markdown
Contributor

…jogo (#573, #574)

Relato, literal das duas issues abertas pelo crash-fix.yml em alpha.246, classe codigo, com 8 segundos de diferenca:

#574  __game is not defined                          fingerprint b81fb1c4, origem vazia
#573  Falha ao abrir partida: __game is not defined  fingerprint 23f0069c, origem promise
Stack identica nas duas:
  ReferenceError: __game is not defined
      at eval (eval at predicate (eval at evaluate (:311:30)), <anonymous>:1:18)
      at UtilityScript.evaluate (<anonymous>:313:16)

Diagnostico: UtilityScript, eval at predicate e next sao a assinatura do poller que o page.waitForFunction() do Playwright injeta DENTRO da pagina. Alguem apontou um arnes de automacao para producao com um predicado que le __game sem o window.. O window.__game e escrito num unico sitio, public/js/main.js:1287, dentro do _startGame(): antes da primeira partida ele e global NAO declarado, entao window.__game devolve undefined mas __game pelado lanca.

Dai o caminho e o mesmo da BUG-76: a stack do Playwright nao tem UMA URL http, entao o origemDoJogo de src/pages/index.astro:346 cai no return !viuExterna (:219) e marca como interna. Com interna === true o :351 manda #574 comendo um slot de TETO_SESSAO, o :352 dispara lancamento.fail (etapa partida, aberta em main.js:1154) e o :290 manda #573 com o prefixo -- que muda o hash FNV. UM evento, DUAS issues, e o painel falso "A ARENA NAO ABRIU" para quem nao era jogador.

AS DUAS SAO O MESMO EVENTO, E O HASH PROVA. Os dois fingerprints publicados reproduzem byte a byte a receita de crashFingerprint (src/lib/error-provenance.mjs:117-122), cada um com o kind/source do seu caminho: ('promise', '__game is not defined', '') = b81fb1c4 e ('error', 'Falha ao abrir partida: __game is not defined', 'promise') = 23f0069c.

OS DOIS PALPITES OBVIOS, REFUTADOS COM MEDICAO.

  1. "conserte o predicado na origem." git grep por waitForFunction com __game nao-qualificado em TODOS os refs (upstream/, fork/, origin/*) devolve ZERO: os ~60 predicados da arvore sao todos window.__game. O unico __game pelado executavel era tools/eval/sertao-traversal-check.mjs:68, dentro de um page.evaluate -- forma de stack diferente, sem os frames predicate/next. O script ofensor NAO esta sob controle de versao. Foi endurecido junto por ser a mesma classe, mas nao era ele.

  2. "corte em __game, ou em \w+." window.__game e o handle PUBLICO do jogo (SECURITY.md:9, e foi por ele que a crash em produção: %c[cheat-demo] ainda sem window.__game — você está no menu. Entre numa partida (JOGAR) e o cheat ativa sozinho. color:#ff2244;font-weight:bold #382 entrou); a BUG-76 proibe o corte generico \w+ porque sete globais do jogo sao dunder; e a fixture naoInjetadoFixtures da propria regua exige que "...evaluating 'window.__game.start'" continue codigo. Cortar no nome do global calaria crash nosso.

Correcao: corte pelo NOME do injetor, e so na STACK. Ao contrario da #568, aqui o nome E estavel -- UtilityScript e identificador do Playwright, nao e gerado por sessao. Sensivel a caixa, pelo mesmo motivo da BUG-76.

POR QUE NA STACK E NAO NA EVIDENCIA, MEDIDO. Testando contra a evidence (mensagem + origem + stack), como faz a PONTE_INJETADA_RE, aparece 1 falso positivo EXECUTADO: a mensagem NOSSA falha ao carregar UtilityScript.glb, com pilha 100% em public/js/glbchars.js, vira externo. Nome de injetor so e proveniencia quando aparece como FRAME; na mensagem ele e carga do jogo. E o mutante automacao-ampla.

Medido (104 issues crash-auto do repositorio, #104..#574, mensagem/origem/stack lidos do corpo publicado, helper real contra o helper anterior):

payloads que mudam de classe ............ 2 de 104
e quais ................................. exatamente a #573 e a #574
falsos positivos com pilha nossa ........ 0 de 5, executados

Custo declarado, medido: crash que estourar DENTRO de um arnes apontado para producao deixa de abrir issue, e a linha continua na telemetria bruta. Aceito porque quem roda o arnes ve a falha no proprio terminal e porque o jogador nao consegue produzir esse frame -- UtilityScript nao aparece em NENHUM arquivo de public/ ou src/. Nada mais foi silenciado: 102 dos 104 payloads nao se movem.

Regua: api/reguas/error-provenance-check.mjs do corosolto/backend (npm run eval:error-origin, lendo este repo por CLIENT_DIR), clausula EP20 -- PR irmao naquele repositorio, porque a regua desta familia saiu daqui em de21eda. EP20 classifica as 4 redacoes do arnes, executa o origemDoJogo recortado DESTE fonte contra as 5 vizinhas que nao podem se mover, ancora os 2 fingerprints publicados, exige o balde de TETO_EXTERNO e carrega a invariante de honestidade (jogoSemArnes). 5 mutacoes medidas: sem-automacao, automacao-ampla, automacao-insensivel, sem-automacao-cliente e jogo-com-automacao, cada uma acendendo EP20. Matriz completa: 53 de 53 mordidos.

O BURACO QUE ISTO NAO FECHA, e fica registrado: o coletor de /api/jserror nao tem guarda nenhuma contra automacao -- navigator.webdriver nao aparece uma vez no repo. So tools/ops/probes/browser.mjs:85-94 bloqueia escrita, por page.route; as demais reguas Playwright, apontadas com BASE=https://www.csbrasil.online, injetam os proprios crashes na telemetria de producao. O ops-diag.yml (cron '17 * * * *', contra producao) NAO e a origem destas duas: ele bloqueia a escrita, e o horario nao bate (04:01). Merece entrada propria e fica fora deste PR.

Portoes: check:fast 129/135. Os 6 vermelhos (eval:mapid, audio:check, eval:audioalcance, eval:audioproc, eval:audioprivate, eval:lajes-soundscape) sao HERDADOS: medidos na arvore limpa com esta mudanca guardada, dao 0 de 6 passaram. Sao zip ausente nesta maquina, pack de audio ausente, um crash do proprio lajes-soundscape-check.mjs:62 no Node 26 e o MAPID que ja vem vermelho da upstream/main. npm run build completo.

NAO VERIFICADO: nao ha browser nesta maquina, entao a injecao nao foi reproduzida com um Playwright de verdade -- a medicao e da CLASSIFICACAO, nao da injecao. A tabela js_error do Supabase nao foi consultada, entao quantos slots de TETO_SESSAO esta classe vinha comendo por sessao fica sem numero. O script ofensor nao foi identificado. E as duas 404 de /audio/manifest.json nas migalhas sao de outra familia (o manifesto migrou para Blob privado nos PRs #506/#507), nao investigadas aqui.

Closes #573
Closes #574

Agent: Claude Opus 5 (1M context)

Summary

Issue

  • Closes #

Risk

  • low — docs/tooling/text only
  • medium — UI/site/runtime path touched
  • high — gameplay/render/backend/anti-cheat touched

Validation

  • npm run build
  • smoke path exercised when UI/gameplay changed
  • screenshots/video attached when visuals changed

Bot notes

  • ok to label safe-automerge
  • needs needs-staging
  • needs needs-human-gameplay
  • needs needs-human-backend

@vercel

vercel Bot commented Sep 11, 2026

Copy link
Copy Markdown

@nunreasonable is attempting to deploy a commit to the rubenmarcus' projects Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@csbrasil-BOT csbrasil-BOT added needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main labels Sep 11, 2026
@csbrasil-BOT

csbrasil-BOT commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

csbrasil-bot classification

Note

@nunreasonable abriu 4 arquivo(s) · +129 −1, base main.

O que mudou

área arquivos + amostra
📚 docs 1 +118 −0 KNOWN-BUGS.md
⚙️ backend 1 +6 −0 error-provenance.mjs
🌐 site 1 +4 −0 index.astro
🧪 arnês 1 +1 −1 sertao-traversal-check.mjs

Labels

label por quê
needs-staging mudança de runtime/UI — valida integrado no staging antes do merge
target:main vai direto pra main, sem fila de integração

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-iqp7dhkrk-rubenmarcus-projects.vercel.app

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-km5nmehhw-rubenmarcus-projects.vercel.app

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-3s1fe03u0-rubenmarcus-projects.vercel.app

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-eg64c0h5c-rubenmarcus-projects.vercel.app

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-go04ubkj3-rubenmarcus-projects.vercel.app

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-55zig6u46-rubenmarcus-projects.vercel.app

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-gxvr9s8l8-rubenmarcus-projects.vercel.app

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

…jogo (corosolto#573, corosolto#574)

Relato, literal das duas issues abertas pelo crash-fix.yml em alpha.246, classe
codigo, com 8 segundos de diferenca:

    corosolto#574  __game is not defined                          fingerprint b81fb1c4, origem vazia
    corosolto#573  Falha ao abrir partida: __game is not defined  fingerprint 23f0069c, origem promise
    Stack identica nas duas:
      ReferenceError: __game is not defined
          at eval (eval at predicate (eval at evaluate (:311:30)), <anonymous>:1:18)
          at UtilityScript.evaluate (<anonymous>:313:16)

Diagnostico: UtilityScript, `eval at predicate` e `next` sao a assinatura do poller
que o page.waitForFunction() do Playwright injeta DENTRO da pagina. Alguem apontou um
arnes de automacao para producao com um predicado que le `__game` sem o `window.`.
O `window.__game` e escrito num unico sitio, public/js/main.js:1287, dentro do
_startGame(): antes da primeira partida ele e global NAO declarado, entao
`window.__game` devolve undefined mas `__game` pelado lanca.

Dai o caminho e o mesmo da BUG-76: a stack do Playwright nao tem UMA URL http, entao o
origemDoJogo de src/pages/index.astro:346 cai no `return !viuExterna` (:219) e marca
como interna. Com interna === true o :351 manda corosolto#574 comendo um slot de TETO_SESSAO, o
:352 dispara lancamento.fail (etapa `partida`, aberta em main.js:1154) e o :290 manda
corosolto#573 com o prefixo -- que muda o hash FNV. UM evento, DUAS issues, e o painel falso
"A ARENA NAO ABRIU" para quem nao era jogador.

AS DUAS SAO O MESMO EVENTO, E O HASH PROVA. Os dois fingerprints publicados reproduzem
byte a byte a receita de crashFingerprint (src/lib/error-provenance.mjs:117-122), cada
um com o kind/source do seu caminho: ('promise', '__game is not defined', '') = b81fb1c4
e ('error', 'Falha ao abrir partida: __game is not defined', 'promise') = 23f0069c.

OS DOIS PALPITES OBVIOS, REFUTADOS COM MEDICAO.

  1. "conserte o predicado na origem." git grep por waitForFunction com __game
     nao-qualificado em TODOS os refs (upstream/*, fork/*, origin/*) devolve ZERO: os
     ~60 predicados da arvore sao todos window.__game. O unico __game pelado executavel
     era tools/eval/sertao-traversal-check.mjs:68, dentro de um page.evaluate -- forma
     de stack diferente, sem os frames predicate/next. O script ofensor NAO esta sob
     controle de versao. Foi endurecido junto por ser a mesma classe, mas nao era ele.

  2. "corte em __game, ou em __\w+__." window.__game e o handle PUBLICO do jogo
     (SECURITY.md:9, e foi por ele que a corosolto#382 entrou); a BUG-76 proibe o corte generico
     __\w+__ porque sete globais do jogo sao dunder; e a fixture naoInjetadoFixtures da
     propria regua exige que "...evaluating 'window.__game.start'" continue codigo.
     Cortar no nome do global calaria crash nosso.

Correcao: corte pelo NOME do injetor, e so na STACK. Ao contrario da corosolto#568, aqui o nome
E estavel -- UtilityScript e identificador do Playwright, nao e gerado por sessao.
Sensivel a caixa, pelo mesmo motivo da BUG-76.

POR QUE NA STACK E NAO NA EVIDENCIA, MEDIDO. Testando contra a evidence (mensagem +
origem + stack), como faz a PONTE_INJETADA_RE, aparece 1 falso positivo EXECUTADO: a
mensagem NOSSA `falha ao carregar UtilityScript.glb`, com pilha 100% em
public/js/glbchars.js, vira externo. Nome de injetor so e proveniencia quando aparece
como FRAME; na mensagem ele e carga do jogo. E o mutante automacao-ampla.

Medido (104 issues crash-auto do repositorio, corosolto#104..corosolto#574, mensagem/origem/stack lidos
do corpo publicado, helper real contra o helper anterior):

    payloads que mudam de classe ............ 2 de 104
    e quais ................................. exatamente a corosolto#573 e a corosolto#574
    falsos positivos com pilha nossa ........ 0 de 5, executados

Custo declarado, medido: crash que estourar DENTRO de um arnes apontado para producao
deixa de abrir issue, e a linha continua na telemetria bruta. Aceito porque quem roda o
arnes ve a falha no proprio terminal e porque o jogador nao consegue produzir esse
frame -- UtilityScript nao aparece em NENHUM arquivo de public/ ou src/. Nada mais foi
silenciado: 102 dos 104 payloads nao se movem.

Regua: api/reguas/error-provenance-check.mjs do corosolto/backend (npm run
eval:error-origin, lendo este repo por CLIENT_DIR), clausula EP20 -- PR irmao naquele
repositorio, porque a regua desta familia saiu daqui em de21eda. EP20 classifica as 4
redacoes do arnes, executa o origemDoJogo recortado DESTE fonte contra as 5 vizinhas
que nao podem se mover, ancora os 2 fingerprints publicados, exige o balde de
TETO_EXTERNO e carrega a invariante de honestidade (jogoSemArnes). 5 mutacoes medidas:
sem-automacao, automacao-ampla, automacao-insensivel, sem-automacao-cliente e
jogo-com-automacao, cada uma acendendo EP20. Matriz completa: 53 de 53 mordidos.

O BURACO QUE ISTO NAO FECHA, e fica registrado: o coletor de /api/jserror nao tem
guarda nenhuma contra automacao -- navigator.webdriver nao aparece uma vez no repo. So
tools/ops/probes/browser.mjs:85-94 bloqueia escrita, por page.route; as demais reguas
Playwright, apontadas com BASE=https://www.csbrasil.online, injetam os proprios crashes
na telemetria de producao. O ops-diag.yml (cron '17 * * * *', contra producao) NAO e a
origem destas duas: ele bloqueia a escrita, e o horario nao bate (04:01). Merece entrada
propria e fica fora deste PR.

Portoes: check:fast 129/135. Os 6 vermelhos (eval:mapid, audio:check, eval:audioalcance,
eval:audioproc, eval:audioprivate, eval:lajes-soundscape) sao HERDADOS: medidos na
arvore limpa com esta mudanca guardada, dao 0 de 6 passaram. Sao zip ausente nesta
maquina, pack de audio ausente, um crash do proprio lajes-soundscape-check.mjs:62 no
Node 26 e o MAPID que ja vem vermelho da upstream/main. npm run build completo.

NAO VERIFICADO: nao ha browser nesta maquina, entao a injecao nao foi reproduzida com
um Playwright de verdade -- a medicao e da CLASSIFICACAO, nao da injecao. A tabela
js_error do Supabase nao foi consultada, entao quantos slots de TETO_SESSAO esta classe
vinha comendo por sessao fica sem numero. O script ofensor nao foi identificado. E as
duas 404 de /audio/manifest.json nas migalhas sao de outra familia (o manifesto migrou
para Blob privado nos PRs corosolto#506/corosolto#507), nao investigadas aqui.

Closes corosolto#573
Closes corosolto#574

Signed-off-by: nunreasonable <rafaelpasquarella@gmail.com>
Agent: Claude Opus 5 (1M context)
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

@rubenmarcus
rubenmarcus force-pushed the fix/573-arnes-de-automacao-abre-issue branch from b2a9e02 to 91bec0f Compare September 17, 2026 17:03
@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-5t8nms9od-rubenmarcus-projects.vercel.app

@rubenmarcus

Copy link
Copy Markdown
Member

Rebase + gates (lane 04, 17/09): o PR conflitava com os merges de hoje (#569/#606 em error-provenance.mjs/KNOWN-BUGS). Rebasei o commit de autor be2e08339 sobre a main 340e2e42f91bec0fe9 (autoria, DCO e trailer Agent: originais preservados; resolução por intent: REDE_RE (BUG-170) e AUTOMACAO_RE (BUG-151) coexistem, seções BUG-146/BUG-170/BUG-151 todas presentes no KNOWN-BUGS). Push via maintainerCanModify no fork; o bot empilhou base-merge → head final 656d4a863. Gates locais no rebase: check:fast 141/145 = exatamente o baseline da main nesta máquina; ops:test 47/47; eval:error-console verde. CI no head final: todos os workflows verdes (build/pr-gates/smoke/classify/dco/automerge); portao reprovado com a assinatura pré-existente idêntica da main (mesmas 15 linhas ✗ do placar cego — 4ª confirmação, cf. run 34784690095) e Vercel é artefato de fork. A régua EP20 deste PR vive no repo backend conforme documentado. Merge com merge commit.

@rubenmarcus
rubenmarcus merged commit d95f6d7 into corosolto:main Sep 17, 2026
15 of 17 checks passed
rubenmarcus added a commit that referenced this pull request Sep 17, 2026
…valuate (BUG-172)

O B5 injetava console.error direto no page.evaluate — a stack nasce com
frames UtilityScript do Playwright, e o corte AUTOMACAO_RE do #587
(BUG-151) classifica esses frames como externos DE PROPÓSITO. O sinal do
próprio check era filtrado e o painel ?debug=1 nunca o exibia: B5
reprovando em toda árvore desde o merge, inclusive na main (run
35252681261). Callback de setTimeout não carrega os frames (medido) e é
o formato de erro de quem depura de verdade — o contrato do painel.
Mutante --mutante=vaza-detalhe continua reprovando.

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: GLM 5.3 (Oh My Pi)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main

Projects

None yet

Development

Successfully merging this pull request may close these issues.

crash em produção: __game is not defined crash em produção: Falha ao abrir partida: __game is not defined

3 participants