diff --git a/KNOWN-BUGS.md b/KNOWN-BUGS.md index fdeba111..1bebae34 100644 --- a/KNOWN-BUGS.md +++ b/KNOWN-BUGS.md @@ -39,6 +39,116 @@ lista de "balão" do CHR1 tem os mesmos 13 antes e depois). ## P0 — quebram o jogo ou mentem para quem mede +### ~~BUG-75 · ponte injetada pelo navegador abria issue de crash como se fosse bug do jogo~~ · RESOLVIDO 24/08 (issues #428, #379, #380, #381) + +**Sintoma (literal, quatro issues abertas pelo `crash-fix.yml`, todas classe `codigo`):** + +``` +ReferenceError: Can't find variable: __gCrWeb #428, alpha.182, fingerprint d85ae7e1, origem /:1:9 +ReferenceError: Can't find variable: __firefox__ #379, alpha.159, fingerprint 470752a2, origem /:1:12 +TypeError: undefined is not an object (evaluating 'window.__firefox__.reader') #380, alpha.159, fingerprint 7122f83c, origem /:1:19 +ReferenceError: Can't find variable: DarkReader #381, alpha.159, fingerprint cd468274, origem /:1:11 +Stack (as quatro): global code@https://www.csbrasil.online/:1:N +``` + +`__gCrWeb` é a ponte JS do **Chrome para iOS**, `__firefox__` a do **Firefox para iOS**, +`DarkReader` a da extensão homônima. Nenhuma é código do jogo, e nenhuma tem conserto aqui. +As três primeiras foram fechadas **à mão** como "ruído externo" — mas nada no código as +impedia de voltar, e a #428 é a volta. + +**Não é defeito do jogo, e a prova é tripla.** (1) `__gCrWeb`, `__firefox__` e `DarkReader` +**não existem em nenhum arquivo do repositório**, e `git log --all -S` não devolve um único +commit para nenhum deles. (2) Os quatro fingerprints publicados reproduzem EXATAMENTE +`crashFingerprint('error', , 'https://www.csbrasil.online/:1:N')`, ou seja o +`e.filename` é a **própria página**. (3) O único frame é `global code@` — nenhum arquivo do +jogo aparece na pilha. + +**Causa raiz — confirmada.** O `isExternalCrash` (`src/lib/error-provenance.mjs`) inocenta +por **origem**, e o WebKit reporta script injetado no mundo da página com o filename **da +página**. O atalho + +```js +if (sourceOrigin === ownOrigin) return false; +``` + +decidia "é nosso" antes de qualquer outra prova. Daí nenhuma das regex seguintes (`OPAQUE_RE`, +`AMBIENTE_RE`, `CACHE_SPLIT_RE`, `RECOVERABLE_RE`, `MEDIA_ABORT_RE`) mordia e o +`classifyCrash` caía no `return 'codigo'` final — que escala e abre issue. É o MESMO atalho +que a #403/#404 (carteira cripto) atravessa. + +**Por que o corte é por NOME e não pela FORMA — e isto é o parágrafo que decide a entrada.** +A tentação óbvia é cortar pela forma: "pilha de frame único `global code@/:1:N` +não é nossa". Ela reprova, e por medição. A linha 1 do `dist/client/index.html` tem **268 +caracteres**, e o `compressHTML` do Astro cola o ``, o ``, o comentário e o +**nosso primeiro `