Changelog - 05/07/2026
Semana de 29/06 a 05/07, na branch main-7k do front-web-base. Semana mais leve em volume (47 commits filtrados), mas com duas decisões estruturais de tracking.
Semana 29/06–05/07 — anaLayer: uma segunda camada de tagueamento GA4, paralela à existente
- Fundação da camada (
1fceb0672): implementa o tagueamento GA4 do guia Ana Gaming num container GTM secundário próprio, comdataLayerisolado chamadoanaLayer, rodando em paralelo e independente da stack de analytics atual (dataLayer/registry + Meta, Kwai e os demais). A config é brand-gated com defaultnull, então a invariante é que nenhuma brand dispara sem container declarado. Inclui registry tipado dos 32 eventos, helperpushAnaLayerEvent, campos padrão (user_id,user_id_hashcomo SHA-256 do CPF,platform,profile_type,event_timestamp),event_iddeterminístico,AnaLayerProvider/useAnaLayere umAnaLayerInitializerespelhando o Consent Mode v2 doinitGTM. 21 testes. - Wiring de 22 eventos no mesmo commit —
page_view,login,sign_up,modal_viewed,begin_checkout,add_payment_info,deposit_pix_generated/copied,purchase,deposit_pix_expired,withdrawal_started/requested,kyc_started/completed,form_error,view_item_list,select_item,view_promotion/select_promotion,select_contentesearch— disparados em paralelo aos eventos legados, lendo IDs reais das APIs. Bloqueados de propósito, com scaffold e TODO:game_openedegame_session_ended(aguardandogame_session_idnoStartGameResponsedo core), além derefund, o ciclo de saque pós-requested, aprovação/rejeição de KYC e cashback, que são observados no backend e ficam registry-only. Nada é disparado com dado sintético. - Alvo trocado de 7k pra vera e depois configurado por brand —
fba166367reaponta a camada pra vera em vez do 7k;b621f558efaz ouseAnaLayerdegradar pra no-op fora do provider; e4bf4ebabdadiciona a flagenabledàAnaLayerConfig, criando o estado "configurado mas desabilitado": o gate passa a exigirenabled === trueecontainerId. Resultado no fim da semana:vera-bet-bré a única comenabled: true;7k-bet-brecassino-bet-brficam com container declarado eenabled: false. Os IDs de container vivem só nos overrides de cada brand.
GTM primário desligado em produção
7k-bet-brdesativa o GTM em produção (38f02fef9), comPROD_DISABLE_GTM_VALUEemtrue, marcado no próprio commit como mudança temporária a ser revertida. Um dia depois,c878306a7faz o mesmo emng-7k-bet,fi-7k-betecl-bet7k-com. Na prática essas duas mudanças, somadas aoanaLayeracima, deixam a família 7k rodando sem a camada primária de tagueamento por alguns dias — o desdobramento (reativação com container novo, e depois a virada definitiva proanaLayer) acontece nas semanas seguintes.
Performance — ondas 1 e 2 de PSI
- Onda 1, crítico de paint (
051292225): preload da imagem de LCP reativado com consciência de desktop, preservandofetchPrioritynoentry.server; primeiro thumbnail das stories viraeagercomfetchPriority=high(o LCP mobile);manualChunksseparado por domínio (gamification, kyc, payments, sports em chunks individuais); header com auth-gate SSR-safe (snapshot do loader + cookieis_authenticated), removendo o flash de skeleton de guest e reduzindo CLS;<link>de CSS duplicado removido,preconnectde imagem adicionado epreconnectdo GTM removido na 7k; euseVersionCheckpassa a estático noDefaultLayout. - Onda 2, TBT e terceiros (mesmo commit): Zendesk vira facade e só carrega no clique em suporte; Pendo passa a interaction-only, sem gate de bot (lab e usuário real veem a mesma página); widgets auxiliares (
BackToTop,BottomNotification,LastGame) têm o mount adiado por um hook novouseDeferredMount; e CTAs de guest deixam de renderizar quando o cookieis_authenticated=1. - Hidratação com idle limitado (
ab1872d5e): orequestIdleCallbackda hidratação noentry.clientganhatimeout: 2s. A segunda espera de idle era ilimitada — em página com main thread ocupado empurrava a hidratação arbitrariamente longe, o usuário real tocava em UI morta e o INP sofria, enquanto o lab (que fica idle quase imediatamente) nunca via o atraso. Mantém o agendamento por idle, com budget previsível. O registro do service worker foi desacoplado pro seu próprio defer, e o timer morto que removia#lcpElementVisibleToAllsaiu (o elemento não é mais criado desde a remoção do div de LCP falso). - Flicker de cards no iOS eliminado (
2cc9b691f): iOS Safari — e portanto todo browser no iOS, que roda sobre WebKit — piscava os cards da home durante scroll vertical e arraste horizontal, por um bug do WebKit comcontent-visibility: autoem scroll containers aninhados (carrossel horizontal dentro da página).content-visibilityé desligado apenas no WebKit/iOS via classecv-offno<html>, setada por script inline; Chromium (e portanto Lighthouse/PageSpeed) mantém 100% do ganho de paint. No mesmo commit entra um kill-switch global de thumbs em vídeo (.mp4/.webm/.mov) nouseCustomThumb, cortando decode contínuo na GPU e cerca de 3,6 MB de mp4 na home — reversível em uma linha, com os configs de thumb por marca intactos.ee8f83ae6reduz a memória de imagens nos carrosséis pelo mesmo motivo. - Entrega de imagens otimizada (
89f49c652):sizespor posição noRecommendedGamesMosaic(corrigindo over-fetch dos thumbs de "Top 10 - Álbum") e noRecommendedGamesBento(compact passa de 50vw pra 33vw/25vw,w=400→ ~w=280);width/heightno ícone doHomeTopBannercorrigindo CLS;getResponsiveImagePropsnas imagens deSidebarButtonsGrid, derrubando URLs de 768px pra ~52/104px; ícones do bottom nav de PNG pra WebP q82 (42,7 → 12,0 KiB, −72%); ewidth/heightexplícitos nos logos de header mobile e footer. Complementado por667a911d0,861a66b9ce071928489, que reprocessam os selos do rodapé de PNG grande pra WebP redimensionado, e por35ab257e4, que converte oHomeTopBannerde import lazy pra estático.
Emagrecimento da home e do footer
- Caps de conteúdo na home (
c5db021b5): stories capadas em 12 (bolinhas e viewer, mais recentes primeiro, com corte único mantendo a correspondência por índice); novoHomeBannerConfig.maxSlidespor brand, com 7k em 6, aplicado nas variantes multi-scroll, single-fade e side-ctas e também no GA4; rows de jogos caindo de 15 pra 12 (cap noGameCarousel, default do fetch e configs de row do base e do override 7k); torneios na home limitados a 10 (era 15); e espaçamento de torneios alinhado às rows de jogos, deixando oSectionTitleusar sua margem padrão. - Réplica nos demais overrides —
f17b27246replica os ajustes navera-bet-bre136094821nos demais overrides.b5c82e266comenta as rows de missões, roletas, crash e slots da home do 7k; no mesmo período, o051292225também comenta as rows de Bolão, "Top 10 - Álbum" eprofiles-rowna 7k e alinhacl-bet7k-comeng-7k-betàs rows da 7k.0dc2a746eremove o texto de versão que ficava abaixo do "feito para brasileiros" no footer, ee7ba114f1remove o aviso de menu rápido da home.
Cache — chave SSR menos granular e HTML purgável
- Chave de cache SSR pública reduzida a 4 buckets (
d0746bcfa): saemUser-Agent, país ecookieHashda chave, que cai de centenas de buckets por dispositivo/UA pra 4 (auth × device). Isso elimina a divergência de staleness entre dispositivos e, mais importante, torna o cache SSR enumerável e purgável. O middleware passa a extraircomposeSsrCacheKey/deriveSsrKeyDimscomo funções puras e testáveis e ganhassrBrowserNamespaceNamesepurgeSsrHtml(Cache API + varredura de KV);/api/cache/purgepassa a limpar o HTML SSR, que era o real responsável pelo stale. Pra remover a dimensãocookieHash, a notificação da topbar virou client-only (nunca renderiza no SSR) e foi desativada em todas as brands e overrides, com comentário explícito de que reativá-la volta a causar CLS no PSI.
Esportes — 7k preparada pra rogue sem ligar
7k-bet-brpronta pra receber a rogue, com First seguindo default (44e91b8ef): osports.tsganha o blocorogue(tema escuro com a paleta da 7k) ebrandPreferencesidênticas às dabetpontobet(sportIds,regionCodes,topLeagueIds,preferredMarketTypes), masmaincontinua"first"— a rogue é ligada por ambiente viaFORCE_SPORTBOOK=rogue, que tem prioridade sobre omain. Osidebar-sports.tsganharoguePathprovider-aware, então não afeta a First ativa: Ao Vivo →/live, Em Breve →/today, esportes → paths próprios, e ligas comLeagueIdda rogue confirmado. Ligas sem ID ficam semroguePathe se auto-descartam no rogue até alguém preencher. O menu top-nav foi deixado intocado de propósito, porque seutonão é provider-aware.- Estado ativo de menu com o SDK navegando por
pushState(1fcbe910a): o path do SDK é espelhado numa store (sportsNav) exposta poruseSportsAwarePathname, então nav secundária, sidebar e menu do usuário marcam ativo/inativo corretamente quando o usuário navega dentro do SDK — que usapushStatee é invisível pro React Router. Adiciona "Minhas apostas" no menu do usuário (gated em rogue + auth) e faz a sidebar abrir a seção da rota atual e fechar as demais. Consome@cactus-agents/sports-rogue0.23.0.14dd4a75ffaz a rogue respeitar filtro de home e sidebars de liga, e47507ef78prepara os menus de esportes da 7k ("Minhas apostas" e ajustes). - 401 da rogue/First não desloga mais o site (
83d927b42): o token de terceiro expira por aba idle (401/1002), mas o interceptor global tratava qualquer 401 de/api/*como sessão Cactus e deslogava o site inteiro.shouldReactToUnauthorizedpassa a ignorar os paths de rogue (rogue-proxy,login,anonymous) — o SDK já reautentica e cai pro anônimo sozinho. - O SDK avança de
0.21.0pra0.23.0na semana (f939c5698,e2b371b52,1fcbe910a).
Cadastro, validação e suporte
- Passo de verificação de
full_name(e26252289): porta o step do legado, com ativação continuando backend-driven pela configvalidation_modulesda brand — nenhuma brand é afetada a menos que o backend listefull_namepara um contexto. OFullNameStepchega pré-preenchido, sanitiza na digitação viasanitizeNameInput, valida porisValidFullName(2+ palavras) e resolve a pendência, com tela de sucesso com botão "Continuar" e contagem de auto-fechamento; a rotaapi/validation/full-name/submitfaz proxy praupdateProfile(id, { name }). Três defeitos apareceram na integração com depósito e saque e foram corrigidos junto: o gate passa a ler um snapshot fresco do usuário (useAccountsStore.getState()), de forma que um step que muda dado é reavaliado corretamente em contextos encadeados; a storevalidationStepsganhaopenSeqe oValidationStepContenté keyed nela, então fechar e reabrir no mesmo tick remonta o step (corrige a tela de sucesso congelada com botão morto no depósito); e a contagem da tela de sucesso passa a usar intervalo + timeout estáveis, imunes a churn de re-render. Bumps:validations ^0.8.0,accounts ^2.8.0,i18n ^0.96.0. - Zendesk —
e80c2227ecorrige a leitura do JWT, que vem no campojwtdo BFF e não emtoken;9aa6070bapassa a chamar/api/user/zendesk-tokensó na abertura do chat.
Core / SDK
@cactus-agents/validations(0629dd3) ganha o módulo de validação defull_namee (225e1c1) osanitizeNameInputpra filtragem de input de nome;@cactus-agents/i18n(e8eadd0) publica as stringsfull_namede continuar e continuar-em.
Brand Overrides
- 7k-bet-br: faixa promocional na home e banner de torneio no perfil (
8fef3e62b), com a faixa inteira virando clicável (9ce7ccc2f) e depois reduzida junto com o ícone pra 32px (a6aec73cd);d6bc4cb00troca Poppins por Montserrat na faixa;f0c3814e0reposiciona o carrossel da Pragmatic Play acima de "Jogos da PG" em/cassino.0be5855b9remove o item "Bolão" do bottom nav (mantendofeBolao7kna sidebar e no campaign widget), faz o bottom nav renderizar de forma síncrona no SSR (removendo a dupla camada lazy, e com ela o pop-in pós-hidratação), cola as setas overlay do footer mobile na borda, adicionaaria-labelno botão de copiar link da página de jogo e reduz o over-fetch da imagem de fundo em blur. - cassino-bet-br: pill de saldo no modal de check-in diário (
e7f9796f5). - Sidebar do base (
6ee83c4c2): no variant default a home abre todas as seções, e o modo recolhido respeita seção fechada.
Pagamentos
- Mapeamento de status v3 de falha no
TransactionCardaplicado em5c4f4c808e revertido no mesmo dia em779090b8d.
Infra / CI/CD
- Nove bumps de geração de cache em uma semana —
615ec72(v5→v6),ce43f27(v6→v7),67fcba2(v7→v8),42a2325(v8→v9),94812ac(v9→v10),768857d(v10→v11),4792bcf(v11→v12) e8cc3b04(v12→v13). É o sinal mais claro de que o número da geração é um valor operacional volátil: qualquer doc que precise citá-lo deve apontar prafront-ops/config/cache/generation.ymlem vez de congelar a versão. - Environments novos e repontamentos — ops
20f762eadicionasports-7k-bet-breapp-7k-bet-br;91b8eeee55fc7d2apontam environments prafeat/sweepstakee depois pradev-7wins;f7b8e68reorganizasports,state77-comeperformance-7k;34d1788,5ff6d9a,c6afe7bec41aaf1ajustam auto-deploy edefault_branchde7k-bet-brevera-bet-br.09c13de00sincroniza o dropdown de deploy do base com os environments dofront-ops. f5efac531restaura opnpm-lock.yamlsem o drift de libc não relacionado que havia entrado.