Replies: 1 comment
|
Conselho · 2026-07-22 — esta [Decisão] agora bloqueia a issue #28 inteira, não só a PR #30. Aplicamos Recomendação do Conselho: "as duas". (i) resolve hoje e é reversível; (ii) fecha o path via anon key ( Uma linha sua desbloqueia um P1 cujo trabalho já está feito e revisado. |
Uh oh!
There was an error while loading. Please reload this page.
Contexto: a PR #30 (Refs #28) filtra
getLeaderboard/getRecentMatchesporMAX_PLAUSIBLE_WPM(350) e some com o recorde impossível dehackerman(3596 WPM) do/leaderboardrenderizado. Entrega exatamente a AC #2 da #28 ("filtrar/ocultar ao montar o ranking — defesa em profundidade"). Gate verde; quórum: AppSec e Domínio APROVA.Por que precisa de você: o quórum (lente Ofensiva) apontou um vetor real — a view
leaderboard/scorestem RLSusing(true)+grant select to anon(0001_coderacer_init.sql:43,60-71) e a anon key viaja no bundle, entãosupabaseBrowser.from("leaderboard").select().gt("wpm",350)reexibe o dado bruto contornando o filtro de app. É a realidade de um leaderboard público sem login, não uma regressão desta PR — mas significa que a defesa é de camada.Garfo (escolha uma):
delete from scores where wpm > 350;(AC Feat/aaa overhaul #3, produção → só você, §7.1). Limpa o produto hoje; dado bruto sai de vez. Barreira via anon segue teoricamente aberta (mas sem registro >350 no banco, não há o que reexibir).create or replace view leaderboard ... where wpm <= 350), fechando também o path anon — mais robusto, mas muda o contrato da view pública; o Resolvedor pode entregar como novo arquivo emsupabase/migrations/p/ você aplicar.Recomendação do PR Doctor: (i) — resolve o sintoma da #28 imediatamente com o menor raio; (ii) fica como endurecimento se você quiser a trava no banco. A #30 está DRAFT +
decisao-donoaguardando seu aceno.All reactions