You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Curador · 2026-07-07 (ter · chapéu Segurança)
Triagem: Discussions sem atividade nova (só o manifesto #5); nenhum Q&A/Idea pendente. Backlog limpo, sem dupes/em-resolucao órfão. Auditei a superfície de segurança das salas — RLS está sólido (deny-by-default, só select ao anon; escritas via service_role). Furos reais estão na autorização/validação da API (único guardião com service_role).
Abertas (2/2): #6claim-leader sem auth → sequestro de líder; #7finish com results não validados → leaderboard forjável. Ambas P1/area:security, área de quórum §7.2.
Quadro #30: #6 e #7 em Todo. Top da fila para o Resolvedor: #6 e #7.
PR Doctor · 2026-07-07 18h — Nenhuma PR aberta acionável (gh pr list vazio). Limpeza: sem worktrees CodeRacer-wt/* e sem branches locais auto/* mergeadas pendentes. Silêncio = saúde. Sem [Decisão] aberto nesta rodada.
Método: joguei de verdade no navegador em produção — criei sala Fácil/JS, corri sozinho até o fim (1º · 7 WPM · 99% · 1 erro · 2m3s).
Feedback:O Iniciante · 2026-07-07 — top fricções: (1) sem "modo treino" claro, entrada só por "Criar sala" (§V.5); (2) erro de digitação não fica vermelho onde o olho está, só ERROS/PRECISÃO numéricos (Parte IV); (3) dificuldade vem em Médio por padrão.
Encantamento: syntax highlight no editor enquanto digita, sem auto-close de parênteses.
Resolvedor · 2026-07-08 — Issue #10 (P1, UX/feel: erro invisível no card do editor).
PR: #18. Shake transform-only + flash de borda + ícone na margem, via errorPulse em Race.handleInput; reduced-motion cai só no flash+ícone. Diff mínimo (3 arquivos, +81/-3), sem tocar métrica/persistência.
Gate: install+typecheck+build ✓ · validate-metrics 24/0 · validate-persistence 22/0 · lint N/A. #6 e #7 já reivindicadas (PRs #12/#8); sem Parecer do Conselho em #10 — segui os critérios da própria issue.
Gate: verde — typecheck · 186 testes · build · validate-persistence 72/72 · validate-metrics 45/45. Prova extra: build com env da Vercel simulada gera robots/sitemap/canonical/og na origem certa.
Parecer do Conselho: não havia nesta issue; segui a "Dica de abordagem" do corpo.
Pendente/decisão: os 2 AC de pós-deploy (4 curl na produção) só fecham após o merge — comando no PR. Risco único registrado lá: se as System Env Vars da Vercel estiverem desligadas, a cadeia cai no fallback de dev.
[Proposta] W30 retirada: teto de merges 2→4 não se justifica — o PR Doctor mergeou 1/0/1/1/0 em W31, nunca bateu no teto. O gargalo virou decisão do dono + veto de quórum.
Gate: verde — typecheck, build, pnpm test 181/181 (8 novos), validate-persistence 72/72, validate-metrics 45/45. Lint N/A (sem config ESLint).
Parecer: usei o do Conselho de 31/07 na íntegra (extração + variante (a) justificada pelo on delete cascade de 0001:24); reverifiquei as 3 premissas contra origin/main antes de implementar.
Pendente/decisão: nada — aguarda quórum do PR Doctor.
3 pareceres, 3× APROVADA (§7.3, sem quórum):#121 · #111 · #114. Premissas das três reconferidas em origin/main@d8ee488; nenhuma caiu. Sem mudanças de metadado, nada em Discussions, resíduos declarados nos 3.
Reparado na própria PR (6288352): MAX_INT4 como teto de errors, place fora de [1,30] vira null, +2 testes e +6 casos no validador. Gate: typecheck OK · 183 testes · build OK · persistência 78/78 · métricas 45/45.
Abri 2/2 (§VII.4, "Respeito ao usuário" — o bloco binário que está 0/3):#128P2 — o Modal (único diálogo do produto, o // configurar sala) não tem role/aria-modal, o foco nunca entra e o Tab percorre a home inteira atrás do backdrop; ironia registrada: ele hospeda o BannerCarousel, que é 100% teclado (BannerCarousel.tsx:499-513). #129P2 — o ToastProvider monta a pilha sem aria-live/role (Toast.tsx:22): os 15 push do produto (12 error) são mudos, incluindo "Sala não encontrada"/"Sem conexão" (HomeView.tsx:158-168) — o jogador aperta Enter no código e, para ele, nada acontece. Ambas §7.3, verificadas em origin/main@31c1c2d, sem duplicata (search por modal/foco/dialog/a11y vazio).
Higiene: backlog limpo — 20 issues abertas, todas com 1 prioridade + ≥1 área, nenhuma duplicata. Sem poda (é quarta; nenhuma P3 passa de 30d de qualquer forma).
Gate: typecheck ✅ · build ✅ · pnpm test ✅ 193 passaram (+10) · validate-metrics ✅ 45 · validate-persistence ✅ 78. First Load JS de /practice 151 kB → 151 kB (pool não vazou ao bundle; provado por grep no .next/).
Pendente/decisão: nada — o clique real de "treinar de novo" não foi verificado ao vivo (preview roda no clone da main, não no worktree); declarado no PR.
Quórum: 0×APROVA / 3×VETA (vetores reproduzidos por mim): progress: 1e-9 vaza o piso e chega a scores; skew do relógio do CLIENTE (até 4 s) descarta honesto de 100 WPM em snippet de 40 chars — e como toda linha honesta tem progress: 1, a partida inteira some do ranking. Não mergeei (também não mergearia: quem autora anti-cheat não mergeia no mesmo dia).
🗂️ Curador · 2026-08-05 14h (rodada EXTRA — cota de issues 0/2)
Não abri issue nenhuma, e isso é o certo: já rodei hoje às 11h e abri 2/2 (#128, #129). O teto é por DIA, não por rodada — o chapéu de quarta (UI/UX AAA) já foi cumprido de manhã.
Gate: typecheck ✅ · vitest 199 passed ✅ · build ✅ · validate-persistence 78/78 ✅ · validate-metrics 45/45 ✅ · lint N/A. CI da PR verde (install/typecheck/build + Vercel). Mutação da guarda deixa o suite vermelho — o teste novo não é decorativo.
Pendente/decisão: duplo clique em "Iniciar partida" agora dá toast de 409 em vez de reiniciar o countdown — desabilitar o botão em voo é UI, fora do escopo desta issue.
Fica registrado (follow-up): o ponto de imposição das guardas (route.ts:47-48, :251, :265) não tem teste — as 3 lentes notaram que trocá-lo por no-op desfaz as duas guardas com 204/204 verde e tsc limpo. Também: settings mantém o mesmo TOCTOU, e nem Lobby nem Results têm lock de in-flight (duplo clique agora rende toast espúrio).
Triagem: Q&A vazio. Nenhuma Idea nova desde a [Feedback] O Competitivo · 2026-08-01 #120 (loop fechado em 02/08) — a Persona só roda sábado. Nada a converter, nada a responder. Zero posts em Discussions.
Higiene: backlog limpo — 21 abertas + a 📓 Diário de Bordo da Frota #4, todas com 1 prioridade + ≥1 área, sem duplicata, nenhum em-resolucao órfão (zero issues com o label; consistente com nenhuma PR non-draft em voo). Sem poda (é quinta).
Activity
caioross commentedon Jul 7, 2026
⚖️ Conselho · rodada ter 07/07 12h — nenhuma issue elegível para parecer.
Backlog aberto = só a #4 (o próprio Diário). Sem candidatas para o Resolvedor das 14h; nada a examinar. Silêncio = saúde. Volto ter/sex.
caioross commentedon Jul 7, 2026
Curador · 2026-07-07 (ter · chapéu Segurança)
Triagem: Discussions sem atividade nova (só o manifesto #5); nenhum Q&A/Idea pendente. Backlog limpo, sem dupes/
em-resolucaoórfão. Auditei a superfície de segurança das salas — RLS está sólido (deny-by-default, sóselectao anon; escritas via service_role). Furos reais estão na autorização/validação da API (único guardião com service_role).Abertas (2/2): #6
claim-leadersem auth → sequestro de líder; #7finishcom results não validados → leaderboard forjável. Ambas P1/area:security, área de quórum §7.2.Quadro #30: #6 e #7 em Todo. Top da fila para o Resolvedor: #6 e #7.
caioross commentedon Jul 7, 2026
PR Doctor · 2026-07-07 18h — Nenhuma PR aberta acionável (
gh pr listvazio). Limpeza: sem worktreesCodeRacer-wt/*e sem branches locaisauto/*mergeadas pendentes. Silêncio = saúde. Sem [Decisão] aberto nesta rodada.caioross commentedon Jul 7, 2026
🏁 Resolvedor · 2026-07-07 22h
sanitizeResults()puro na fronteira dofinish: descarta WPM fora de 0..350 e nick vazio, clampa accuracy/errors/place, trunca nick em 20, limita array amax_players..eslintrcno repo, pré-existente).caioross commentedon Jul 7, 2026
🎭 Persona da semana (ISO 28 · %5=3): O Iniciante.
caioross commentedon Jul 8, 2026
Curador · 2026-07-08 (qua · chapéu UI/UX AAA)⚠️
🔁 Triagem: [Feedback] #9 (persona O Iniciante) → ICE aplicado, loop fechado na thread. 2 frações viraram issue; resto registrado com o porquê (Practice/Solo §V.5 = epic futuro; Fácil-default = persona-específico; "melhor WPM" depende de histórico).
🆕 Abertas (teto 2/2): #10 feedback de erro no card do editor §779 (P1·ui,engine) · #11 pódio solo sem quadrados vazios §III.7 (P2·ui).
🧹 Higiene: sem dupes; toda issue com 1 prioridade + área.
📋 Quadro #30 fiel: #6 In Progress (
em-resolucaosurgiu na rodada sem branch/PR — se persistir órfão na próxima, limpar), #7 In Review (PR #8), #10/#11 Todo.🎯 Top-3 elegível p/ Resolvedor 14h: #10 (P1) → #11 (P2). #6/#7 já em andamento.
caioross commentedon Jul 8, 2026
🏁 Resolvedor · 2026-07-08 14h
updated_at/rooms_touch, 15s) + update condicional; retry silencioso na eleição do cliente. Sem migration. Gate verde (typecheck/build/validate-persistence 22/22).caioross commentedon Jul 8, 2026
📓 Persona da semana (2026-07-08) · O Iniciante (ISO wk28 → %5=3)
pnpm dev+ browser: criei sala, corri um snippet JS inteiro até o fim, vi resultado e ranking global.caioross commentedon Jul 8, 2026
🏁 Meta/Engenheiro da Frota · 2026-W28 (retro inaugural)
lint— promptscoderacer-resolvedor/coderacer-pr-doctoreditados direto + PR docs(fleet): gate honesto sobre lint (§6 + cr-fleet-ops §4) #13 (HANDBOOK §6 + cr-fleet-ops §4). Núcleo = typecheck+build; lint = N/A até haver.eslintrc. §8 intacta..eslintrcmínimo p/ lint real. Detalhes no [Retro] Semana 2026-W28 #15.caioross commentedon Jul 8, 2026
Curador · 2026-07-08 (qua · chapéu UI/UX AAA)
em-resolucaoórfão.caioross commentedon Jul 8, 2026
Curador · 2026-07-08 (qua · chapéu UI/UX AAA) — rodada calma
em-resolucaoórfão (aviso do Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6 se resolveu: PR fix(security): exige sala estagnada para claim-leader (anti-sequestro) #12 existe).caioross commentedon Jul 8, 2026
Resolvedor · 2026-07-08 — Issue #10 (P1, UX/feel: erro invisível no card do editor).
PR: #18. Shake
transform-only + flash de borda + ícone na margem, viaerrorPulseemRace.handleInput; reduced-motion cai só no flash+ícone. Diff mínimo (3 arquivos, +81/-3), sem tocar métrica/persistência.Gate: install+typecheck+build ✓ · validate-metrics 24/0 · validate-persistence 22/0 · lint N/A.
#6 e #7 já reivindicadas (PRs #12/#8); sem Parecer do Conselho em #10 — segui os critérios da própria issue.
90 remaining items
caioross commentedon Aug 1, 2026
🏁 PR Doctor · 2026-08-01 18h
progress(room.ts:401— o ataque da Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34 segue vivo) · o piso vira gate de acurácia e apaga honesto (useRoom.ts:570) · 409 latchante prende sala emracing(useRoom.ts:509/:106) — seria regressão em produção.decisao-dono. Nenhuma PRCONFLICTING, nenhuma PR pronta >48h — parking-lot vazio.auto/issue-97-banner-carousel(PR feat(ui): gôndola infinita de estandartes medievais na escolha de linguagem (#97, #99) #98 já mergeada) — deleção negada pelo classificador, fica para sessão supervisionada. Diretório órfãoCodeRacer-wt/pr119(desregistrado, sem commits a perder).caioross commentedon Aug 2, 2026
🗂️ Curador · 2026-08-02 11h (dom — poda + [Plano])
snippet/route.ts:26chamapickSnippetcom 2 args ePracticeView.tsx:43nem tem canal para o título anterior. Verifiquei os 3 elos emorigin/main; incluí a correção de rota que o post não previu (excluir por título só no mesmo bucket — "Inverter string" existe em vários pools). §7.3, sem quórum.main: A11y/Leaderboard: <th> sem scope e WPM sem tabular-nums na tabela do ranking (leaderboard/page.tsx:100-104) #93 segue válida (<th>semscope, zerotabular-nums); Qualidade: consolidar o clamp de maxPlayers num único helper testado (clampInt) — fim do Math.min(Math.max(...)) triplicado #51 também, mas encolheu —clampIntjá existe testado (room.ts:285) e restam só 2 call sites demaxPlayers(rooms/route.ts:64,[code]/route.ts:139), não 3.Todo; 11 itens arquivados (Done com >7d reais, corte por timestamp: os de 26/07 à tarde ainda não completaram 7d e ficam para amanhã). Semem-resolucaoórfão; toda issue aberta com 1 prioridade + ≥1 área.caioross commentedon Aug 2, 2026
🏁 Resolvedor · 2026-08-02 14h
SITE.urldeixa de cair no literalcoderacer.app(503) e passa a derivar a origem do próprio deploy; +13 testes emsite.test.ts;.env.example/README corrigidos.curlna produção) só fecham após o merge — comando no PR. Risco único registrado lá: se as System Env Vars da Vercel estiverem desligadas, a cadeia cai no fallback de dev.caioross commentedon Aug 2, 2026
🛠️ Meta/Engenheiro da Frota · 2026-W31 (dom 08-02)
--edit-lastproibido: o token é o mesmo para toda a frota). (2)conselhoganha o passo C-bis "Vetores de veto previstos" — veredito APROVADA em §7.2 roda o próprio plano contra AppSec/Ofensiva e Domínio antes de publicar (2 pareceres viraram PR vetada esta semana: feat(leaderboard): filtros por linguagem, dificuldade e período no Ranking Global #106 2×VETA, fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119 3×VETA). (3) PR #124 — HANDBOOK §5 + cr-fleet-ops §2: branch órfã só bloqueia claim com PR aberta vinculada (a Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34 ficou 3 rodadas congelada); §8 intacto.0005_room_kicked_ids.sqlpor aplicar. ~20 dirs órfãos emCodeRacer-wt/(~500 MB) esperandorm -rfmanual.caioross commentedon Aug 2, 2026
🏁 PR Doctor · 2026-08-02 18h
auto/issue-34-finish-timingviva, PR fix(anti-cheat): rejeita finish temporalmente impossível e 409 honesto (#34) #36 CLOSED sem merge, Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34 (P1) congelada 3 rodadas.afc4f103×VETA (normalizeOrigindevolvia a string crua →</script>/CRLF/userinfo chegavam ao robots/sitemap/JSON-LD). Reparei ema80cdef(saneamento + remoção do degrauVERCEL_URL, medido 302+SSO+noindex). Re-quórum 1×APROVA / 2×VETA: minha guarda ancorou emVERCEL, que a doc define como "as system env vars foram expostas" — ela é código morto justo quando elas faltam, e othrowem escopo de módulo roda em runtime (500 em/room/<code>).decisao-dono. O que falta não é código: é saber se o checkbox de System Env Vars do projeto está ligado —get_projectdá 403 e o preview está atrás de SSO. [Decisão] [Decisão] #117 / PR #123: a origem pública do site depende de um checkbox da Vercel que nenhum agente enxerga #126 com 3 opções (a recomendada resolve a Crescimento/SEO: produção anuncia canonical, sitemap e og:image em coderacer.app (503) — todo link compartilhado sai sem preview (site.ts:8) #117 sem código). Ganho não disputado: a AppSec provou que amainde hoje injeta valor cru dentro do<script ld+json>.decisao-dono).meta-claimremovido + branch local mergeada apagada; 3 branches locais de PRs CLOSED-sem-merge preservadas (§7 só manda apagar mergeadas).caioross commentedon Aug 3, 2026
🏁 Resolvedor · 2026-08-03 14h
errordos inserts) → PR fix(leaderboard): persistMatch lê os erros de insert e não deixa matches órfã (#112) #127, non-draft, §7.2 (Solicito quórum). ExtraípersistMatchparasrc/lib/persistMatch.ts, erros lidos e logados, e delete compensatório damatchesquandoscoresfalha.pnpm test181/181 (8 novos), validate-persistence 72/72, validate-metrics 45/45. Lint N/A (sem config ESLint).on delete cascadede0001:24); reverifiquei as 3 premissas contraorigin/mainantes de implementar.caioross commentedon Aug 5, 2026
🏛️ Conselho · 2026-08-05 12h
decisao-dono, Confiabilidade/Leaderboard: persistMatch descarta os erros de insert — corrida terminada some do ranking em silêncio e deixa matches órfã (rooms/[code]/route.ts:271-282) #112 virou PR fix(leaderboard): persistMatch lê os erros de insert e não deixa matches órfã (#112) #127 em quórum). Completei a fila com a dupla de área sagrada — nenhuma P1 está elegível hoje (Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34/Crescimento/SEO: produção anuncia canonical, sitemap e og:image em coderacer.app (503) — todo link compartilhado sai sem preview (site.ts:8) #117 com PR aberta, Segurança/RLS: "sala privada" é enumerável — policy using(true) em rooms expõe toda sala ao anon (0002_realtime_rooms.sql:26-29) #103 éepic, Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6/Anti-cheat/Leaderboard: recorde impossível (3596 WPM) no Ranking Global — sem teto de plausibilidade #28 emdecisao-dono).origin/main@d8ee488; nenhuma caiu. Sem mudanças de metadado, nada em Discussions, resíduos declarados nos 3.exclusionForemsnippets.tslevaria 96 KB de pool ao bundle de/practice(hoje só 2 imports, ambos server) → arquivo novo; e trocar ouseRefdo prev poruseStatevira loop infinito deGET /api/snippet(loadSnippeté dep do efeito,PracticeView.tsx:35-65).countdownNderiva denow(useRoom.ts:466-469). E o PR não pode dizer "a textarea re-renderiza 10×/s":TypingCoreémemocom props estáveis (:563-602); quem reconcilia é RoomView/Race/RaceTrack.widthnum spring ao lado da textarea — mesmo defeito da #59 no ponto mais sensível (TypingCore.tsx:251-256) #114: semw-fulloscaleXescala largura zero (barra invisível); e usarprogresscru no lugar deMath.round(progress*100)re-alveja o spring por tecla — o fix pioraria a área sagrada. Cantosrounded-fulldeformam: declarar o desvio, não escrever "geometria idêntica".caioross commentedon Aug 5, 2026
🏁 PR Doctor · 2026-08-05 18h
31c1c2d, fecha Confiabilidade/Leaderboard: persistMatch descarta os erros de insert — corrida terminada some do ranking em silêncio e deixa matches órfã (rooms/[code]/route.ts:271-282) #112) — quórum §7.2 em 2 rodadas: AppSec ✅ · Domínio ✅ · Ofensiva ❌→✅ após reparo. Parecer completo.scores.errors/scores.placesãoint(int4), massanitizeResultsclampavaerrorsemMAX_SAFE_INTEGERe não limitavaplace→ umfinishforjado estourava só o insert descorese, com o rollback novo de Confiabilidade/Leaderboard: persistMatch descarta os erros de insert — corrida terminada some do ranking em silêncio e deixa matches órfã (rooms/[code]/route.ts:271-282) #112, apagava a partida inteira (supressão silenciosa do recorde alheio).6288352):MAX_INT4como teto deerrors,placefora de [1,30] viranull, +2 testes e +6 casos no validador. Gate: typecheck OK · 183 testes · build OK · persistência 78/78 · métricas 45/45.i112resistiu (node_modules) e virou órfão — deixo para sessão supervisionada.decisao-dono(do dono); fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119 segue DRAFT com o quórum 0×/3× de 01/08 registrado nela. Nenhum [Decisão] novo.caioross commentedon Aug 5, 2026
🗂️ Curador · 2026-08-05 11h (qua — UI/UX AAA)
Modal(único diálogo do produto, o// configurar sala) não temrole/aria-modal, o foco nunca entra e oTabpercorre a home inteira atrás do backdrop; ironia registrada: ele hospeda oBannerCarousel, que é 100% teclado (BannerCarousel.tsx:499-513). #129 P2 — oToastProvidermonta a pilha semaria-live/role(Toast.tsx:22): os 15pushdo produto (12error) são mudos, incluindo "Sala não encontrada"/"Sem conexão" (HomeView.tsx:158-168) — o jogador aperta Enter no código e, para ele, nada acontece. Ambas §7.3, verificadas emorigin/main@31c1c2d, sem duplicata (searchpor modal/foco/dialog/a11y vazio).Todo; 11 Done arquivados (os de 26/07 completaram 7d ontem à tarde + feat(ui): Substituir seleção de linguagens por Carousel Infinito com Bandeiras Medievais Animadas #97 de 28/07); os 5 Done restantes têm <7d. Status conferido item a item: Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6/Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34/Leaderboard/Integridade: ranking sem filtros premia o bucket mais fácil — filtros por linguagem/dificuldade/período (§III.8) #92/Crescimento/SEO: produção anuncia canonical, sitemap e og:image em coderacer.app (503) — todo link compartilhado sai sem preview (site.ts:8) #117 emIn Review.Closes #121) entre a minha leitura (05:26Z) e a conferência do quadro (05:40Z). Card movidoIn Progress→In Review. Deixei oem-resolucaona issue: pela §5 quem remove é o Resolvedor ao abrir o PR, e a rodada dele parece viva — não é label órfã (tem branch remota e PR aberta).widthnum spring ao lado da textarea — mesmo defeito da #59 no ponto mais sensível (TypingCore.tsx:251-256) #114 (ambas com parecer fresco do Conselho de hoje, §7.3, área sagrada) → A11y/Teclado: o modal "configurar sala" não é um diálogo — sem role/aria-modal, o foco nunca entra e o Tab passeia pela home atrás (Modal.tsx:27-64) (§VII.4) #128. Nenhuma P1 elegível: Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34/Crescimento/SEO: produção anuncia canonical, sitemap e og:image em coderacer.app (503) — todo link compartilhado sai sem preview (site.ts:8) #117 têm PR aberta, Segurança/RLS: "sala privada" é enumerável — policy using(true) em rooms expõe toda sala ao anon (0002_realtime_rooms.sql:26-29) #103 éepic, Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6/Anti-cheat/Leaderboard: recorde impossível (3596 WPM) no Ranking Global — sem teto de plausibilidade #28 sãodecisao-dono.decisao-dono, fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119 vetada 3×) e 3 [Decisão] abertas ([Decisão] #117 / PR #123: a origem pública do site depende de um checkbox da Vercel que nenhum agente enxerga #126, [Decisão] PR #106: filtros do ranking movem o dedupe para o TS — amplificam a #34 de 1 vaga para o ranking inteiro #107, [Decisão] Leaderboard cap (#28/#30): defesa-em-profundidade + deletar linha bruta vs. teto na view #46) — a fila de agentes está saudável, o gargalo segue humano.caioross commentedon Aug 5, 2026
🏁 Resolvedor · 2026-08-05 14h
practiceExclusion.tsnovo, fora dosnippets.tsde 96 KB;useRefno lugar deuseStatepara não latchar loop de fetch).pnpm test✅ 193 passaram (+10) · validate-metrics ✅ 45 · validate-persistence ✅ 78. First Load JS de/practice151 kB → 151 kB (pool não vazou ao bundle; provado por grep no.next/).caioross commentedon Aug 5, 2026
🏁 PR Doctor · 2026-08-05 18h
origin/main. Card do Quadro → Done.finishedconta como trabalho,finishedAtignorado, 409 removido). Gate e CI verdes no head2247d44.progress: 1e-9vaza o piso e chega ascores; skew do relógio do CLIENTE (até 4 s) descarta honesto de 100 WPM em snippet de 40 chars — e como toda linha honesta temprogress: 1, a partida inteira some do ranking. Não mergeei (também não mergearia: quem autora anti-cheat não mergeia no mesmo dia).decisao-dono+ parecer. Aberto o [Decisão] #132 com 3 opções (elegibilidade / identidade-roster / aceitar resíduo) e recomendação da frota.startnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 — actionstartnão exigestatus = lobby: um POST reinicia corrida em andamento (bug pré-existente na main, achado pelas lentes).decisao-dono(dono). Limpeza: worktree i121 desregistrado, branch localauto/issue-121-practice-excludedeletada.caioross commentedon Aug 5, 2026
🗂️ Curador · 2026-08-05 14h (rodada EXTRA — cota de issues 0/2)
startnão exigestatus = lobby) durante o quórum da fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119. Conferi a elegibilidade §5 item a item: semem-resolucao, sem branchauto/issue-131-*remota, e a única PR que a menciona é a fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119 — que a cita como vetor, não a resolve. Novo Top-3 (14h de amanhã): Segurança/Multiplayer: actionstartnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 → #111 → #114.startnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 é §7.2 (src/app/api/rooms/**) → PR non-draft com a linhaSolicito quórum (HANDBOOK §7), e ela não tem parecer (o Conselho só volta sexta). Em compensação o corpo já traz AC verificáveis e o padrão a copiar: update condicional.eq("status","lobby"), exatamente como ofinishjá faz comracing.em-resolucaoórfão. Quadro conferido item a item contra issues/labels/PRs: fiel — a Segurança/Multiplayer: actionstartnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 já entrou emTodoe a Conteúdo/Treino Livre: "treinar de novo" repete o snippet recém-digitado — o fix da #115 não alcançou /api/snippet (snippet/route.ts:26) #121 já estáDone. Arquivei o card da feat(lobby): Refinar UX do Carousel de Linguagens, restaurar votação e sincronização entre telas #99 (completava 7d às 14:09Z; arquivei 6 min antes em vez de deixar para amanhã). Restam 5Done, todos com <7d.auto/*órfãs sem PR aberta (issue-28,issue-34-finish-timing,issue-39,issue-97). Nenhuma trava issue elegível hoje, mas a de Anti-cheat/Leaderboard: recorde impossível (3596 WPM) no Ranking Global — sem teto de plausibilidade #28 vai travá-la em silêncio (§5) no dia em que o dono destravar odecisao-dono— não deleto branch de outro agente (§8), fica para sessão supervisionada. @caioross: o gargalo segue humano — 4 PRs paradas (fix(seo): resolve a origem pública a partir do deploy em vez de um domínio hardcoded (#117) #123/feat(leaderboard): filtros por linguagem, dificuldade e período no Ranking Global #106/fix(security): exige sala estagnada para claim-leader (anti-sequestro) #12decisao-dono, fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119 vetada 3×) e 4 [Decisão] abertas ([Decisão] Anti-cheat do leaderboard (#34): duas PRs, dois quóruns, um limite estrutural — escolher A, B ou C #132, [Decisão] #117 / PR #123: a origem pública do site depende de um checkbox da Vercel que nenhum agente enxerga #126, [Decisão] PR #106: filtros do ranking movem o dedupe para o TS — amplificam a #34 de 1 vaga para o ranking inteiro #107, [Decisão] Leaderboard cap (#28/#30): defesa-em-profundidade + deletar linha bruta vs. teto na view #46).caioross commentedon Aug 5, 2026
🏁 Resolvedor · 2026-08-05 14h
startnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 (P1, segurança) —startvirou transição condicionallobby→racing(.match({status:"lobby"})na própria escrita, padrão dofinish); 409 honesto sem tocarsnippet/start_at/results. PR fix(security):startsó transiciona a partir delobby— POST não reinicia corrida em andamento (#131) #133 (non-draft, quórum §7.2).caioross commentedon Aug 5, 2026
🏁 PR Doctor · 2026-08-05 18h
startsó transiciona a partir delobby— POST não reinicia corrida em andamento (#131) #133 →eee4b62na main (fecha Segurança/Multiplayer: actionstartnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131, deploy na Vercel). Quórum §7.2: rodada 1 deu 2 VETA / 1 APROVA com vetor real — oresetescreviastatus:"lobby"sem guarda, entãoreset→startreconstituía o abuso e oresetsozinho já matava a corrida e a apagava do leaderboard sem sanitizar.ded9ab7):resetToLobbySpec()(finished → lobbycondicional), mesma guarda na limpeza dekicked_ids, +5 testes → rodada 2 3× APROVA. Gate real: typecheck ✅ · vitest 204/204 ✅ · build ✅ · persistência 45/45 e 78/78 ✅ · métricas 45/45 ✅. Card Segurança/Multiplayer: actionstartnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 → Done no Quadro.route.ts:47-48,:251,:265) não tem teste — as 3 lentes notaram que trocá-lo por no-op desfaz as duas guardas com 204/204 verde etsclimpo. Também:settingsmantém o mesmo TOCTOU, e nemLobbynemResultstêm lock de in-flight (duplo clique agora rende toast espúrio).finishsemisLeader(Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34) eclaim-leadersem authz (Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6/PR fix(security): exige sala estagnada para claim-leader (anti-sequestro) #12) seguem abertos — enquanto o dono não decidir ([Decisão] [Decisão] Anti-cheat do leaderboard (#34): duas PRs, dois quóruns, um limite estrutural — escolher A, B ou C #132 e [Decisão] claim-leader: mitigação por estagnação (#12) vs. presença server-side (#6) #19), toda guardaleader-onlyé mitigação, não autoridade. fix(seo): resolve a origem pública a partir do deploy em vez de um domínio hardcoded (#117) #123/fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119/feat(leaderboard): filtros por linguagem, dificuldade e período no Ranking Global #106/fix(security): exige sala estagnada para claim-leader (anti-sequestro) #12 seguem DRAFTdecisao-dono, não tocadas; cada uma já tem seu [Decisão]. Sobrou o diretório órfãoCodeRacer-wt/i131(oworktree removefalha pornode_modules, mas já desregistrou) — não apago em rodada autônoma.caioross commentedon Aug 6, 2026
🗂️ Curador · 2026-08-06 11h (qui — Multiplayer & Performance)
action → colunas → guardainteira da rota de salas e a doutrina da Segurança/Multiplayer: actionstartnão exigestatus = lobby— um POST reinicia corrida em andamento (route.ts:147-164) #131 cobre 2 das 5 actions:settingsescrevelanguage/difficultysem guarda na escrita (route.ts:142-146), com só a leitura de:123defendendo. Não é vetor decurl: o próprio produto disparasettings→startem sequência (votação [Feature] Sistema de votação de linguagens na sala de espera #72,useRoom.ts:659-672) e não há lock de in-flight nos botões — e comobuildMatchRow/buildScoreRows(room.ts:398-428) leem a linguagem nofinish, uma partida de Python/easy entra emscorescomo Rust/hard, no bucket que a Leaderboard/Integridade: ranking sem filtros premia o bucket mais fácil — filtros por linguagem/dificuldade/período (§III.8) #92 vai virar filtro. Junto vai okick, único UPDATE que não passa porapplyRoomUpdate(:226-235): zero linhas →ok:truee ninguém expulso. Incorporei como AC o teste do ponto de imposição que as 3 lentes da PR fix(security):startsó transiciona a partir delobby— POST não reinicia corrida em andamento (#131) #133 apontaram e ficou solto no Diário de ontem.coderacer:room:<CODE>é público e 4 dos 5 handlers não têm teto no receptor: só oroomganhou oRESYNC_MIN_INTERVAL_MSdo Segurança/RLS fatia 1 (#103): broadcast autoritativo de sala em paralelo ao postgres_changes — sem revoke, prepara o corte da leitura anônima #109;progress/chat/ready/votenão têm nenhum. OPROGRESS_THROTTLE_MSé do emissor — cliente hostil não roda esseif. Cadaprogressrecria o roster (:422-448) na main thread datextarea(§2). Não é coberto pela Segurança/Infra: POST /api/rooms sem rate limit — criar salas é grátis, ilimitado e a linha nunca é apagada (rooms/route.ts:42-80) #104: esse tráfego não passa por rota nenhuma.RaceTrack.tsx:68-77) — mas a A11y/Motion: prefers-reduced-motion não alcança nenhuma animação de framer-motion — countdown em tela cheia e pista da corrida ignoram a preferência (§VII.4) #108 já reivindica esse arquivo sob reduced-motion e já declara conflito com a Performance/Área sagrada: progresso de cada adversário re-renderiza CodeDisplay e a textarea — custo de digitar cresce com o nº de jogadores #59. Terceira issue no mesmo arquivo é ruído, não backlog.em-resolucaoórfão (zero issues com o label; consistente com nenhuma PR non-draft em voo). Sem poda (é quinta).settingsekickficaram fora da doutrina da #131 — TOCTOU grava a partida no bucket errado do ranking (route.ts:142-146, :226-235) #134 e Performance/Área sagrada: 4 dos 5 eventos do canal público não têm teto no receptor — flood deprogressderruba o fps da corrida inteira (useRoom.ts:236-261) #135 entraram emTodo; os 4In Reviewconferidos um a um contra PR aberta viva (Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6→PR fix(security): exige sala estagnada para claim-leader (anti-sequestro) #12, Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34→fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119, Leaderboard/Integridade: ranking sem filtros premia o bucket mais fácil — filtros por linguagem/dificuldade/período (§III.8) #92→feat(leaderboard): filtros por linguagem, dificuldade e período no Ranking Global #106, Crescimento/SEO: produção anuncia canonical, sitemap e og:image em coderacer.app (503) — todo link compartilhado sai sem preview (site.ts:8) #117→fix(seo): resolve a origem pública a partir do deploy em vez de um domínio hardcoded (#117) #123); nenhumIn Progress(correto: ninguém com claim). Arquivei a Segurança/RLS fatia 1 (#103): broadcast autoritativo de sala em paralelo ao postgres_changes — sem revoke, prepara o corte da leitura anônima #109 (fechada 30/07 03:40Z, 7d10h). A Performance/Área sagrada: progresso de cada adversário re-renderiza CodeDisplay e a textarea — custo de digitar cresce com o nº de jogadores #59 completa 7 dias hoje às 21:15Z — deixo para a rodada de amanhã em vez de antecipar; restam 5Donevivos.settingsekickficaram fora da doutrina da #131 — TOCTOU grava a partida no bucket errado do ranking (route.ts:142-146, :226-235) #134/Performance/Área sagrada: 4 dos 5 eventos do canal público não têm teto no receptor — flood deprogressderruba o fps da corrida inteira (useRoom.ts:236-261) #135 chegam ao Conselho amanhã (sexta 12h). Nenhuma P1 elegível de novo: Crescimento/SEO: produção anuncia canonical, sitemap e og:image em coderacer.app (503) — todo link compartilhado sai sem preview (site.ts:8) #117/Anti-cheat: finish sem coerência temporal — leaderboard forjável em 1 request e corrida alheia encerrável #34/Leaderboard/Integridade: ranking sem filtros premia o bucket mais fácil — filtros por linguagem/dificuldade/período (§III.8) #92/Segurança: claim-leader permite sequestro de liderança de qualquer sala (sem autorização) #6 têm PR aberta, Segurança/RLS: "sala privada" é enumerável — policy using(true) em rooms expõe toda sala ao anon (0002_realtime_rooms.sql:26-29) #103 e Practice/Solo mode (§V.5): treinar sem sala — modo inteiro a fatiar #24 sãoepic, Anti-cheat/Leaderboard: recorde impossível (3596 WPM) no Ranking Global — sem teto de plausibilidade #28 édecisao-dono. Ressalva: a Segurança/Multiplayer:settingsekickficaram fora da doutrina da #131 — TOCTOU grava a partida no bucket errado do ranking (route.ts:142-146, :226-235) #134 é §7.2 (api/rooms/**) → PR non-draft comSolicito quórum (HANDBOOK §7); a Performance/Área sagrada: 4 dos 5 eventos do canal público não têm teto no receptor — flood deprogressderruba o fps da corrida inteira (useRoom.ts:236-261) #135 é §7.3.auto/*órfãs sem PR (issue-28,issue-34-finish-timing,issue-39,issue-97) — nenhuma trava issue elegível hoje, mas a de Anti-cheat/Leaderboard: recorde impossível (3596 WPM) no Ranking Global — sem teto de plausibilidade #28 a travará em silêncio no dia em que o dono destravar odecisao-dono. Não deleto branch de outro agente (§8). @caioross: o gargalo segue humano — 4 PRs paradas (fix(seo): resolve a origem pública a partir do deploy em vez de um domínio hardcoded (#117) #123/feat(leaderboard): filtros por linguagem, dificuldade e período no Ranking Global #106/fix(security): exige sala estagnada para claim-leader (anti-sequestro) #12decisao-dono, fix(anti-cheat): piso de coerência temporal no finish — WPM impossível não entra mais no ranking (#34) #119 vetada 3×) e 4 [Decisão] abertas ([Decisão] Anti-cheat do leaderboard (#34): duas PRs, dois quóruns, um limite estrutural — escolher A, B ou C #132, [Decisão] #117 / PR #123: a origem pública do site depende de um checkbox da Vercel que nenhum agente enxerga #126, [Decisão] PR #106: filtros do ranking movem o dedupe para o TS — amplificam a #34 de 1 vaga para o ranking inteiro #107, [Decisão] Leaderboard cap (#28/#30): defesa-em-profundidade + deletar linha bruta vs. teto na view #46).