◂ PLAY
LOBBYChangelog
production version · vUnreleased

Changelog

Everything that changed, version by version. Production is vUnreleased. The full file lives in CHANGELOG.md in the repository - this page is that file, rendered.

vUnreleased · 2026-11-04#

Added

  • O anúncio do passe agora comunica a temática Creepypasta em vez de barras de TV: banner original gerado no Mint com Capitão Caveira, Teletreco Sinal Fraco, Boneca da Cristaleira e Clóvis Fora do Ar, logotipo em letras de horror e cópia/alt bilíngues (public/img/passe/sessao-da-treta-s1.webp, public/js/passe-anuncio.js).
  • Installed PWA now opens and starts single-player without a connection. A root service worker keeps the game shell, the default Praça dos Três Poderes match and the same-origin resources loaded by the current installation; successful later visits refresh the cache and add maps/assets the player uses. Multiplayer, account, ranking and other server-backed features remain online-only.
  • Pacotes do Studio em produção pelo R2: em produção e preview o resolvedor busca os pacotes fixados em https://assets.corosolto.com.br/packs/<kind>/<id>/<versão>/ (public/js/data/pack-origin.js; host local segue em /packs/ com STUDIO_PACK_ROOT, ?packorigin=cdn|local força), com a mesma verificação de SHA-256; a CSP lista a origem no connect-src. npm run publish:packs (scripts/publish-studio-packs.mjs) sobe só pacote fixado e íntegro, com Content-Type pela extensão, Cache-Control imutável, If-None-Match: *, pula o que já está igual, recusa sobrescrever conteúdo diferente, tem --dry-run e confere cada objeto pela origem pública (SHA-256, bytes, MIME, cache, CORS). Réguas: eval:studiochar R19 (4 mutantes novos: origem errada, origem ignorada, sempre CDN, CSP sem origem) e eval:packpublish (13 mutantes), as duas no pr-fast.
  • Passe grátis "Sessão da Treta" (temporada 1, facção Fora do Ar): aba PASSE no lobby (só aparece com GET /api/passe respondendo), tela com os 15 níveis e as 5 recompensas de cada um, barra de XP, missões diárias e semanais, convites, bônus de XP ativo e RESGATAR; anúncio uma vez por versão do passe (visitante vai para o convite de login, que ganhou abrirLoginPrompt). Personagem com passe:{season, level} em characters.js aparece com cadeado e "Nível N" e só é escolhido quando unlocked.characters do servidor o lista; a partida offline e o pedido de personagem no multiplayer passam pela mesma trava. O client só manda {action:'claim', level} e, com consentimento de medição (window.__csPrivacy), o funil do painel {action:'analytics', event:'modal_view'|'open'}. /api/passe entra no proxy em rollout (404 do backend vira 503). Réguas: eval:passe (pr-fast + check:fast, 20 mutantes; os caminhos de main.js rodam num vm) e tools/eval/passe-browser.mjs (lobby real com o mock tools/eval/passe-mock.mjs; PASSE_MOCK=conta|visitante no serve.mjs para dev local).
  • /app: a light landing for visitors who open the game inside an app's browser (TikTok, Instagram, Facebook, LinkedIn, X). On 08/11 the TikTok paid campaign sent 517 visits in one hour; 72% loaded the 8 MB game inside the WebView and 85% left in under a minute without entering. Both edges (middleware.js on Vercel, src/middleware.ts on Workers) now answer the home with a 302 to /app when server-traffic.mjs classifies the user agent as app/ (desvioParaApp): only the home, query kept intact, ?jogo=1 and ?sala= pass through, the redirected request is not counted (the landing is). The page weighs about 1.4 MB (6 s vertical gameplay clip + poster from launch-media/2026-10-18-tricolor-morumbi), is static and noindex, puts both calls above the fold and rewrites every link to the home with the visitor's utm_ plus jogo=1; ABRIR NO NAVEGADOR tries intent:// on Android and x-safari-https:// on iOS, with the in-app menu tip after 1.8 s if nothing opened. Origem shows it as landing /app under the app agents; Campanhas keeps attribution by source. server-traffic-check gains the redirect matrix (home, query, jogo=1, sala, deep route, open Chrome, preview bot, HEAD, foreign host) and the Vercel middleware 302 case; mutants "sem UA" and "loop jogo=1" die.
  • itch.io listing package: tools/portal/itch/index.html is a one-file HTML upload that embeds https://www.corosolto.com.br/?lang=en&utm_source=itch&utm_medium=portal in a full-viewport iframe (allow="pointer-lock; fullscreen; autoplay; gamepad"). itch serves uploads from html-classic.itch.zone inside .itch.io, and frame-ancestors checks every ancestor, so https://.itch.zone joins the CSP in vercel.json (only .itch.io was listed; the wrapper rendered a black frame). eval:portalembed (pr-fast + check:fast) ties each tools/portal/ wrapper to the CSP list, the site origin, the UTM and the pointer-lock permission, with 4 mutants. Publishing on itch stays with the owner (tools/portal/README.md).
  • /en is the English home the crawler can read: the real home (/) is the game and its published HTML is PT-only (the EN layer only exists after boot). /en carries title, description, FAQ (HOME_FAQ_EN), the links to every EN twin plus /docs/en/, a WebPage node pointing at the home's VideoGame, and the PLAY CTA at /?lang=en. Paired with / in src/lib/i18n-pairs.ts, so hreflang en + og:locale:alternate now appear on the home (index.astro, own <head>), /en is in the sitemap with home weight, in the AEO index and in llms.txt. Pinned by eval:game-pages (home → /en, /en → home, inLanguage, EN links, FAQ visible == JSON-LD; 4 new mutants), eval:seo and canonical-host-check now also read /en.
  • Lobby (Treta Pop): the bottom-left Resenha button is replaced by an Operação Flávio card in the same corner and height (owner request, 07/11). The card opens Flávio's story — parody with in-game character names only, PT/EN — over a real GPU capture of the boarding cinematic (npm run gen:lobby-flavio-arte → public/img/mode-announcements/flavio-embarque{,-card}.webp, URL with content hash via assetUrl; img/mode-announcements joins gen-asset-rev). JOGAR starts VS BOTS on operacao_flavio; FECHAR/Escape close and return focus to the card. The dialog reuses the mode-announcement <dialog> (abrirHistoria). The chat drawer keeps the Y shortcut (focus now returns to whoever opened it, and Y is ignored while a dialog is open); conversations stay under AMIGOS/Comunidade. At ≥1440 px wide and 800–1010 px tall the left column now stops above the corner: the news cover shrinks (chip hidden below 90 px) and the panel hides under 930 px — before, the Resenha button covered "VER NOVIDADES" at 1536×960. Rulers: lobby-flavio-check.mjs (node, eval:mode-announcements → check:fast/CI; mutants card-resenha, modal-sem-imagem, esc-sem-foco, jogar-mapa-errado, en-faltando) and lobby-flavio-browser.mjs (Chrome, 6 screens, eval:ui-v3:lobby-flavio, chained from eval:ui-v3:social); ui-v3-social SO2/SO3/SO7/SO11 follow the cutover (mutants botao-volta, vazio-sem-acao) and mark the opening announcements as seen.
  • Operação Flávio now has five connected escort routes, human-scale airport seating, additional solid cover and a route-facing first-person spawn.
  • Boarding lounge and apron protection now revolves around real airport objects (1.8 m planters, a container bay, GPUs, check-in counters) that hide the 1.72 m VIP and break attacker approach lanes; the nav graph stays one dead-end-free component. escortCoverPoints grows to 28 role/zone slots supporting 6×6 escorts (4 direct guards + 2 roamers), and attacker spawns or graph paths never funnel into the boarding lounge.
  • Operação Flávio side lanes (|x| 19–43) get real cover every ~10 m on both sides (owner playtest 08/11: "nas laterais não tem onde se proteger, muito fácil pro time E"): two parked apron buses outside the terminal and courtyard, ULDs and stacked cargo crates along the terminal sides, courtyard and the 120 m outer hangar corridor (staggered, no straight sightline from the apron to the courtyard), plus crate stacks inside the hangar. The six box-built tactical covers become crate stacks with the same height. The crate is a 12-triangle box with a baked atlas (tools/operacao-flavio-caixote-asset.mjs, CC0 Poly Haven source), instanced in one draw call; the scene stays at ~361k triangles (was 330k). Colliders are identical with or without GLB (headless server). Pinned by operacao-flavio-collider-check (4 new clauses) and 4 new collider mutants.
  • Gauntlet iteration from live captures: staggered real cover islands every ~8–12 m across the patio, hangar mouth and apron (baggage tugs, service cars, barriers, tool carts); boarding stairs tucked against the fuselage with a hard-cover service car at their base; both E approach lanes balanced (10×8 tall cover); the oversized foreground railing at the west E spawn removed; the queue belt split with a central gap; amber checkpoint rings as semantic route markings; distant ridges restore sky/aircraft contrast; the black terminal capture was an invalid vantage inside the new counter, now pinned by a waypoints-and-lighting contract. escortCoverPoints grows to 43 slots with ≥2 VIP cover slots within 8 m of every intermediate checkpoint.
  • Operação Flávio escorts now run as a role squad: four direct VIP guards carry exactly one LMG, one shotgun, one rifle and one sniper (armor + helmet every life, skill floor above the enemy average), and extra defenders become forward roamers holding the vanguard two checkpoints ahead — no wall-hacks, online authority unchanged.
  • Attacker respawns are forward/base-only: never behind the convoy, never inside the boarding lounge (south terminal pocket, x∈(-29,29) z∈(-57,-44) mirrored in map evals and docs), always ≥7 m from the VIP and route-reachable from the next checkpoint; defenders keep the rear wave.
  • Attackers actively contest the escort, while VIP always carries armor, a helmet and a working PT-38.
  • Escort recovery includes physical path replanning, stable formation slots and online-authoritative respawn waves.

