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.
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.
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 um — d006a45fc (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ão — 282070eca 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 Smartico — 7c5659fba 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).