Pular para o conteúdo principal

Changelog - 09/08/2026

Perfil único de resolução para a arte de jogo

  • Janela desta entrada — cobre 03/08 a 09/08 (25 commits em main-7k). É a entrada mais recente do changelog; 10/08 ainda estava em curso quando ela foi escrita, e os dois commits daquele dia que fecham a poda de environments estão anotados no fim, em ## Infra / CI/CD.
  • O Cloudflare Images codifica o transform no PATH, então cada combinação de largura, altura e recorte é um RECURSO distinto (PR #1876) — 1b6b8e904 parte dessa constatação: cache-key de browser própria, entrada de cache CF própria e download próprio pra cada variação. O app tinha 12 superfícies pintando game.image com 4 recortes e 10 ladders diferentes, nenhuma compartilhando nada. Medido no 7k mobile (iPhone 14 Pro Max, DPR 3, 3G): o card do carrossel pedia width=240,height=300 (10,0 KB) e a página de jogo pedia width=320,height=400 (13,5 KB) — 23,5 KB pra mostrar a MESMA arte duas vezes, com o segundo request entrando frio no 3G do usuário e a arte piscando ao abrir o jogo.
  • Pior: os degraus grandes eram upscale. O master da arte de jogo no CF é 300x350 (amostrado sobre 12 assets reais da biblioteca), então 320, 447 e 480 inventavam pixel — width=480,height=600 devolvia 21,5 KB de nada, o dobro do degrau que a listagem já tinha em cache. O teto útil é ~300px de largura.
  • O que passa a valer~/utils/game-artwork centraliza ladder e fallback num perfil único e cada superfície declara só o seu sizes, que é o slot de layout real. Não há mais recorte no servidor: o enquadramento vai pro CSS (object-cover numa caixa de aspect fixa), então card 4/5, poster 59/79 e thumb de proporção natural passam a compartilhar o MESMO arquivo. O ladder default vai de [144,216,288] pra [128,192,288] — o degrau do meio serve DPR 1 e precisa ficar logo acima do maior slot (186px, a thumb do preview da página de jogo) sem nenhum degrau entre ele e o menor slot de card de desktop (140px); com 216 o card pegava um degrau e o hero era empurrado pro seguinte, baixando a mesma arte duas vezes no desktop. As 5 brands size: "compact" passam a [128,192,240], cortando ~25% dos bytes e da memória de bitmap decodado. Fundos borrados e reflexos reusam as props EXATAS da thumb em vez de baixar uma segunda variante recortada só pra ficar sob um blur().
  • Guarda-chuva contra regressão — 11 testes de perfil mais uma auditoria de TODAS as brands (56 casos) que falha se alguém reintroduzir um degrau entre o card e o hero, inclusive em brand nova. THUMB_ASPECT_VALUE foi removido porque existia só pra alimentar o recorte no servidor e mantê-lo era convite pra refragmentar.
  • A convergência que faltava (PR #1877) — a97d91545: o perfil único convergia em DPR maior ou igual a 2 (todo celular real) e em DPR 1 no desktop, mas não em DPR 1 com viewport estreito, onde os slots divergem de verdade (o card declara 115px e a thumb do preview ~152px, com o degrau 128 exatamente no meio). O fix faz as superfícies da página de jogo declararem o slot do CARD no mobile: GAME_PREVIEW_ARTWORK_SIZES passa a espelhar os breakpoints do card e o GamePageHero da donald vai de 131px pra 128px. É uma sub-declaração deliberada de ~19% — em DPR 1 estreito a arte vem 128px numa caixa de ~152px, imperceptível.

Changelog - 02/08/2026

BREAKING: cassino-bet-br e vera-bet-br saem do front-web-base

  • Janela desta entrada — cobre 27/07 a 02/08 (60 commits em main-7k). Duas mudanças breaking e duas features apagadas por completo: é a semana mais consequente do trimestre pra quem consome o template.
  • As duas brands foram removidas do base e vivem hoje no fork front-web-external (PR #1835) — 84057c160 (refactor(brands)!) apaga overrides/cassino-bet-br e overrides/vera-bet-br inteiros. O diretório de overrides do base vai de 15 para 13 brands rastreadas: 7k-bet-br, betpontobet-bet-br, casateste-com, cl-bet7k-com, donald-bet-br, fi-7k-bet, ng-7k-bet, pb-bet, ph-state77-com, pt-state77-com, rj-bet, state77-com, x2b-bet. O commit toca 439 arquivos e remove ~28,4 mil linhas.
  • Para onde elas foram — ops bd6d1ee cria config/brands/web-external/brand.yml apontando pro repositório cactus-agents/front-web-external e MOVE 5 environments de web-base pra web-external: cassino-bet-br, vera-bet-br (com default_branch de main-external pra main), stage-cassino, stage-vera e sports-vera. O placeholder config/brands/vera-bet-br é removido — um fork atende as duas. Ops e01a693 já havia apontado os envs pra main-external em 18/07, e ops 3b555c3 ajusta o required_team de deploy protection dos dois. No base, 2d47d394d limpa o dropdown de workflow_dispatch.
  • O que morreu junto, por não ter mais consumidor — o commit é a melhor documentação do próprio efeito colateral: saem ~40 variantes órfãs de layout e widget (header-split-bar, header-vera, sidebar-sectioned-titled, sidebar-wide, header-secondary-flat, as bottom-navs illustrated-tabs/grid-tiles/betano/fab-center, TopGameCardLegacyGrid/CompactWatermark/Outline, SectionTitleNeon/Vera/Panel, CtaButtonVera, BiggestWinsListWidget com HomeWinsRightColumn, RecommendedGamesCarousel, ProfileCompactHero/CenteredSpotlight, FooterBadges) e features exclusivas das duas (ReferralIndicatorV2 com suas rotas de API, todo o Incognia, useAutoLogoutEndpoint com a rota /logout-auto, gamificationRelevanceSort, homeRightPane, usePaginatedGames, useRemarketingId). Mantidos de propósito por decisão de produto: ftd*, profiles, social auth, os módulos VIP, sports-rogue e RecommendedGamesBento (default do base).
  • Consequência prática pra leitores do changelog — todas as entradas anteriores que tratam cassino-bet-br e vera-bet-br como brands do base descrevem um estado que não existe mais aqui. Mudanças nessas duas brands a partir de 28/07 acontecem no front-web-external, cujo histórico não é visível deste workspace.

Changelog - 26/07/2026

Documento SSR auth-agnóstico — useAuthGate e o expurgo de dado de usuário dos loaders

  • Janela desta entrada — cobre 20/07 a 26/07 (171 commits em main-7k, a semana mais movimentada do trimestre). Foi também a semana em que main-fix e main-7k foram cruzadas nos dois sentidos (PR #1770 e PR #1773), então muitos assuntos aparecem duas vezes no histórico com SHAs diferentes — cada item abaixo cita um SHA só.
  • O documento SSR deixa de saber quem é o usuário (PR #1808, branch feat/user-data-out-of-ssr) — 6b1f32a90 remove auth e smarticoHash do loader de routes/_layout, e cb1b41c26 introduz o gate canônico app/hooks/useAuthGate.ts, client-side e sem snapshot SSR: o SSR sempre pinta convidado, o cookie is_authenticated serve como sinal otimista pós-mount e a store reativa assume depois da hidratação. Regra que nasce daqui: visibilidade e comportamento de UI nunca devem ser decididos com useRouteLoaderData("routes/_layout"), porque aquele é um snapshot SSR que não atualiza quando o login/logout acontece por modal.
  • Loaders per-user desmontados um por umd006a45fc (wallet, fetch 100% client-side), 62fd7b064 (rewards e income-report), 7de40d656 (página de favoritos), f17975eff (favoritos e recentes da home), 5683cdb3c (a página de jogo passa a serializar só a contagem pública de voteState; o userVote vira client-side), e23934b23 (bootstrap do álbum via /api/album/bootstrap). 28366ffca é a reescrita larga do caminho de dado de usuário no SSR.
  • Guardrail em teste, não em revisão282070eca cria o leak-canary: loaders públicos não podem serializar dado de usuário, e o teste falha se voltarem a fazê-lo. e06e384a0 fecha um furo do próprio guardrail (o canary passou a resolver todos os campos-promise do _layout, não só os síncronos). f8d6acf53 testa o useAuthGate contra a store real e f4d4eb059 deduplica React e Zustand no vitest.config — a resolução source-direct estava trazendo uma segunda cópia de React pela via de alias.
  • Reconciliação do Smartico7c5659fba mantém o smarticoHash correto em login e logout dentro da sessão SPA agora que o doc é auth-agnóstico, e 338c824b0 adiciona guard de corrida no fetch dele (além de corrigir comentários que descreviam o gate SSR antigo).

Changelog - 19/07/2026

Refino de UX da família 7k — ondas 4 a 7 e paridade cl/ng/fi

  • Janela desta entrada — cobre 13/07 a 19/07 (151 commits em main-7k, a branch de entrega viva do front-web-base; a main está parada desde 25/06 e não representa o que está em produção). Entradas semanais, não diárias.
  • Ondas 4, 5 e 7 fecham a série de refino visual do 7k-bet-br2de6e2187 (onda 4: modais de depósito, PIX compacto, "já paguei", valores sugeridos), 927f6b2e6 (onda 5: sidebar/nav, gamificação, home cassino, busca mobile) e 352b5beeb (onda 7: corrige hydration mismatch dos links de share, que piscava no F5). As ondas 1 a 3 caíram na semana anterior.
  • Paridade da família imediatamente depois32245acd0 replica as ondas 1 a 4 em cl-bet7k-com, ng-7k-bet e fi-7k-bet; fd3e7ad1c replica a onda 5 (sidebar/nav). O padrão do trimestre: o 7k-bet-br é a brand de referência e as três irmãs recebem o mesmo pacote em commit separado.
  • Barra mobile redesenhada com FAB central da marca (PR #1597) — b5a8d4f99 cria a variante mobile-nav-fab-logo: o item "Menu" vira um FAB circular com a logo da brand e o menu mobile passa a subir como bottom sheet em vez de drawer lateral, degradando pra tiles planos quando o special fab-center está ausente. af7e9bd23 (PR #1594) reordena os tiles pra Menu · Cassino · Buscar · Torneios · Esportes, com a busca no centro pelo alcance do polegar.
  • Tom global dos textos escurecido um pontoe45e597c4 troca #e6e6e6 por #e0e0e0 nos theme/colors.ts das 4 brands da família, cobrindo texts, links, titles e todos os sub-tokens; 4fb6b3eb5 já havia escurecido o fundo dos títulos de seção.

Changelog - 12/07/2026

Semana de 06/07 a 12/07, na branch main-7k do front-web-base. É a semana em que o programa de performance/streaming da plataforma sai do papel: 93 commits filtrados, a maioria concentrada num único eixo.

Semana 06–12/07 — streaming SSR e clientLoader em toda a aplicação

  • App-shell streaming SSR, começando pela home (90d1dcfb4): o entry.server passa a transmitir o stream no shell-ready via TransformStream — head processado no primeiro flush (tailwind inline, strip de modulepreload com keep-list derivada do manifest, strip de preloads de imagem não-LCP) e body em passthrough com tail-carry. Antes o stream era bufferizado até o fim pra rodar regex no HTML completo, ou seja, o primeiro byte esperava todo o conteúdo. Junto vem o piloto de deferred data na home: catalog, gameStatsCache, topWins e lastWins saem do caminho crítico e streamam via Suspense/<Await> no documento SSR e via turbo-stream nas navegações .data, com SectionSkeleton no lugar. Continuam awaited homeRows, brand, auth e a page description (meta/SEO/LCP). Cada perna deferida ganhou .catch(() => vazio), então rejeição degrada pra row vazia em vez de 500 na home inteira. streamTimeout de 10s com abort combinado.
  • Estendido pra game page, hubs e navegação (85a108c2d): o loader da página de jogo cai de 3 gates sequenciais pra 2 awaits (game e brand, o mínimo pro meta/SEO), deferindo stats, winners, related, providers, voteState e as seções showcase. O getStatsRaw, um endpoint do BFF não cacheado que só alimentava o DevPanel, foi movido pro gate de dev — produção deixa de pagar por ele. Nos hubs de cassino e ao-vivo, gameStatsCache e os wins passam a deferidos no caminho de rows. E em _layout.shouldRevalidate, troca de pathname deixa de revalidar o layout, o que remove a chamada de auth por usuário — transatlântica — do caminho crítico de toda navegação SPA logada; login e logout seguem revalidando via revalidate() explícito. Skeletons CLS-zero novos: WinsCombinedSkeleton (o fallback anterior causava ~137px de shift no desktop), WinsMarqueeRowSkeleton, PaidTodaySkeleton, ListWinsSkeleton e GameRowSkeleton derivado do gameCardConfig, com widths corretos por breakpoint e por brand.
  • clientLoader deixa a navegação game → game instantânea (1812d8b07): a navegação SPA pra /cassino/jogar/:provider/:game esperava o .data inicial, que aguarda o getDetail (round-trip de 0,5-1,5s em cache miss), travando a troca de rota inteira. O clientLoader devolve o loaderData na hora — serverLoader() disparado sem await, cada campo encadeado como promise — então a URL troca instantaneamente e o conteúdo preenche por streaming. game, frontDescription, seo e faqEntry foram combinados num único boundary de AwaitValue cujo fallback reserva a geometria exata do conteúdo real, e slug/showcase ficam síncronos porque são deriváveis de params/featuresConfig sem round-trip. 5c24a1354 acrescenta o skeleton pixel-perfect e o seed otimista do card clicado.
  • Padrão propagado pro resto das rotasb3e8c151d (hubs cassino e ao-vivo), bb0b2c012 (categorias e provedores), f241a9145 (home, incluindo seed otimista a partir do homeRows já cacheado na store e o bundle de favoritos/recentes virando um único favoritesBundle streamado), 761088aa6 (VIP e gamificação) e e6fe562f1 (conteúdo WP, legal e busca, com legalTerms deferido). cc237adfc centraliza o preview de dev-skeleton num módulo único e removível; 49ef0d808 e d8401122b corrigem imports .server que vazaram pro caminho client.
  • Dois defeitos reais achados e corrigidos no próprio programa. 885f0e92c: o encoder de single-fetch do React Router corre toda promise deferida contra o streamTimeout, e perna pendente virava frame E:["Unexpected Server Error"] dentro de um body 200, por fora do .catch do loader; pior, errorElement={null} é falsy, então o <Await> re-lançava pro ErrorBoundary da rota em vez de suprimir (a tela renderizava e depois virava erro); e o worker cacheava o .data 200 com o frame de erro embutido por 60s, servindo o mesmo erro em HITs subsequentes. Fix: errorElement truthy (fragment vazio) em AwaitValue/AwaitWins e na home. afc20a73d, resultado de revisão adversarial: o buildSpaShell bufferizava o stream inteiro pro usuário logado (TTFB = render completo, ~11s no pior caso) e devolvia um shell morto; Set-Cookie de tracking bloqueava o cache compartilhado pra todo visitante anônimo frio; o cache autenticado não tinha guard contra payload envenenado ou documento truncado; e a home resuspendia pra skeleton genérico em todo login/logout. O buildSpaShell foi removido e o autenticado em rota pública passa a receber a mesma stream real do anônimo.
  • Navegação e stats estáveis na página de jogo (dfad863b1): getStats e getVoteCount ganham timeout fail-fast de 1200ms, com a promise original registrada no waitUntil — assim o warming completa em background mesmo em cold-miss, o que o timeout sozinho mataria. As duas ondas sequenciais de Promise.all do loader foram fundidas, removendo um round-trip serial.

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, com dataLayer isolado chamado anaLayer, rodando em paralelo e independente da stack de analytics atual (dataLayer/registry + Meta, Kwai e os demais). A config é brand-gated com default null, então a invariante é que nenhuma brand dispara sem container declarado. Inclui registry tipado dos 32 eventos, helper pushAnaLayerEvent, campos padrão (user_id, user_id_hash como SHA-256 do CPF, platform, profile_type, event_timestamp), event_id determinístico, AnaLayerProvider/useAnaLayer e um AnaLayerInitializer espelhando o Consent Mode v2 do initGTM. 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_content e search — disparados em paralelo aos eventos legados, lendo IDs reais das APIs. Bloqueados de propósito, com scaffold e TODO: game_opened e game_session_ended (aguardando game_session_id no StartGameResponse do core), além de refund, 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 brandfba166367 reaponta a camada pra vera em vez do 7k; b621f558e faz o useAnaLayer degradar pra no-op fora do provider; e 4bf4ebabd adiciona a flag enabled à AnaLayerConfig, criando o estado "configurado mas desabilitado": o gate passa a exigir enabled === true e containerId. Resultado no fim da semana: vera-bet-br é a única com enabled: true; 7k-bet-br e cassino-bet-br ficam com container declarado e enabled: false. Os IDs de container vivem só nos overrides de cada brand.

Changelog - 28/06/2026

Semana de 22/06 a 28/06, na branch main-7k do front-web-base.

  • O baseline de boot do Google Consent Mode v2 foi invertido pra granted (16bf59fee). Isto reverte o comportamento descrito no changelog de 23/04/2026. A política antiga emitia gtag('consent','default', { ...tudo denied, wait_for_update: 500 }) e só depois, se houvesse cookie salvo, aplicava um update. A nova emite gtag('consent','default', { ...tudo granted }) sempre, sem wait_for_update. O único caminho que ainda rebaixa sinais é cookieConsentCosmeticOnly === false e cookie salvo indicando rejeição total, caso em que o initGTM dispara um update imediato pra denied. Matriz implementada: cosmético truegranted (qualquer cookie ignorado); cosmético false sem cookie ou com aceite → granted; cosmético false com rejeição total → default granted + update imediato pra denied. Arquivos: app/utils/metrics/consent.ts (injectConsentDefaults com opts.applyDenied) e app/utils/metrics/gtm.ts (decide applyDenied = !cosmetic && userRejectedAll), com 4 casos de teste. A justificativa registrada no commit é paridade com o app Nuxt legado, que nunca gateava tracking, e a eliminação da janela cega de 500ms do wait_for_update, apontada como causa suspeita da queda de performance em Google Ads e Meta Ads após a migração.
  • cookieConsentCosmeticOnly passa a ter default true no base (be0518d91). Antes o default global era false, então brand que não declarasse a flag honrava a rejeição do usuário. As 7 brands que já declaravam true seguem idênticas; as 8 que herdavam false (casateste-com, donald-bet-br, pb-bet, ph-state77-com, pt-state77-com, rj-bet, state77-com, x2b-bet) passaram a declarar false explicitamente no próprio override — comportamento preservado bit a bit, com o ganho de que cada override é agora a fonte autoritativa da política de consent daquela brand, sem depender do default do base.
  • Nota de revisão pendente: as duas mudanças acima descrevem o que o código faz hoje. A política resultante — consent concedido por padrão, tratamento cosmético como default e ausência de botão de rejeição total no banner — ainda depende de confirmação do responsável por LGPD antes de ser publicada como política oficial. Registrado aqui como fato técnico, não como posição de conformidade.
  • Eco do gtag duplicando eventos do dataLayer corrigido em ea9b09a68.

Changelog - 21/06/2026

Semana de 15/06 a 21/06. Daqui pra frente o changelog é semanal (arquivos YYYY-MM-DD-weekly.md, datados no último dia coberto). A fonte de verdade do front-web-base é a branch main-7k — a main está defasada e não reflete o que foi pra produção.

Semana 15–21/06 — cache overhaul: CACHE_GENERATION como token único de rotação

  • front-ops/config/cache/generation.yml vira a fonte operacional de verdade (ops f00c642): o arquivo carrega current: apcsrasj-v3, é lido no deploy e injetado como --var CACHE_GENERATION no wrangler deploy. Bumpar pelo workflow novo bump-cache-generation flipa de uma vez a namespace do Cache API do platform-cache, o cacheKeyPrefix do api-client e o GLOBAL_VERSION do front-service-api; sem o arquivo, o deploy cai no default in-source (fail-open). É separado do BUILD_ID, que já rotaciona a cada deploy — o CACHE_GENERATION é o "nuke from orbit" que o padrão legado de pasta-nova-por-deploy fornecia. cache-status.yml complementa como leitura read-only.
  • Base conectado à máquina nova (b445a6b5a): binding declarado no worker-configuration.d.ts; app/services/platform-cache.server.ts mantém um storesByGeneration chaveado pelo token, então o cache de isolate rotaciona atomicamente; app/services/api.server.ts deriva cacheKeyPrefix como api-cache-<gen> e liga delegateCaching: true nas rotas já cacheadas na camada platform-cache, eliminando o drift de TTL duplo que causou o postmortem de /payment-providers em 05/2026. app/routes/api/cache/purge.ts passa a delegar ao createPurgeHandler do core (mesmo contrato de tag/glob/scope/dry_run, com extractApiError no lugar de [object Object]) e nasce app/routes/api/cache/inspect.ts, endpoint GET que lista recursos, tags e namespace corrente e, com ?include=state, sonda o Cache API.
  • TTLs apertados e falhas de fallback visíveis (239651ff4): KV_SSR_TTL cai de 12h pra 1h (o valor antigo era resquício da premissa "rebuild a cada 12h"), entra MAX_API_CACHE_TTL = 3600 com clamp em getApiCacheRule, e erros de fallback de asset em KV e R2 passam a ser logados — antes eram engolidos em silêncio, deixando problema de permissão ou bucket invisível no Logpush. public/_headers reduz /icons/* de 1 ano pra 30 dias.
  • Defaults e purge seletivo no front-ops (b36e445): brandConfig sai de 3600s e homeRows de 7200s, ambos pra 60s + SWR 300s, então mudança de backoffice reflete em menos de 60s; toda resource ganha tags pra o purge mirar fatias em vez de derrubar tudo; staleIfErrorSeconds capado em 6h. manual-cache-purge.yml sobe pra v3 com tags (CSV), glob, scope e dry_run. 8645ac2 cria config/cache/service-api-defaults.yml com 19 regras consumidas no deploy do service-api — base e service-api passam a compartilhar a mesma taxonomia de tags.
  • skip_post_deploy_purge por environment (ops 2d83a4c, aplicado em 0d4437e e 64f130f): workers atrás de Cloudflare Access devolvem 404 no purge pós-deploy porque o curl segue o redirect de login sem service token. Até os service tokens entrarem no workflow, o environment pode sair do purge por segmento — a rotação do CACHE_GENERATION já torna as entradas anteriores inalcançáveis — e um step de notice registra o skip no run summary.
  • front-service-api com política externalizada (f80791d): DEFAULT_GLOBAL_VERSION = apcsrasj-v3, getGlobalVersion(env) lendo CACHE_GENERATIONBUILD_KEY → default, política vinda de env.SERVICE_API_CACHE_POLICY_JSON (era hardcoded) e /v2/cache/purge com o mesmo contrato do base. scripts/build-cache-policy.mjs resolve o YAML por --file, FRONT_OPS_PATH ou irmão ../front-ops. 27 testes novos, com 8d9fe4f documentando o fluxo no README.

Changelog - 14/06/2026

Semana 08–14/06 — Novo sportsbook nativo: rogue

  • Quarto provider de sportsbook, e o primeiro renderizado in-app4c37f8967 integra o rogue: um sportsbook React nativo entregue pelo SDK @cactus-agents/sports-rogue, montado dentro da própria aplicação em Shadow DOM e consumindo a Rogue API da First. Diferente de First, Altenar e Betby, que são iframes, aqui o sportsbook é componente. O SportsRogue.tsx monta o SDK via createSportsbook, registra callbacks de auth / login / depósito / share, sincroniza histórico (pushState + popstateinstance.navigate), restaura share links via ?betslip= e aplica offsets de layout por useSdkChromeOffsets.
  • Rotas server-side e segredo que não chega ao browser — o commit adiciona rogue-anonymous e rogue-login (token) mais rogue-proxy/*, um proxy same-origin pro domínio do provider com streaming de SSE, resolvendo CORS sem expor nada ao client. A chave de API é server-to-server: entra via extraHeaders do api-client e é injetada nos endpoints de token a partir de secret, nunca chegando ao browser. O app/config/sports/provider.ts ganha FORCE_SPORTBOOK (resolveForceSportbook / applyForceSportbook) pra ativar o provider por ambiente sem mexer no main estático da marca. O módulo é autocontido: escudos e assets vêm do CDN default do SDK, sem plugin de cópia no host.
  • Suporte no core, sem vazar tipos do SDK170ca69 declara "rogue" como SportsProvider reconhecido em @cactus-agents/sports, adiciona RogueProviderConfig (tema / scheme / estilo de odds / cores, mais passthrough), roguePath opcional em SportsSidebarItemBase e o caso correspondente em resolveMenuItemPath. Em @cactus-agents/api-client entra extraHeaders opcional em CactusServerClientOptions, mesclado nas requisições de saída, permitindo injetar segredos server-to-server sem forkar o client. Tudo aditivo: comportamento default inalterado. A config do rogue usa superfície comum tipada mais passthrough justamente pra que o SDK siga como fonte de verdade dos próprios tipos.
  • @cactus-agents/sports-rogue não vive no front-cactus-core — vale registrar explicitamente: o pacote é uma dependência @cactus-agents/* real do front-web-base, mas não está em front-cactus-core/packages/; é publicado de outro lugar. Hoje o PROVIDERS do base declara quatro providers: ["first", "altenar", "betby", "rogue"].
  • Auth do SDK reconciliada depois do init503560f37. O SDK ficava preso em anônimo mesmo com o usuário logado: o efeito de isAuthenticated chamava instance.setAuthenticated() antes de a instância existir (durante o import dinâmico do SDK), virava no-op, e como isAuthenticated não mudava de novo nunca havia nova tentativa — só rogue-anonymous era chamado, nunca rogue-login. O fix guarda o isAuthenticated num ref e, depois do await instance.init(), chama setAuthenticated(isAuthRef.current) pra reconciliar qualquer flip ocorrido na janela de import/init.
  • Trem de bumps do SDK na mesma semanafdada3743 (^0.4.0, criador de apostas), 570d71af2 (^0.5.0), a78417352 (^0.6.0), c95dc81f8 (^0.7.0) e 9721f814f (^0.8.0). O 0.3.0 trouxe auth lazy, dedup do token de SSE de 4+ chamadas pra 1 e retry na sidebar de esportes. O pacote segue evoluindo rápido — hoje o base está em ^0.29.2.

Changelog - 07/06/2026

Semana 01–07/06 — Nova marca: donald-bet-br

  • Override criado a partir da betpontobet-bet-br53e519d58. Mesmo operador (OPEN GAMING SA), então o esqueleto de config é reaproveitado inteiro; o que muda é identidade visual, IDs de terceiros, copy de SEO/FAQ e tom de voz — deliberadamente, pra evitar duplicação de conteúdo entre as duas marcas do mesmo grupo aos olhos do Google.
  • Identidade e integrações — paleta navy + ciano do backoffice (primary #03c6fc, bg-primary #091635, bg-secondary #05102c, sidebar #021c47), topbar no azul dos balões dos cards de jogo, header com Cadastrar sólido ciano e Entrar em outline ciano (paridade com a produção legada) e sidebar buttons em tom navy em vez do cinza neutro. Gamificação com brandKey e labelKey próprios do Smartico e naming "Clube Donald" / "Pontos". Analytics com container GTM próprio via Stape em subdomínio da marca, facebookDomainVerification própria e Taboola compartilhado. Referral com brandSlug próprio, lido do header x-brand do plugin legado. WordPress, portal de atendimento e ouvidoria em subdomínios próprios.
  • Ambientes e CI — front-ops 5e24b0b cria os dois ambientes: produção (donald.bet.br, deploy manual gateado pelo time de deployers criado na semana anterior) e stage com auto-deploy na branch stage. Espelha o padrão da betpontobet-bet-br, e ambientes de dev/performance foram intencionalmente omitidos pra essa marca. 545188bd2 adiciona a marca ao dropdown de deploy do base, corrigindo o drift entre repositórios.
  • Este onboarding abre a maior construção de marca do trimestre: o design system da donald consome as semanas seguintes.