Changed

  • Preview de PR não gasta mais Vercel: scripts/ci/vercel-ignore.sh sai 0 para toda branch de PR (o preview é o .workers.dev do cf-preview.yml); staging, main, lote- e /lote- continuam buildando sempre e produção segue só no chore(release):. A régua eval:vercelignore foi reescrita para o contrato novo (mutantes preview-pr-builda, staging-pulado, release-pulado). preview-build.yml passou a workflow_dispatch (input pr_number, emergência); preview-deploy.yml segue em workflow_run publicando --prebuilt só quando alguém despacha o build — nenhum PR dispara mais esse par. A PRV1 do workflow_security_check.py proíbe o build de voltar a disparar sozinho por pull_request/push/schedule (mutante novo compila-volta-pr) e mantém a proibição de secrets.; DG3/DG6 e o concurrency-check prendem o par como estava; o bot do preview-bot.yml e o label preview-autorizado não prometem mais URL da Vercel. Fatura esperada: Build CPU Minutes ≈ builds de release + staging/main/lote (~3/semana); Fast Origin Transfer só muda na virada (fase 4).
  • Bloqueios do release #1251: respostas do smoke passam a ser classificadas pelo hostname antes da lista de terceiros, impedindo que /img/facebook-* ou ?origem=twitter.com esconda 404/500 do próprio host; eval:cfparidade só aceita mutante com exit 1; eval:bots-perf entra em operacao-flavio-comportamento e a prova browser fica no Chrome com GPU real, pois o runner portao-controles usa SwiftShader (degraded=true, 3,5 s/quadro), sem novos jobs nem falsa cobertura de GPU. cf-preview.yml compila o PR via pull_request sem segredos e entrega somente o artefato; cf-preview-deploy.yml reage ao workflow_run, carrega a configuração do branch base e publica com Wrangler pinado, sem executar código do PR com tokens Cloudflare/GitHub. Sticky e smoke exigem github-actions[bot] e SHA+URL no mesmo comentário; tools/cf/ passa a disparar preview e o job skip declara runs-on: ubuntu-latest para o workflow voltar a iniciar.
  • Compartilhamento: links de convite, perfil, clã e botões sociais usam https://corosol.to com seus UTMs; canonical, og:url, hreflang, sitemap e JSON-LD continuam em https://www.corosolto.com.br. A régua eval:shareorigin mede o build e morde duas mutações.
  • Pre-push and CI gates stop burning an hour per push on staging branches. selecao-pre-push.mjs now diffs a new branch against the nearest of origin/main and origin/staging (a branch cut from staging was compared with main and dragged 691 files into the diff, forcing the full check:deploy); .agents/, .claude/, plans/, launch-media/ and any .md select only core; src/lib/server-traffic.mjs and its check select network; tests/eval-suites.test.mjs is transversal like the selector. smoke-cf (Cloudflare preview, #1271) failed on language because the GitHub runner sits in the US and cf-ipcountry=US turns the home into EN while the specs assert PT copy: playwright.smoke.config.mjs seeds cs_lang=pt through storageState (and chat-sala.spec.js on its own page), proven against a forged US geo. scripts/ci/cf_preview_comment.py gains --selftest (FX2) with the comment choice extracted into a pure escolher. privacy-runtime.js header comment back within the 2-line cap.
  • CI dos contratos visuais: os 17 comandos passam a seis jobs paralelos (contratos-visuais-personagens-camera, contratos-visuais-ferro-balcao, contratos-visuais-mapas-materiais, contratos-visuais-visual-map, contratos-visuais-campo-uv, contratos-visuais-gameplay-grafite), cada um com JSON e timeout próprios. eval:portaointeiro cobre os aliases na ordem dos shards, rejeita perda/duplicata e preserva a duplicação já contratual de eval:movimento-fluidez entre AK/mantle. Personagens/câmera usa três shards balanceados pelo manifesto diário: produtor e consumidor compartilham a chave eval-durations-v1-<hash do conteúdo> e o prefixo estável eval-durations-v1-; manifesto ausente, vencido ou inválido reprova o runner, sem retorno silencioso à execução completa.
  • Equipamento TP: eval:tp-cosmetic-source sai de equipamento-tp-corpo para equipamento-tp-origem, sem criar jobs ou alterar aliases. Na run 42665557931, corpo tinha 422,4 s (identity 321,5 + cosmetic 100,9) e origem 294,8 s; a distribuição projeta ~321,5 s e ~395,7 s, reduzindo o maior job sem perder cobertura. PI4 agora prende os quatro aliases a esses dois jobs e rejeita perda/duplicação; npm ci ganha id: deps e guarda nos dois jobs, impedindo execução após setup falho.
  • Operação Flávio: o alias público eval:operacao-flavio continua sequencial, agora composto por core, collider completo, menu, online, integracao, comportamento e escolta; no CI os 50 mutantes de collider são divididos em quatro shards disjuntos (13/13/13/12), com todos esses cenários em jobs próprios e o build agregando todos. O seletor real falha fechado, expõe o plano JSON e tem união, ordem e interseção vazia verificadas; a cobertura de reset/duração/relógio/permissões/NPC/anúncios permanece no CI. Integração reúne formulário, prova de integração, recuperação e pressão; comportamento reúne roles e cobertura; escolta reúne flicker, VIP e pickups.
  • Pre-push: package.json alterado é comparado semanticamente entre os blobs do range; mudanças em scripts de check:fast/check:deploy executam só o núcleo e os passos afetados. Workflows com mapa estático validado seguem a mesma seleção; locks, dependências, metadados, agregadores, remoções, scripts desconhecidos e diffs indisponíveis continuam forçando check:deploy.
  • Lobby (Treta Pop), owner request 08/11: Operação Flávio becomes the first panel of the left column, above the Javaporco hunt, with the same full-art design (montarPainelFlavio in public/js/tp/flavio.js; the bottom-left corner card, its mini art flavio-embarque-card.webp and the footer offset are gone). Quests da Treta and Novidades de skins move under Amigos online in the right column; where that column is hidden (height ≤ 799 px) Quests returns to the left column instead of disappearing, and a right-column panel that would reach the match panel is dropped bottom-up (encaixarDireita). On landscape phones both promos stay top-left as compact one-line rows. Pinned by eval:ui-v3:lobby-flavio (LFB1 order above the invasion in 6 screens, new LFB6 columns; mutants card-depois, quests-esquerda) and lobby-flavio-check.mjs.
  • Vercel costs, phase 0 (owner decision 09/11, runbook docs/runbooks/MIGRACAO-CLOUDFLARE.md): Git-integration previews only build when the range since the branch's last deploy (VERCEL_GIT_PREVIOUS_SHA..HEAD) touches something the site serves (src/, public/, vercel.json, package*.json, astro.config.mjs, middleware.js, fetch/build scripts, tools/audio/, CHANGELOG.md); staging, main and lote-* always build, a missing or out-of-clone previous SHA builds, production is unchanged. Pinned by eval:vercelignore (real git repo, 3 mutants) in pr-fast. The audio/decals zips and every viewmodel asset are cached in node_modules/.cache/csb-packs/ between Vercel builds (keyed by sha + URL; no-op locally). middleware.js and /api/[rota] log each ingest/X-conversion failure once per instance and cause instead of once per request.
  • Usage measurement is now on by default (owner decision, 09/11, legitimate interest): privacy-runtime.js allowed() returns true unless an explicit refusal is stored in cs_privacy; corrupt or old-version storage counts as "no choice". Since the 13/10 opt-in (c74421f10) the analytics checkbox only existed inside the account dialog, which never opens for anonymous players, so identified telemetry collapsed from 50 to 60 browsers/day down to 1 to 4 while count_hourly still saw 100 to 1000 game_loaded/day (08/11: 1046 loads, 125 SP match starts, 2 browsers in player_daily). The admin's Fiéis/Geografia/Funil/Usuários read only the consented tables and were showing about 0.2% of real players. What travels is the same local UUID (cs_anon), no IP and no e-mail; refusal still wipes cs_acq/cs_ops_last/cs_session/cs_invite_landing and keeps Vercel Analytics off. The entry/hub checkbox now starts checked and reads "Vem ligado; desmarque para parar", /privacidade §2 and §5 describe the default and the refusal path. privacy-choice-check proves default allow, refusal wins and withdrawal purge (mutants ignore-refusal, keep-optional-storage-on-refusal, vercel-continue-after-withdraw); privacy-ops-check boots ops.js under a stored refusal (mutant ops-ignore-refusal) and under no choice; login-prompt-check LP8 expects events unless refused.
  • CI and local test orchestration no longer requires the full 116-step deploy suite on every push. check:prepush runs core plus lightweight contracts for the files changed and falls back to the full suite for unknown or transversal changes; measured runs finished documentation in 46.8 s and a map change in 73.9 s, versus 1455 s for the previous full hook. check:fast and check:deploy now expand tools/eval/suites.mjs, with all original 338 and 116 steps preserved token-for-token and order-checked, plus eval:portalembed from staging. The CI keeps its complete independent lists.
  • Invariants now run in source, VM, bots, characters/materials and four map shards. INVARIANTES_FAMILIA and map-check selectors reject unknown IDs before starting simulations, preserve each freshReport producer with its consumers and keep bots, mount and recoil execution in one shard. Equipment and Sertão are split by existing command/check IDs, with no duplicated scenario and no quality split.
  • Every runner execution writes a timing JSON artifact with per-step status, duration and final exit. --jobs=2 is available only for the core suite as an explicit opt-in; the pre-push stays sequential after local CPU-contention measurements.
  • Edge traffic count (src/lib/server-traffic.mjs) now names in-app browsers: TikTok (musical_ly/BytedanceWebview/TikTok), Instagram, Facebook (FBAN/FBAV/FB_IAB), LinkedIn (LinkedInApp) and X (TwitterAndroid/Twitter for iPhone) stay kind: browser (they are people) with agent: app/<name>; open browsers keep the empty agent. Reason: the 08/11 TikTok paid campaign sent 517 visits in one hour, 72% loaded the game and 85% left in under a minute without entering, and the admin had no way to tell them from Chrome. server-traffic-check.mjs gains the five UA cases plus the open-Chrome and facebookexternalhit counter-cases, and is finally wired as eval:servertraffic inside check:fast (it had no script since #988).

Fixed

  • CI: os consumidores de ferro-balcao e boot-mutant-verdict reconhecem o exit 78 da taxonomia atual como medição inválida, em vez de esperar o exit 3 antigo e derrubar todo pr-fast.
  • O hook local de pre-push mantém o seletor check:prepush, check:deploy usa a suíte única do runner e o manifest declara o adapter Cloudflare/Wrangler exigidos pelos gates.
  • tools/rig-from-donor.mjs now fits the elbow and wrist joints to the mesh instead of copying the mst skeleton verbatim. On the Creepypasta Season Mint meshes the arm ran ~10 cm above the donor joint line and the forearm bent forward, leaving the hand flesh far from LeftHand/RightHand (capitao-caveira: 23 cm); proximity weights then split the hand across Arm/ForeArm/Hand and the clips rotated it around a pivot outside the flesh, so both hands rendered as flat stretched shards (capitao-caveira: hand edges stretching 86× in walkfire, 36× in death). The fit moves only translations (donor rest rotations stay, so retarget-glb and the shared clips still apply) and recomputes the IBM of the moved subtree only; AJUSTE_JUNTAS=0 reproduces the old output byte for byte. 12/37 of the batch failed before; after, the 34 meshes with hand flesh are ≤ 1.6×, and the 3 short-armed mascots (no flesh at the wrist) are reported as not measurable and still tear with the human skeleton. Roster GLBs in public/ were not re-rigged. Guarded by eval:rigmaos (CPU skinning with the 11 shared clips over a synthetic mesh with the pilot's offsets; mutants transplante-cru, ibm-velha), in CI and check:fast.
  • A régua RM4 deixa de manter exceções privadas: os sete GLBs legados acima de 2,5× ficam vinculados ao advisory RIG_RM4_LEGACY_20261108, registrado no ratchet comum tools/eval/KNOWN-RED.json com plano #1124 e tetos presos à melhor medição aceita. Qualquer melhora obriga a baixar o teto, chegar ao limite normal remove a exceção, e uma regressão posterior volta a reprovar; modelos sem aresta pesada são reportados como não mensuráveis, sem mascarar falhas mensuráveis nem contá-los como aprovados. Os binários públicos e seus manifestos de identidade permanecem intactos.
  • O parser de justificativas do ratchet aceita because além de porque, mantendo o corpo dos PRs compatível com o gate English sem perder a exigência de motivo explícito.
  • Deep-link into a match (?sala=, ?auto=) no longer opens mute: Sfx.ensure() called resume() outside a user gesture, the promise rejected silently and the context stayed suspended until some later sound happened inside a gesture. _resume() handles the rejection and unlockOnGesture() (capturing pointerdown/keydown) resumes on the first gesture and unbinds itself; main.js arms it right after creating the Sfx. Pinned by eval:audiounlock (UNL1–4; mutants sem-destrave, gesto-vazio).
  • The Werewolf's growls stay with the Werewolf: _voicePool drops the in-game takes of speechless characters (SFX_ONLY_VOICE_IDS) from the generic faction pool, so Caipora (no voice yet) and sfx.voice('M') stop inheriting howls once the private manifest structures characterVoice.lobisomem.kill. VOZ10 + mutant lobo-no-pool in eval:mp-voz-personagem.
  • Gates that had fallen behind the game: audio-voice-mix-check MIX11 re-anchored on the MP per-character routing (the old chain only exists in single-player), MIX15 on the 5-track menu selection of 04/10, three surviving mutants re-anchored and MIX9d added (own take beats the pool in a faction without rollback); netcode-check fixture gained protocolVersion: 8 (the whole gate died with protocolo_incompativel); character-voice-contract-check reports local-only specs//plans/ as NOTA instead of failing outside the owner's machine and VOICE5 reads the real installer (fab-game-local.mjs).
  • .githooks/pre-push now serializes itself per machine (atomic mkdir lock with owner pid, stale lock reclaimed, 40 min max wait): three concurrent check:deploy runs pushed the load to 76 and none finished within 30 min.
  • Production crash recovery: the match result no longer treats every objective as Javaporcos territory (Operação Flávio has no regras.times); map downloads retry once after transient module-network failures and failed map promises can be attempted again; optional Javaporcos audio retries its fetch without escalating the fallback to console.error; menu scenery failures release the splash instead of aborting boot; and main.js/site-links.js no longer require top-level await, restoring module parsing on Safari 14-era WebViews.
  • Browsers and embedded WebViews that disallow WebAssembly now keep the Meshopt decoder rejection inside the existing compressed-model fallback instead of emitting an actionable global WebAssembly.instantiate() rejection.
  • Slow menu scenery no longer turns the 20-second splash failsafe into boot-watchdog: the accepted entry gesture releases module sequencing while the optional 3D arena continues loading, and the watchdog recognizes that handoff without masking a genuinely unresponsive boot.
  • Revisão atual do release #1251: o artefato do PR é extraído em dist, isolado do checkout confiável usado por Wrangler e pelo comentário sticky; o smoke Cloudflare por workflow_dispatch não consulta mais sticky de PR e falha imediatamente se BASE_URL estiver vazio. WFS cobre os três caminhos com mutantes; E05 ganhou DOM completo e timeout, confirmando que o retry de guest_invalid termina sem alterar o login.
  • Pre-push no longer falls back to the full check:deploy when a change touches the two edge entry points: middleware.js (Vercel proxy root) and src/middleware.ts (Workers) now select core + network in selecao-pre-push.mjs (the landing PR #1291 burned a full local run because of this). Covered by a new case in eval-suites.test.mjs.
  • Online drops with network ID 0 work end to end (finding by estraga-codigo on #1291, minor). Server event IDs are uint32 and 0 is valid, but three checks used truthiness: pedirPick on a network drop with _nid === 0 fell through to the spawn-rack path (pickupWeapon) and the server got the wrong request; limparDropsDeRede never removed it on round reset; and _pickPendente = 0 doubled as the "nothing pending" sentinel, so an input carrying pick: 0 was omitted from sendInput. The sentinel is now null (set in the constructor), every check is != null, and net-event-id-check grows the drop lifecycle clause (drop 0/1/0xffffffff spawns, gone removes it, round reset removes it, pick: 0 reaches sendInput and is consumed) plus the rack counter-case; the truthiness mutant dies. eval:netcode fails on virgin staging with protocolo_incompativel (protocol v8 bump in flight by another lane) and is not affected by this change.
  • Revisão do release #1251: origemCompartilhamento só usa corosol.to no apex ou em subdomínios com fronteira (*.corosolto.com.br), sem desviar hosts como evilcorosolto.com.br; o middleware Astro devolve next() na Vercel, cujo proxy já conta a requisição, e só agenda /api/server-traffic no Workers. Regressões comportamentais cobrem apex/subdomínio/host estranho e os dois adaptadores; eval:shareorigin ganha o mutante sem fronteira e os builds Vercel/Cloudflare passam. UIR20 deixa de prender a forma new Set de geo.ts e chama langFromCountry para verificar US/GB → en e PT/BR/ausente → pt.
  • Social login no longer gets stuck on guest_invalid when the browser holds a stale guest proof. Google, other OAuth providers and email now retry automatically without the invalid proof, preserving local history and never accepting it as valid; subsequent clicks do not resend it, and each provider gets one retry and navigation. Covered by LP15/E05 and both recovery mutants.
  • Social login no longer gets stuck on guest_invalid when the browser holds a stale guest proof. Google, other OAuth providers and email now retry automatically without the invalid proof, preserving local history and never accepting it as valid; subsequent clicks do not resend it, and each provider gets one retry and navigation. Covered by LP15/E05 and both recovery mutants.
  • Multiplayer character voices belong to the character again (owner, 09/11: Saci and other absent characters shouting in a Lampião room). Sfx.characterVoice now resolves take of the event → another in-game take of the SAME character (kill/radio/round) → faction pool only for characters without structured in-game voice; the legacy string form (select-only) keeps the pool. The live pack stored every Mítico as that string with all 56 kill takes mixed in voice.M, so any Mítico kill picked any Mítico: tools/audio/miticos-character-voice-apply.mjs + miticos-voice-map.json (pool M identified offline by transcription + voice pitch band) restructure the 9 Míticos as {select, kill} with captions, zero new bytes, pool untouched — the owner applies it to the private manifest. Pinned by eval:mp-voz-personagem (VOZ1–6, mutant pool-da-faccao).
  • Bot radio callouts reach the multiplayer: the dedicated node died in _botCall at the DOM check, so the snapshot voice channel (room.js/netcodec v5+) was never filled and the online team was mute while single-player had "Contato!". The node now marks _voiceSnap='radio' with the same 5 s global cooldown and each client applies the single-player rule in NetGame.voice (≤55 m from you, enemies speak less, line in the radio log). Headless room A/B over 90 s: 10 radio events vs 0 on main. Pinned by VOZ7–9 (mutant rede-muda). Needs a backend image with this client ref to reach production.
  • The match loading wall shows the character you picked when the lot has its art (the 9 Míticos: LOADING_WALL_BY_CHAR), instead of the random rotation that showed Maria Bonita for a ?personagem=lampiao start; map art (javaporcos) still wins, other characters keep rotating. javaporcos-wallpaper-check anchor updated.
  • The v3 multiplayer lobby keeps CRIAR SALA PRIVADA, quick play and private-room options visible when /api/geo-lang resolves after tp/servidores.js mounts. The legacy hub bootstrap no longer moves those controls back into hidden markup; SV20 forces this module order and clicks the visible private-room action.
  • UI eval fixtures now pass the real Javaporcos map predicate into the rounds callback, exclude the recording action from the account-button count and drop the stale funnel forwarding assertion. The rounds, hub identity and login-prompt checks pass again without changing game behavior.
  • Offline matches no longer stutter as the bot count grows past 4 (owner report, 08/11). Measured in Chrome with GPU and 4× CPU throttling, Operação Flávio with 12 bots went from p50 333 / p95 533 ms per frame to 33 / 50 ms, and 8 bots from p95 317 to 33 ms. Causes, from CPU and allocation profiles: on Flávio every defender re-raycast the VIP's line of sight against every attacker each frame, through all 321k occluder triangles (66% of CPU); _collide scanned every collider (1403 on Amazônia) dozens of times per bot per frame and produced 102 MB/s of garbage; three.js rebuilt program keys 60-130 times per frame (shared shadow depth material flipping skinning per character, two-pass transparent halos and contact shadows, post passes that hid the lights); every gunshot and footstep allocated a new noise AudioBuffer. Fixes: exact per-step memo of the VIP LOS, first-hit LOS exit, an XZ collider grid, the static raycast index on every plain occluder, a shared skinned depth material, single-pass ground planes, lights on every pass layer and pooled noise buffers. Program lookups per frame dropped to 2-16, and 12-bot allocation fell from 127 to 20 MB/s on Amazônia. The simulation is unchanged: the match hash is identical with and without each fix on five maps, and the halo/contact-shadow frame is bit-identical. Pinned by eval:bots-perf (node: LOS per bot, colliders visited, triangles per ray, same hash; 3 mutants) and eval:bots-perf:browser (Chrome, Flávio 12 bots, CPU 4×: p95 ≤ 100 ms and ≤ 40 program lookups per frame; mutants ia-antiga and render-antigo).
  • Operação Flávio: weapons dropped by dead enemies or allies can be picked up again (E / mobile PEGAR). The escort (VIP + role guards/roamers) no longer collects drops by walking over them — its tight formation took 80–94% of death drops within 1 s, before the player could reach them, and swapped the guards' role weapons. Attackers keep the generic walk-over pickup of every map; the dedicated node runs the same _updatePickups, so online stays server-authoritative. Guarded by eval:operacao-flavio-pickup (4 mutants), wired into eval:operacao-flavio.
  • Multiplayer map transitions now build the mantle collider index before sampling walkable cells instead of testing every collider per cell. In local start probes, _mantleAlcance fell from 308→28 ms at Praça dos Três Poderes, 195→14 ms at Escadão and 397→22 ms at Quebrada; movement, spawn and mantle suites remain the behavioral gate.
  • The legacy multiplayer lobby now labels the one-click invite-room action CRIAR SALA PRIVADA instead of the ambiguous JOGAR COM AMIGOS. The v3 label and the create/connect behavior stay unchanged, so logged-in players can find the same action in either UI.
  • The release train no longer waits up to 25 min for pr-fast to re-run on the main push of a lote merge (and no longer stays in the station when that run is slow): embarque accepts the head at once when it is a 2-parent merge whose tree equals parent 2 and ci.yml already finished success on parent 2 (the lote PR run); any other case falls back to waiting for the push run. bump-tag-release applies the same verde_por_lote check before pr_fast_verde when main moves, so only green SHAs are published (RLS17). Pinned by RLS18 in eval:release (real verde step with fake gh/sleep, 11 scenarios; mutants lote-sem-arvore, lote-sem-ci, lote-desligado).
  • The X conversion pixel (live in production from a branch deploy) joins the release line with its base code fixed: insertBefore(s,a) passed the twq function instead of the <script> element and threw on every boot (ops-diag #1231). Guarded by eval:xpixel, which runs the real snippet from both pages, with the insere-funcao mutant (CI and check:fast).
  • prod-watch no longer fails every scheduled run when CF_API_TOKEN can't see the corosolto.com.br zone: the Cloudflare purge is best-effort (continue-on-error plus guarded parse), emits a ::warning pointing at the token scopes (Zone:Read + Cache Purge) or the new CF_ZONE_NAME repository variable, also warns on success:false purges, and the edge-coherence probe still runs — no more false prod-crash incidents. Pinned by eval:wfpurge (fake-curl runs of the real step, 3 mutants), wired into pr-fast.
  • No code requests a missing /img/chars-hero/<id>.webp anymore (ops-diag #1231, julia-zanatta 404 at boot): public/js/data/retratos.js is the single source of which ids have hero (45) and model-cutout (54) art, and retratoFontes/heroUrl feed the lobby preview, HUD, loading VS, modes, profile, invite card and bot ranking avatars. The 18 hero-less characters fall back to the cutout/bust that exists. Pinned by eval:retratohero (sets == disk both ways, real portraitUrl/fallback for all 63 ids, no hand-built hero URL; 3 mutants).
  • Dedicated online escort simulation, round lifecycle, match-end statistics, online objective reset and horde round-end audio.
  • A dedicated online spectator is now distinct from the authoritative escort server (net.espectador): spectators apply objective snapshots and keep presentation, but never decide the winner, schedule respawn waves or run the VIP controller; authoritative guard armor remains scoped to VIP/escort roles instead of every dedicated entity.
  • Prop rotation, aircraft collision, boarding navigation, low-profile solid-cover shadows and recovery firing/movement regressions.
  • Flávio now hides for real: threatened or unescorted, the VIP seeks exported map cover slots (escortCoverPoints — sticky choice with margin + minimum dwell, never closer to the threat, immediate switch only for a glued threat or a much safer slot), crouches behind the solid object and only resumes when the escort recovers; engaged guards snap to conflict-zone guard cover without sharing points, roamers keep pressuring their lane and converge on contact. Line of sight remains the only acquisition path — no attacker wall-hack, no VIP invisibility.
  • Shelter threat focus is now LOS-gated end to end: a hidden attacker behind a wall never moves the VIP's cover, heading or resume decisions — after losing sight, only a short memory of the last SEEN position (snapshot) applies. No authoritative-information leaks from the escort mode.
  • Formation and cover routing follow the same rule: threats the VIP cannot see never engage the formation, pull roamers off their lane or reserve guard cover — attackers remain visible only through genuine line of sight, with a short seen-recently memory so marching sightline gaps don't re-trigger engagements.
  • Escort timeout now derives the round winner from the objective when one exists (objective.state.winner) and keeps attackers as the fallback; a fixed-E mutation is caught by the duration ruler.
  • Hangar lane stripes now sit at y=0.13, above the 0.10 m hangar slab, preventing z-fighting/hidden markings; the collider ruler catches a faixa-afunda mutation.
  • The real Chromium escort scenario now runs in check:deploy through a self-hosted local server; the VIP is exempt from generic bot depenetration so converging guards cannot shove Flávio out of real cover.
  • Local dev now proxies /private-assets/ viewmodel products in DEV only, so localhost loads the real authored weapons and hands instead of the legacy fallback; the escort browser gate fails on any private-viewmodel 404.
  • Right-click on an unlocked game canvas now requests pointer lock and engages ADS as soon as the lock succeeds; releasing the button before lock cancels the pending aim, covered by sem-ads-lock and cancela-mouseup mutants.
  • Attacker respawns are fixed at the four E apron bases near the aircraft (-33,54, -28,56, 33,54, 30,56) with yaw 0 facing the convoy — no mobile forward spawns — while escort roamers follow the west/east service lanes through the hangar and then keep lateral offset on the central checkpoint.
  • Escort formation stays smooth with the fixed E base and denser apron: stable guards reroute every 0.37 s, pocketed guards keep the 0.28 s escape cadence and the direct-escape hold rises to 0.75 s; all four flicker scenarios and mutants stay green.
  • The boarding apron gains render-only ground operation: ten safety cones, four wheel chocks, tire marks, oil stains and asphalt patches, service valves/cables, two baggage carts with 14 bags, a translucent perimeter fence, distant north hangars, a windsock and an off-play-area fuel truck — all collision-free. The factory M92 framing is retuned to 1.01× AK with centered ADS and passes all image rulers.
  • The unpainted PT-38 serves the factory X18 chassis again (fab#pistol, owner decision 06/11): the public golden pilot showed the back of the slide with blob hands. The golden (gold#pistol) now appears only with the gold paint or ?vmgolden=pistol. Local DEV already proxies /private-assets/, so localhost no longer falls back to the legacy pistol. The X18 measures 0.99× with a green magazine in 3:2 and 16:9. Guarded by pistol-golden-no-lancamento (VL8) and golden-no-lancamento (golden-skin-selection), and the hand-rig debt moved to the paint route.
  • The first switch to the secondary no longer flashes the legacy viewmodel before the authored one: the game now builds the primary and secondary authored packages hidden in the background (prime, ?vmprime=0 disables it). The real-browser ruler eval:vm-troca-sem-legado saw 4 legacy frames on the first switch without prime and 0 with it; it runs in check:deploy, with the sem-prime mutant.
  • The boot budget proxy now isolates the externally injected X/Twitter ad snippet from public HTML before measurement and reports thirdPartyScriptsStripped; any game script or page error still fails the gate, and a dedicated no-removal mutant catches regression. Production HTML itself still needs the malformed third-party snippet repaired or removed by the owner.
  • CI: the former reguas-e-site serial queue is split into parallel reguas-e-site and mapas-e-site jobs after measured cancellations at 30m16s (run 42009772988) and 35m18s (run 42016661426), both without a red verdict. Every step moved intact; the build job now requires both. The online escort suite is single-sourced through eval:operacao-flavio, with a suite-duplicada mutant guarding the gate list.
  • The golden PT-38 used by the paint route is no longer giant: the pilot camera (34°) rendered it at 1.99× the approved pistol. VM_WEAPON.pistol.goldFrame reframes only the gold# route (60°, pilot units) to 1.05×. The image scoreboard hashes the pistol again (the previous exclusion kept a stale 0.99× green), guarded by a quadro-pistola mutant, and the magazine ruler knows the pilot's L_*/R_* hand rig.
  • The escort HUD no longer reveals tactics to either team: it shows only checkpoint progress and the timer (no escort count, contested or cover state), with a hud-anuncia-escolta mutant. The server-recovery suite now requires its green base before mutants; the client-respawn clause was red since the spectator split and is aligned with the server-owned respawn.
  • Picking Zero Um (senador) on side B offline now makes the player the VIP: there is no duplicate senador bot, escort state follows the player, a player VIP death ends the round for E without respawn, and boarding works without auto-movement. Online rosters stay server-owned. Covered by operacao-flavio-vip-jogador-check with 13 mutants.
  • Flávio's team now rushes instead of waiting. Each round picks one of three deterministic VIP routes (middle/west/east, from roundNum, no wire change). The VIP keeps moving under visible threat with two or more guards and boards while escorted even if contested. Guards intercept up to 2 m ahead, and flankers act as decoys on three or more lanes, starting opposite the VIP. A guard formation hold no longer crashes _updateBot after the VIP dies.
  • Map props now render at real scale next to 1.72 m characters, with colliders equal to the render: service car, baggage tractor, ground power unit, scanner, maintenance station, containers, tool cart, light tower, check-in counters, planters and Jersey barrier walls (the boarding stairs are real scale too, but walkable instead of solid). Standing VIP concealment comes from genuinely tall props, with the cover balance kept at 10×8. Guarded by carro-gigante, carro-eixo-trocado, balcao-gigante, jardineira-render-baixo and kit-barreira-no-patio.
  • Flávio can board again. The boarding stairs moved to the aircraft's east side at the cinematic door (z 52): the real GLB platform (native -z) touches the door and the steps descend outward. The aircraft GLB is mirrored in x so its painted door faces the stairs, and all three routes reach the foot, (6.2, 52). Before, the stairs sat on the west side with the platform facing away, and the final checkpoint was on the other side of the fuselage. Guarded by escada-invertida, escada-longe-da-porta and aviao-sem-espelho.
  • Flávio's stairs are walkable ("a escada está bloqueada"). The stairs lost their solid box: groundHeightAt follows the treads measured from the GLB, up to a platform at the door sill (1.57 m; stairs height 2.22 m), and every step stays below the 0.55 m STEP_H. All routes end at the foot, (6.2, 52), then the platform, (2.3, 52). The nav graph climbs through three axis nodes, the stairs footprint blocks side shortcuts, attackers can climb too, and flankers hold their vanguard at the foot. Guarded by escada-solida, escada-plana, escada-degrau-alto, escada-sem-nav and vanguarda-sobe-escada.
  • Boarding is automatic ("tinha que ser automático"): B wins on the frame Flávio enters the stairs zone (escortBoardingZone, a 1 m capsule along foot → platform), with or without escort and even when contested, for the bot VIP and the player VIP, offline and on the authoritative server. The 3 s BOARDING_TIME hold, the 0.45 m platform radius and boardedFor are gone; a guard crouched on the platform no longer blocks the win, and guard/flanker destinations never land on the stairs footprint (attackers may still climb). Guarded by embarque-so-no-topo, guarda-na-escada, embarque-jogador-nunca, embarque-jogador-so-no-topo, embarque-jogador-so-livre, embarque-exige-escolta and embarque-exige-limpo.
  • Players can walk all the way around the aircraft ("a parte em volta de trás da aeronave não é acessível"). The north bound moved from z 57 to z 64 (tail end); the plane colliders follow the GLB mesh at body height instead of the old 3.4 × 12 m fuselage and 16 × 3.2 m wing boxes (invisible walls past the wingtips); the service car moved to (-8.6, 54.5) to clear the west wingtip; the barrier-kit scenery moved to z 70; and a 12-point aircraftRing joins the nav graph. The west route now passes south of the ULD stack (-1, 44.6), because the real nose sits flush against it. Guarded by aircraft-ring-walkable-and-faithful-colliders with asa-larga, fuselagem-larga, limite-norte-antigo, carro-na-asa and anel-fora-do-grafo.
  • A render-only "EMBARQUE DO FLÁVIO ▼" billboard now marks the door for both teams. It is anchored at the arrow tip just above the door, has no collider/occluder/raycast, and hides during the boarding cinematic. Guarded by placa-sem-seta, placa-oclusora, the browser gate's arrow-pixel probe and the placa-boiando timeline scenario. The amber checkpoint floor rings that read as unexplained circles in the boarding lounge are gone (anel-no-lounge mutant); the blue ring under allies is the pre-existing global team halo (_makeTeamMark, ?teammark=0).
  • A B boarding win now reads "FLÁVIO FUGIU PROS EUA" in the round result and in the cinematic HUD (offline and online), guarded by the titulo-antigo and hud-antigo mutants.
vNão · lançado — 2026-10-19#

Adicionado

  • Added an offline Studio asset-pack verifier and immutable local installer with schema, safe-path, byte-size, SHA-256 and executable-content checks, real failure fixtures, and an explicit future runtime promotion contract. No Studio pack is enabled in the runtime.
  • Dá para dançar no meio da partida: a tecla T abre uma roda com os oito passos, a câmera se afasta para você se ver dançando e qualquer passo cai no instante em que você anda, atira ou morre.
  • O modo Vira-Casaca entra na seleção local: cada abate converte o adversário para o seu lado e a partida termina quando um time domina o elenco inteiro.
  • O personagem agora dança no lobby: oito passos brasileiros — passinho, samba no pé, ginga, frevo, dois pra lá, quadradinho, sarrada no ar e um salve — direto na tela de escolha, sem baixar nada a mais para quem não pedir.
  • Quem joga pelo aplicativo passa a ver aviso de manutenção e, quando houver, o caminho alternativo para continuar jogando, sem precisar esperar uma atualização na loja.
  • O jogo agora sabe se testar sozinho no celular: uma partida curta automática mede desempenho, travadas e erros no próprio aparelho, para o problema aparecer antes do jogador reclamar.
  • O mapa ao vivo mostra cidades, partidas e rounds por agregado geográfico, sem publicar nick, jogador, IP ou posição individual.
  • Visitantes que concluem uma partida multiplayer podem vincular a recompensa TRETA$ ao entrar na conta. O pagamento usa o resultado confirmado pelo nó e aceita o vínculo uma vez.
  • Mudanças de nível exibem uma chamada visual com som. O ranking ganhou filtro por Time E e Time B.

Alterado

  • O ranking público usa somente partidas verificadas e aceita exclusões auditadas. A atividade pública respeita a configuração do perfil, e a lista de amigos separa quem está online agora.
  • O multiplayer envia os abates da rodada por time no protocolo v6. O placar usa a foto social do jogador e mantém o retrato certo quando uma célula é reutilizada.
  • Atualização do jogo não baixa de novo o que não mudou. Cada modelo, animação e som agora é identificado pelo próprio conteúdo, então só o que foi realmente alterado desce outra vez — no celular e no aplicativo isso corta centenas de MB por atualização, e quem já jogou entra direto.
  • As telas de carregamento agora mostram o elenco inteiro: os 19 personagens entram em tela cheia, cada um com a sua arte e a marca CORO SOLTO no canto, no lugar do lote antigo de seis.

Corrigido

  • A Piscina deixa de repetir grafites ou pintá-los sobre a faixa azul; armários não engolem a câmera, e armas estáticas deixam os mapas com a loja ligada. Esquerdomacho segura pistola e faca sem disputar duas poses, recebe colete proporcional, e a AK volta ao tamanho certo em primeira pessoa. O menu de compra ocupa a tela, B fica exclusivo da loja, N troca a câmera, o saldo vai para a direita, a janela de compra fica mais longa e vírgula/ponto compram munição extra.
  • O modo Treta Pop deixa de importar diretamente o catálogo de mapas para detectar Javaporcos; a informação vem da API do menu, evitando erro fatal quando o navegador mistura módulos de releases diferentes.
  • O wallpaper de espera dos Javaporcos agora leva revisão na URL; evita que a CDN mantenha o 404 antigo do asset recém-publicado.
  • A matriz gerada do arsenal acompanha as linhas atuais de game.js, mantendo o gate de consistência do CI verde.
  • O gate de processos CPU do Treta Pop ganha teto de 30 minutos; o runner cancelava antes de executar tp-glove-origin em máquina fria.
  • A arma equipada volta a aparecer no celular. Se o modelo animado ainda estiver carregando ou falhar, uma arma alternativa continua visível também no desktop.
  • Canarinho e suas três skins deixam de carregar uma cauda maior que quase metade do corpo. A pistola fica à frente do tronco, com cotovelo dobrado e montagem recalculada depois da pose de uma mão.
  • A contagem diária de visitantes cobre todas as páginas públicas. Antes, só a entrada do jogo emitia a visita e deixava de fora quem chegava por conteúdo, perfil ou documento legal.
  • Perfis públicos continuam visíveis quando o bootstrap da conta falha ou a sessão expira. Links do ranking usam o handle público, o histórico do navegador restaura a lista, e perfis sem totais aparecem com zero.
  • O contador online voltou ao topo em desktop e celular. O rodapé móvel usa ícones quadrados com nome acessível, e a tela de privacidade preserva a foto com checkbox de 20 px.
  • A câmera em terceira pessoa considera filhos de modelos importados e segura o último bloqueio por 80 ms. Armas autoradas não reativam malhas antigas, e o HUD volta a mostrar a arte da arma equipada.
  • Celulares entram no perfil gráfico leve desde a abertura, limitam texturas e evitam carregar música, personagem 3D e cenário escondidos antes do primeiro toque.
  • Levar tiro move o corpo do alvo, e quem atira agachado deixa de ficar estátua: o recuo aparece sem sair da pose.
  • Quem está no ar fica em pose de salto em vez de correr em queda livre, e amortece ao tocar o chão.
  • Girar no lugar deixa o quadril para trás e os pés alcançam depois, em vez de o corpo inteiro teleportar junto com a mira.
  • Personagens distantes animam com menos frequência, devolvendo quadros ao celular sem mudar o que se vê de perto.
  • Recarregar ficou visível de fora: em terceira pessoa, a mão livre vai ao carregador e o corpo mergulha durante a recarga, do jogador e dos bots — dá saber quando o adversário está vulnerável.
  • Piscina da Treta volta a carregar sua ambiência.
  • O placar reaproveita cada retrato em vez de baixar o mesmo avatar seis vezes.
  • O guia inicial mostra movimento, tiro e recarga por 15 segundos; a ajuda completa continua no ALT.
  • Os spawns do Escadão e do Ferro Velho deixam a primeira rota livre; a fauna do Ferro Velho nasce fora dos colisores.
  • Andar de lado entorta o corpo na direção do movimento, em vez de deslizar de frente parado.
  • Durante a partida, o perfil móvel começa com resolução de 60%, limita a cadência a 60 FPS no jogo e 30 FPS nos menus, reduz partículas, cápsulas e marcas conforme o aparelho sofre e recupera o último degrau sustentável na sessão seguinte.
  • No celular, a barra de armas mostra a arma de verdade em vez de um desenho genérico, e a imagem muda junto com o que está na mão.
  • No celular, virar ficou três vezes mais rápido: meia-volta cabe em uma passada de polegar, dá para mirar arrastando o próprio botão de atirar sem soltar o tiro, e Configurações ganhou um controle só para a sensibilidade do toque.
vNão · lançado - 2026-10-18#

Adicionado

  • Cada rota do hub abre pelo HTML inicial, sem splash, enquanto o cenário 3D carrega em segundo plano. Os cards Open Graph usam o título e o caminho da página em imagens 1200×630.
  • Convites agora confirmam a chegada pelo link, mostram vínculos, recompensas e pendências na loja e na Comunidade, e atualizam o estado depois da primeira partida válida.

Alterado

  • Clãs, páginas estáticas, perfil, configurações, privacidade, ranking e loja usam o mesmo vocabulário visual Treta Pop. O catálogo público reflete 63 personagens, 12 mapas jogáveis e 26 armas.
  • Partidas usam somente Time E e Time B. Os antigos agrupamentos continuam como categorias editoriais do elenco.
  • A loja coloca as formas de ganhar TRETA$ antes do catálogo, prioriza visuais equipados, adquiridos e compatíveis com o saldo, e mostra quanto falta para cada compra.

Corrigido

  • JOGAR aceita visitante sem nick e oferece login ou cadastro depois da primeira partida. O botão ganhou chamada animada, a carteira usa a moeda do Saci, o personagem perdeu a base escura e o logo volta à tela inicial.
  • O botão de convite pede login antes de prometer uma cópia quando a pessoa ainda não tem conta.
vNão · lançado — 2026-10-17#

Adicionado

  • A fábrica de wearables registra o boné procedural versionado e perfis candidatos por hash para Capitão, Esquerdomacho e Barbudo. A mesma régua importa os marcos e ajustes medidos dos óculos 33–36 para Capitão e Esquerdomacho, gera folhas frente/¾/perfil por pose e bloqueia qualquer par sem certificação humana; os itens 37/38 e a loja de acessórios continuam fechados.
  • A loja TRETA$ ganha vinte skins de arma para AK e pistola: oito políticas, quatro com expressões brasileiras sobre o corpo original, duas Camo Selva, duas Tropicalente, ouro por T$ 900 e prata por T$ 500. O armário equipa uma skin por arma; as mãos continuam visíveis segurando o modelo, e a tecla I mostra sua lateral completa durante a partida.
  • A loja TRETA$ ganha doze luvas de primeira pessoa por T$ 350, incluindo Emo Xadrez, Arquibancada, Bandeira do Brasil, Bandeira dos EUA e MAGA. Cada produto tem molde 3D isolado na loja e equipa a luva em todas as armas.
  • Dez packs coordenados — Caveira Urbana, Brasil Neon, Liberdade 1776, MAGA 47, Emo Xadrez, Barbudo 13, Capitão 22, Selva Camo, Dourado e Prateado — reúnem AK, pistola, luvas e faca por T$ 2.000 cada. O MAGA amplia novamente “MAGA” no cano e “47” no punho.
  • Cada skin de AK e pistola passa a ter seu próprio vídeo isolado em movimento. O detalhe de pack alterna clipes identificados de AK e pistola; nenhum desses vídeos inclui arma, mãos, braços ou HUD de outra skin.

Alterado

  • As oito skins políticas deixam de usar uma placa sobreposta: o símbolo agora é uma pintura metálica ajustada à lateral real da malha, e as frases seguem à esquerda ou centralizadas no cano/ferrolho. Os textos Brasil 22 e Estrela Vermelha ficam maiores sobre áreas azul e branca; os símbolos Trabalho 13, Estrela Verde e Brasil 22 ganham escala e posição legíveis.
  • Nas pistolas políticas, as frases sobem para o ferrolho/cano e ganham escala sem sair da arma. A Tropicalente usa somente um coqueiro maior sobre o ferrolho cinza; a Trabalho 13 troca foice e martelo por uma estrela amarela.
  • O Gauntlet visual diferencia Tamo Junto de É Nóis sem depender do texto, normaliza a escala do Camo Selva e a paleta do Emo Xadrez entre AK e pistola, e troca o brilho plástico de ouro e prata por acabamento metálico escovado controlado.
  • As dezoito variações de AK e pistola com frases usam letras cerca de 20% maiores e margens menores, mantendo a pintura dentro do cano e do ferrolho.
  • Nicks de exibição aceitam de 2 a 32 caracteres no cadastro, comunidade, chat, partida, perfil, badge e cartões compartilhados. Killfeed e painel de morte tratam o nome como texto.
  • A contagem agregada de abertura, carga, entrada, partida e sessão envia somente evento, versão e faixas. O fluxo não usa identificador, cookie ou storage e fica desligado em automação e depuração.

Corrigido

  • O ranking completo volta a rolar até as últimas posições.
  • Convidados antigos conseguem recuperar o login sem perder o progresso local.
vNão · lançado — 2026-10-12#

Alterado

  • Os 19 wallpapers de Políticos e Míticos recebem o acabamento ilustrado das artes antigas, com pele, pelagem, tecidos e luz mais detalhados. Identidade, figurino e armas permanecem reconhecíveis; o enquadramento conserva o personagem inteiro em 3:2 e 16:9.
vNão · lançado — 2026-10-11#

Adicionado

  • Políticos e Míticos ganham 19 wallpapers na rotação dos menus. As artes mantêm 3:2; os seis loadings usam 16:9 exato, e o palhaço vermelho recebe uma composição mais larga para preencher a tela 5K sem faixas laterais.
  • Políticos e Míticos ganham 19 sprites animados no cabeçalho, com transparência, proporção quadrada e versão estática para movimento reduzido. Os fundos dos menus e os sprites alternam a cada 20 segundos enquanto a tela está visível.

Corrigido

  • Acabamento dos mapas: materiais minerais menos brilhantes, paletas mais coerentes e terreno das Obras com escala de textura uniforme. As texturas compartilhadas recebem manchas amplas sem alterar a resolução ou o sorteio dos mapas. Três pixações pretas descartam o quadriculado claro no shader, preservando os arquivos originais. Comparação visual local e regressões ainda em validação.
  • A documentação deixou de apontar para o guia interno BotBrain removido e usa o domínio com www para abrir o jogo. A imagem de fallback do personagem recebe src somente quando há uma URL válida; o CI verifica links e URLs vazias no HTML publicado.
  • Multiplayer: removida a caixa fixa de diagnóstico com FPS, snapshots, jitter, banda e ping. A coleta continua alimentando a telemetria de qualidade por sessão.
  • #696 — assert:assets reprovava com o pacote público mesmo depois do fetch. O audio-pack-v8 (445 entradas, medido em 04/10/2026 no diretório central do zip) não tem pasta ambiente/ nem a chave mapSoundscapes, e o conserto — prepare-public-preview.mjs — era chamado SÓ pelo workflow de preview. scripts/fetch-audio.sh agora termina a preparação em todo caminho público (ensure-map-soundscapes.mjs, que instala mapSoundscapes nos 18 mapas com o hum que o jogo sintetiza; o pack privado não passa por ele, porque ambiência real que falta tem de reprovar o build). eval:audioruntimeassets passa a provar os TRÊS estados do contrato — cru = vermelho, preparado = verde, parcial = vermelho — chamando o assert:assets real.
  • #741 — a graffiti-editorial-check media layouts que ninguém vê. O TypeError de fy_corrego (id que virou corrego) era a ponta visível: as cláusulas religioso-vulgar, putin e rostos-carecas comparavam com fy_corrego e passavam verdes sem medir nada — os três mutantes eram cegos. NOVOS passou a listar os ids que o jogo pede no grafitar({id}) (escadao, campomorro), e a exigência de tabela nominal em Lajes saiu: o layout assado tem 4 tags e nenhum decal vetado. Sobraram 4 vermelhos, todos de conteúdo — ver a issue.

Adicionado

  • O topo da home agora permite desligar e religar a música do menu; a escolha fica salva no navegador. A rotação da intro usa apenas m11, m14, m16, m17 e m22, retirando as três faixas com voz da seleção anterior.
  • Contador central de SEQUÊNCIA mostra os abates da vida atual confirmados pelo jogo/servidor, com identidade visual do CSBrasil; morte, round e reconexão o zeram sem apagar o total da partida. Régua eval:killstreak cobre SP e MP com seis mutantes.
  • Contador de ABATES do jogador no HUD, na coluna de estado dele: algarismo grande com rótulo miúdo, conta a PARTIDA (não o abate do time nem o da rodada) e não zera na virada de round — antes o número pessoal só existia atrás do TAB. Régua eval:abateshud com quatro mutantes, no check:fast.
  • Sertão da Treta substitui o Velho Oeste: casario de taipa, Caatinga, Canudos, calango quadrúpede, aves, cabras e galinha com pintinhos. Preview real com vídeo silencioso ao passar o mouse; criação com caminhada e pausas. O memorial de Padre Cícero permanece fora desta entrega.
  • Camada operacional (tools/ops/, npm run ops:diag): o jogo diagnostica boot, deploy, assets no edge, APIs, telemetria, ranking e partida sintética e explica cada achado com causa provável, evidência, impacto e próximo passo; separa "tecnicamente verde" de "pronto para lançamento". Mutantes em ops:selftest e unidades em ops:test, os dois no check:fast.
  • public/js/ops.js: sinais da sessão no navegador (marcos de boot, FPS em partida, falhas de carga, contexto WebGL, erros de partida, abandono) expostos em window.__csbOps e como migalhas do relatório de erro — sem endpoint novo, sem desenhar nada.
  • Runbook docs/runbooks/operacao-autonoma.md: como diagnosticar, recuperar por classe de achado e reverter site, edge, backend e banco.
  • npm run ops:aquecer e o passo no prod-watch.yml: depois do purge de cada deploy, o edge é aquecido com os módulos e todos os assets que a produção pede (111 MISS de 112 logo após a alpha.224 → HIT).
  • ops-diag.yml: a diagnose com navegador roda a cada hora e vira issue ops-diag em vermelho; portao-browser.yml passa a rodar eval:boot e as provas de navegador da camada operacional em PR que toca o boot.
  • O beacon de /api/perf leva o resumo do ops.js (boot, FPS p50/p5, falhas de carga, sessão anterior) e o relatório de crash diz onde a sessão anterior parou; a sonda de navegador usa a GPU do Mac sozinha e o elenco é sondado pelo glbchars.js que a produção serve.

Corrigido

  • O Campinho da Quebrada ganha cobertura nos dois portões e nas laterais, placar de várzea e navegação contínua nas quinas, preservando duas rotas separadas em CTF e partidas 5x5/8x8.
  • Funkeiros e Tribos Urbanas voltam a usar somente os pools de voz históricos da v7. As 36 falas Gemini rejeitadas deixam de ser alcançáveis pelos resolvers de evento, rádio e seleção; se o pack contiver apenas takes novos sem aprovação, o runtime fica em silêncio. Voz genérica, Web Speech e música removida continuam ausentes.
  • Lobisomem Mítico deixa de puxar aliados de outras facções, passa a resolver M nas telas de inspeção, usa luva M distinta no viewmodel, ganha animação própria com pés no chão e volta a publicar os retratos de resultado aprovados, que tinham saído do quadro medido no elenco.
  • O pack integrado do Lobisomem passa a servir os clipes próprios na sequência do runtime, com o fallback compartilhado preservado só para comparação e regressão.
  • No Sertão, as três carroças deixam passagem pelos dois flancos e as cinco casas diante dos respawns passam a ter porta, saída lateral, janela com revide e navegação intencional para bots.
  • As casas abertas da Praça da Matriz no Sertão preservam cobertura nas laterais das janelas, circulação interna livre e passagem dos bots junto aos esteios.
  • Em rodada de FACA os bots passam a jogar de faca: fecham até o alcance real da arma (medido 5,98 m e zero golpes em 60 s antes; 1,24 m, 18 golpes e 9 abates depois) e o golpe sai como faca — sem traçante, fogacho de cano nem som de tiro. A banda de distância de arma de fogo continua valendo na rodada normal. Régua eval:botfaca com três mutantes, no check:fast.
  • O headshot do jogador não arranca mais a câmera da primeira pessoa: a replay orbital e o hit-stop do #364 saíram, e o abate continua contando com hitmarker, dano, killfeed e locutor. Régua eval:replaycam passou a medir o contrário, com quatro mutantes.
  • Single Player voltou a abrir o submenu de MATA-MATA e CAPTURE A BANDEIRA (CTF), que segue para a seleção de mapas com o modo escolhido.
  • eval:boot voltou a rodar: a fixture do boot-check.mjs ancorava na assinatura antiga de _startGame (mudada no #489) e reprovava antes de medir; agora ancora no nome da função.
  • Os contadores do menu (/api/online e /api/map-plays) tentam de novo no cold start do backend (503 na primeira chamada, medido 06/09) em vez de ficar vazios.
  • O proxy da rede de segurança do site repassa a geo da borda (x-vercel-ip-*); a diagnose distingue city parado com presence viva (ingestão parada, corosolto/backend#22) de "ninguém jogou".
  • O build privado volta a carregar os 16 anúncios Fish, as 36 falas finais dos nove Funkeiros e somente as oito músicas aprovadas do menu.
  • Palhaços e Funkeiros sem take próprio deixam de tocar dublagem genérica; os Funkeiros preservam somente as 36 falas aprovadas.
  • A primeira fala de kill não é mais bloqueada por uma seleção ou chamada de rádio imediatamente anterior.
  • O empacotador limpa saídas anteriores e reconhece uma AWP CC0 catalogada sem confundi-la com áudio legado pelo nome.
  • Tiros ficam abaixo das vozes e a contingência original restaura falas, rounds e kill streaks em single-player e multiplayer.
  • O multiplayer reconhece inputs por sequência e suaviza correções sem apagar movimento pendente.
  • Arma, slots, pente, reserva e recarga passam a ser autoritativos no protocolo snapshot v4.
  • Trocas de arma remotas remontam a malha visível; clientes lentos não acumulam snapshots obsoletos.
  • A qualidade envia magnitude das correções para diagnóstico por sessão e round.
  • Multiplayer não vaza mais para a partida single-player depois de voltar ao menu.
  • O primeiro spawn e o respawn online obedecem imediatamente à posição autoritativa.
  • Captura de bandeira passa a receber placar, progresso, donos e relógio pelo snapshot v3.
  • Slots abandonados voltam à IA e as salas oficiais passam de 5v5 para 4v4.
  • O catálogo in-game usa a mesma versão v8 do pacote de áudio baixado no build.
v2.1.0-alpha.145 · 2026-11-12#

Mudado

  • hotfix: recover production boot and objective crashes (#1336)
  • fix: retain shared profile source contract
  • fix: retain boot readiness source contract
  • fix: keep delayed boot initializers standalone-safe
  • fix: preserve boot sequencing without top-level await
  • fix: share resolved language with dependent UI
  • fix: handle matches without objectives
  • test: target the objective crash regression
  • test: decouple language gate from top-level await
  • fix: recover production boot and objective crashes
v2.1.0-alpha.144 · 2026-11-10#

Mudado

  • Anima reações e saque dos personagens remotos (#1273)
  • fix(ci): pass Cloudflare preview SHA through the environment (#1310)
  • Merge CI fix for the Cloudflare sticky preview comment. Owner explicitly authorized this merge; required checks are green and the only failing check is the smoke-cf failure fixed by this PR. (#1309)
  • Pre-push: edge entry points select network, not full deploy (#1303)
  • release: daily batch 2026-11-10 (#1316)
  • test: cover invalid CF comment arity
  • fix: accept positional SHA in CF preview comment
  • fix(ci): corrigir argumentos do comentário Cloudflare
  • ci(pre-push): bordas de contagem (middleware.js e src/middleware.ts) são network
  • Preserva ordem da régua de animação
  • Restaura mutação do hit local
  • Corrige câmera do arnês de mantle remoto
  • Documenta arnês remoto fora do código
  • Aplica direção à morte remota atrasada
  • Enquadra arma durante saque remoto
  • Evita morte atrasada após respawn remoto
  • Documenta limite de dano em bots remotos
  • Mantém apoio da arma durante saque remoto
  • Preserva dano local e morte sem evento
  • Aplica LOD de animação aos remotos
  • Mede animações de remotos com mutantes
  • Anima saque na troca de arma remota
  • Direciona morte remota pelo autor
  • Anima reação de remotos ao dano
  • Anima inclinação lateral de remotos
v2.1.0-alpha.143 · 2026-11-10#

Mudado

  • Merge main-only CI hotfix. Owner explicitly authorized CI correction and release. All checks are green. (#1314)
  • chore(bots): standardize csbrasil-bot public output in English (#1311)
  • Merge account modal polish 2.1.0-alpha.142. Owner explicitly authorized CI correction and release. All checks, including smoke-cf, are green; all review threads are resolved with evidence. (#1307)
  • test: cover invalid CF comment arity
  • fix: accept positional SHA in CF preview comment
  • chore(bots): standardize csbrasil-bot public output in English
  • test: reject transient stale guest error
v2.1.0-alpha.142 · 2026-11-10#

Mudado

  • fix(ci): protege preview Cloudflare e smoke manual (#1300)
  • chore: versiona módulos do modal atualizado
  • test(ci): limita regras CF ao passo exato
  • test(ci): prende guarda do smoke ao dispatch
  • fix(ci): isola artefato e corrige smoke manual
v2.1.0-alpha.141 · 2026-11-10#

Mudado

  • fix(ci): protege preview Cloudflare e smoke manual (#1300)
  • test(ci): limita regras CF ao passo exato
  • test(ci): prende guarda do smoke ao dispatch
  • fix(ci): isola artefato e corrige smoke manual
v2.1.0-alpha.140 · 2026-11-10#

Mudado

  • Jogo para de travar com muitos bots (#1245)
  • Emit google-site-verification meta on the home head (#1254)
  • Add itch.io embed wrapper and allow itch.zone ancestor (#1252)
  • ci: harden post-deploy smoke classification (#1255)
  • Remove 157 eval scripts with no caller anywhere in the repo (#1256)
  • ci(browser): validar agregado do portão em staging (#1246)
  • ci: acelerar pre-push e isolar gates pesados (#1257)
  • fix(ui): manter ação privada visível no boot v3 (#1250)
  • Use English bot updates and retire obsolete review requirements (#1262)
  • feat(cf): spike do site no Cloudflare Workers (fase 1 da migração) (#1261)
  • fix(audio): voz é do personagem e rádio dos bots chega ao multiplayer (#1263)
  • ci: shard heavy simulations and publish timings (#1267)
  • Medição ligada por padrão: recusa explícita desliga (#1264)
  • Cortar build de preview, cache de packs e log por requisição na Vercel (fase 0) (#1258)
  • chore: régua eval:lixo (LX1-LX5) + bloco 1 da limpeza (#1259)
  • chore: limpeza de órfãos lote 2 (#1272)
  • feat: preview Cloudflare por PR (#1271)
  • Segredos de SSR em runtime no Workers: env-runtime + ponte de bindings (achado 1 do spike CF) (#1276)
  • ci: paraleliza contratos visuais e Flávio (#1275)
  • Contagem de borda nomeia navegador interno de app (#1278)
  • Pre-push e CI param de queimar uma hora por push (#1281)
  • ci: rebalanceia equipamento TP sem novos jobs (#1282)
  • feat: usar corosol.to nos links compartilháveis (#1285)
  • feat(cf): publica Worker de staging em paralelo (#1283)
  • fix(cf): restaurar geo e assets de áudio no Workers (#1284)
  • docs(skills): personagem 3P pelo processo padrão do Studio (#1269)
  • [REA] Adicionar impacto de pouso por superfície e vínculo de look (#1289)
  • fix(login): continua OAuth quando a prova do convidado expira (#1296)
  • feat: automate daily releases and build repair (#1290)
  • fix(login): continua OAuth quando a prova do convidado expira (#1297)
  • ci(preview): builda mudanças do adaptador (#1299)
  • /app: landing leve para quem abre o jogo dentro de app (#1291)
  • fix(ci): desbloqueia a promoção staging (#1286)
  • lote release 08/11: jogo sem travar com muitos bots (#1245) (#1251)
  • fix(ci): declara runner do preview pulado
  • ci(preview): builda mudanças do adaptador
  • style(ci): compacta comentario de geo da borda
  • fix(login): separa recuperação por provider
  • fix(login): continua OAuth quando a prova do convidado expira
  • fix(login): separa recuperação por provider
  • fix(bot): classify batches from verified complete diffs
  • fix(bot): verify complete release diff before merging
  • fix(bot): preserve feature routing and require positive English detection
  • fix(release): resolve hostname e trafego duplicado
  • test(game): usar ID canônico do córrego
  • docs(game): atualizar âncoras da matriz
  • chore(ci): remover diário do diff da PR
  • fix(bot): require main ancestry and lockfile-free Node setup
  • test(smoke): detect locale from rendered faction label
  • fix(bot): secure dependency reinstall and batch review resolution
  • Constrain preview build timeout
  • Satisfy Cloudflare workflow gate requirements
  • fix(login): continua OAuth quando a prova do convidado expira
  • fix(bot): refresh release ancestry refs explicitly
  • fix(bot): require approval and clear human blocks for batches
  • fix(landing): alvo do iOS com uma autoridade https e fiação testável
  • fix(bot): bind automerge to evaluated head
  • fix(bot): block merges while review is pending
  • Detect chat smoke locale from rendered UI
  • fix(ci): permite config do Worker staging
  • fix(bot): protect quality gates from build repair
  • test(ci): enforce automerge decision ordering
  • fix(bot): reject missing hotfix ancestry evidence
  • fix(ci): nao mede GPU real em SwiftShader
  • test(game): ampliar timeout da régua de pouso
  • Fix preview artifact gating and chat smoke collector
  • fix(ci): align bot merge policy guards
  • test(smoke): cover remaining chat locale labels
  • fix(cf): respeita teto de timeout do deploy
  • docs(game): regenerar matriz de armas
  • fix(cf): preserva contrato do gate smoke
  • fix(ci): executa preview CF do branch base
  • fix(ci): split Cloudflare preview deploy
  • fix(ci): isolate Cloudflare preview secrets
  • test(smoke): localize chat assertions
  • test(bot): retire CI fixture debt
  • docs(bot): document release and PR language policies
  • feat(bot): require English PR titles and descriptions
  • feat(bot): repair failed builds with isolated Codex jobs
  • test(bot): add build repair trust guards
  • feat(bot): merge safe PRs into daily release batches
  • feat(bot): classify releases and assign bugfixes
  • test: register share origin in fast suite
  • test(smoke): accept edge locale labels
  • docs: comentários da landing e do privacy-runtime no teto de 2 linhas
  • test: harden share link gates
  • fix(ci): resolve bloqueios da promocao staging
  • feat: use corosol.to for shared links
  • fix(cf): restore geo and audio assets on Workers
  • docs(cf): registra prova do staging
  • fix(cf): torna issue de paridade shell seguro
  • feat(cf): publica Worker de staging em paralelo
  • ci: rebalanceia contratos de equipamento TP
  • fix(game): respeitar altura da água no pouso
  • feat(borda): landing /app para quem abre o jogo dentro de app
  • ci(pre-push): scripts/ci/*.py são core (eval:fixture cobra o selftest)
  • docs: changelog dos portões de CI
  • ci(smoke): smoke-cf e FX2 saem do vermelho crônico do staging
  • ci(pre-push): o teste das suítes é transversal como o seletor
  • ci(pre-push): base mais próxima entre main e staging; skills e markdown são core
  • test(suites): eval:servertraffic entra no baseline da suíte fast
  • ci: separa visual-map de materiais
  • ci: isola contrato ferro-balcao
  • ER1 pega leitura de env por alias e destructuring (review do estraga-codigo)
  • ci: separa integracao comportamento e escolta Flavio
  • CI: passo --varre precisa das sentinelas no próprio env
  • chore: disparar validacao do smoke por SHA
  • Segredos de SSR saem do build e viram leitura de runtime (achado 1 do spike CF)
  • fix(ci): prepara three no shard de grafite
  • fix: vincular smoke ao preview do commit
  • fix(borda): comentário da classe de app dentro do teto
  • docs: registrar preview Cloudflare validado
  • fix: considerar config do Worker no filtro
  • fix: restaurar executor do preview Cloudflare
  • chore: disparar preview após token dedicado
  • chore: reexecutar preview Cloudflare
  • fix: tornar preview opcional e registrar asset ausente
  • chore: permitir config de preview na raiz
  • docs: registrar permissão ausente no preview
  • docs: detalha shards e selecao do pre-push
  • feat(pre-push): seleciona scripts e workflows alterados
  • ci: divide contratos visuais e Flavio em shards
  • fix: permitir token dedicado no preview Cloudflare
  • feat: publicar preview Cloudflare por PR
  • chore: arquiva históricos e pastas privadas
  • chore: remove geradores raiz órfãos
  • chore: remove órfãos eval da lote 2
  • chore(docs): regenera bloco de scripts com eval:servertraffic
  • feat(borda): nomear navegador interno de app na contagem de tráfego
  • docs(skills): personagem 3P passa pelo processo padrão do Studio
  • fix(eval): lixo conta rename como adição (--no-renames) e prova com mutante
  • Chave do cache de packs vira sha256 da URL inteira
  • test(eval): eval:lixo é passo novo da suite fast, fora do baseline congelado
  • ci(eval): add runner timings and optional core parallelism
  • ci(browser): split livestock checks by id
  • ci(invariants): shard simulations by family and map
  • test(audio): VOZ8 executa o produtor real do room.js; mutantes exigem saída 1
  • chore(audio): encurta comentários novos (régua comentario)
  • fix(audio): voz é do personagem e rádio dos bots chega ao multiplayer
  • docs(review): retire obsolete reviewer requirements in historical records
  • chore(review): remove retired provider references from CI fixtures
  • feat(privacidade): medição ligada por padrão, recusa explícita desliga
  • fix(cf): middleware lê API_PROXY_SECRET e PUBLIC_API_BASE em runtime; adaptador.mjs no gatilho
  • test(cf): _headers/_redirects gerados de vercel.json, réguas de paridade e runbook da fase 1
  • feat(cf): adaptador por ADAPTER, Worker csb-spike e imagens em resvg-wasm nas duas bordas
  • build(deps): @astrojs/cloudflare 14.3.4 e wrangler 4.158 para o spike do Workers
  • chore(limpeza): bloco 1, só o que tem zero chamador
  • feat(eval): régua eval:lixo, PR não nasce com lixo (LX1-LX5)
  • Registrar o PR #1258 no status do runbook
  • Cortar build de preview, cache de packs e log por requisição na Vercel
  • fix(bots): write public PR updates in English
  • test(ui): require visible private-room options
  • test(vm): drop inconclusive local-weapon mutant
  • test(vm): include initial weapon in MP boot budget
  • Remove 157 eval scripts with no caller anywhere in the repo
  • ci(workflow): isolate heavy and external checks
  • ci(eval): select lightweight pre-push suites
  • fix: exclude /api/* proxy failures from site smoke
  • Regenerate docs blocks for check:fast with eval:portalembed
  • fix: keep backend smoke noise out of site gate
  • Emit google-site-verification meta on the home head
  • ci: harden post-deploy smoke classification
  • test(game): proteger vínculo visual e régua de look
  • feat(game): adicionar impacto de pouso por superfície
  • Add itch.io embed wrapper and allow itch.zone ancestor
  • chore(docs): regenera bloco derivado (autofix)
  • fix(ui): preserve private-room actions during v3 boot
  • ci(browser): replace aggregate heredoc with python -c
  • test(vm): drop inconclusive local-weapon mutant
  • Regenerate the weapon matrix line anchors
  • Give the plane LOS clause the Game scratch vectors
  • Inject the static raycast index so shot_surfaces stays three-free
  • test(vm): include initial weapon in MP boot budget
  • ci(browser): indent aggregate heredoc
  • chore(docs): regenera bloco derivado (autofix)
  • Regenerate the weapon matrix line anchors
  • Trim the light-layers comment to the two-line limit
  • Log the bot-count stutter fix in the changelog
  • Add bots-perf rulers for bot-count stutter
  • Add a mutation hook that restores the old all-hits LOS path
  • Regenerate ARCH.md for the new game.js methods
  • Key the VIP line-of-sight memo on the LOS function too
  • Keep lights visible to every post pass layer
  • Render character contact shadows in a single pass
  • Reuse noise buffers for synthesized gunshots and steps
  • Stop per-frame shader key churn from bot shadows and team halos
  • Index static occluder meshes for every map
  • Memoize the VIP line of sight within a Flávio sim step
  • Stop bot line-of-sight checks at the first occluder hit
  • Index colliders in an XZ grid for _collide

Versions older than v2.1.0-alpha.140 live in CHANGELOG.md.