Changelog
Tudo que mudou, versão por versão. A versão em produção é a vUnreleased. O arquivo completo vive em CHANGELOG.md no repositório - esta página é ele, renderizado.
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/comSTUDIO_PACK_ROOT,?packorigin=cdn|localforça), com a mesma verificação de SHA-256; a CSP lista a origem noconnect-src.npm run publish:packs(scripts/publish-studio-packs.mjs) sobe só pacote fixado e íntegro, comContent-Typepela extensão,Cache-Controlimutável,If-None-Match: *, pula o que já está igual, recusa sobrescrever conteúdo diferente, tem--dry-rune confere cada objeto pela origem pública (SHA-256, bytes, MIME, cache, CORS). Réguas:eval:studiocharR19 (4 mutantes novos: origem errada, origem ignorada, sempre CDN, CSP sem origem) eeval: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/passerespondendo), 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 ganhouabrirLoginPrompt). Personagem compasse:{season, level}emcharacters.jsaparece com cadeado e "Nível N" e só é escolhido quandounlocked.charactersdo 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/passeentra 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) etools/eval/passe-browser.mjs(lobby real com o mocktools/eval/passe-mock.mjs;PASSE_MOCK=conta|visitantenoserve.mjspara 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.json Vercel,src/middleware.tson Workers) now answer the home with a 302 to/appwhenserver-traffic.mjsclassifies the user agent asapp/(desvioParaApp): only the home, query kept intact,?jogo=1and?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 fromlaunch-media/2026-10-18-tricolor-morumbi), is static andnoindex, puts both calls above the fold and rewrites every link to the home with the visitor'sutm_plusjogo=1; ABRIR NO NAVEGADOR triesintent://on Android andx-safari-https://on iOS, with the in-app menu tip after 1.8 s if nothing opened. Origem shows it as landing/appunder the app agents; Campanhas keeps attribution by source.server-traffic-checkgains 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.htmlis a one-file HTML upload that embedshttps://www.corosolto.com.br/?lang=en&utm_source=itch&utm_medium=portalin a full-viewport iframe (allow="pointer-lock; fullscreen; autoplay; gamepad"). itch serves uploads fromhtml-classic.itch.zoneinside.itch.io, andframe-ancestorschecks every ancestor, sohttps://.itch.zonejoins the CSP invercel.json(only.itch.iowas listed; the wrapper rendered a black frame).eval:portalembed(pr-fast +check:fast) ties eachtools/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). /enis 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)./encarries title, description, FAQ (HOME_FAQ_EN), the links to every EN twin plus/docs/en/, aWebPagenode pointing at the home'sVideoGame, and the PLAY CTA at/?lang=en. Paired with/insrc/lib/i18n-pairs.ts, so hreflangen+og:locale:alternatenow appear on the home (index.astro, own<head>),/enis in the sitemap with home weight, in the AEO index and inllms.txt. Pinned byeval:game-pages(home →/en,/en→ home,inLanguage, EN links, FAQ visible == JSON-LD; 4 new mutants),eval:seoandcanonical-host-checknow 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 viaassetUrl;img/mode-announcementsjoinsgen-asset-rev). JOGAR starts VS BOTS onoperacao_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; mutantscard-resenha,modal-sem-imagem,esc-sem-foco,jogar-mapa-errado,en-faltando) andlobby-flavio-browser.mjs(Chrome, 6 screens,eval:ui-v3:lobby-flavio, chained fromeval:ui-v3:social);ui-v3-socialSO2/SO3/SO7/SO11 follow the cutover (mutantsbotao-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.
escortCoverPointsgrows 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 byoperacao-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.
escortCoverPointsgrows 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.shsai 0 para toda branch de PR (o preview é o.workers.devdocf-preview.yml);staging,main,lote-e/lote-continuam buildando sempre e produção segue só nochore(release):. A réguaeval:vercelignorefoi reescrita para o contrato novo (mutantespreview-pr-builda,staging-pulado,release-pulado).preview-build.ymlpassou aworkflow_dispatch(inputpr_number, emergência);preview-deploy.ymlsegue emworkflow_runpublicando--prebuiltsó quando alguém despacha o build — nenhum PR dispara mais esse par. A PRV1 doworkflow_security_check.pyproíbe o build de voltar a disparar sozinho porpull_request/push/schedule(mutante novocompila-volta-pr) e mantém a proibição desecrets.; DG3/DG6 e o concurrency-check prendem o par como estava; o bot dopreview-bot.ymle o labelpreview-autorizadonã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.comesconda 404/500 do próprio host;eval:cfparidadesó aceita mutante com exit 1;eval:bots-perfentra emoperacao-flavio-comportamentoe a prova browser fica no Chrome com GPU real, pois o runnerportao-controlesusa SwiftShader (degraded=true, 3,5 s/quadro), sem novos jobs nem falsa cobertura de GPU.cf-preview.ymlcompila o PR viapull_requestsem segredos e entrega somente o artefato;cf-preview-deploy.ymlreage aoworkflow_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 exigemgithub-actions[bot]e SHA+URL no mesmo comentário;tools/cf/passa a disparar preview e o jobskipdeclararuns-on: ubuntu-latestpara o workflow voltar a iniciar. - Compartilhamento: links de convite, perfil, clã e botões sociais usam
https://corosol.tocom seus UTMs; canonical,og:url, hreflang, sitemap e JSON-LD continuam emhttps://www.corosolto.com.br. A réguaeval:shareoriginmede o build e morde duas mutações. - Pre-push and CI gates stop burning an hour per push on staging branches.
selecao-pre-push.mjsnow diffs a new branch against the nearest oforigin/mainandorigin/staging(a branch cut from staging was compared with main and dragged 691 files into the diff, forcing the fullcheck:deploy);.agents/,.claude/,plans/,launch-media/and any.mdselect onlycore;src/lib/server-traffic.mjsand its check selectnetwork;tests/eval-suites.test.mjsis transversal like the selector.smoke-cf(Cloudflare preview, #1271) failed on language because the GitHub runner sits in the US andcf-ipcountry=USturns the home into EN while the specs assert PT copy:playwright.smoke.config.mjsseedscs_lang=ptthroughstorageState(andchat-sala.spec.json its own page), proven against a forged US geo.scripts/ci/cf_preview_comment.pygains--selftest(FX2) with the comment choice extracted into a pureescolher.privacy-runtime.jsheader 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:portaointeirocobre os aliases na ordem dos shards, rejeita perda/duplicata e preserva a duplicação já contratual deeval:movimento-fluidezentre AK/mantle. Personagens/câmera usa três shards balanceados pelo manifesto diário: produtor e consumidor compartilham a chaveeval-durations-v1-<hash do conteúdo>e o prefixo estáveleval-durations-v1-; manifesto ausente, vencido ou inválido reprova o runner, sem retorno silencioso à execução completa. - Equipamento TP:
eval:tp-cosmetic-sourcesai deequipamento-tp-corpoparaequipamento-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 ciganhaid: depse guarda nos dois jobs, impedindo execução após setup falho. - Operação Flávio: o alias público
eval:operacao-flaviocontinua sequencial, agora composto porcore,collidercompleto,menu,online,integracao,comportamentoeescolta; 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 obuildagregando 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.jsonalterado é comparado semanticamente entre os blobs do range; mudanças em scripts decheck:fast/check:deployexecutam 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çandocheck: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 (
montarPainelFlavioinpublic/js/tp/flavio.js; the bottom-left corner card, its mini artflavio-embarque-card.webpand 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 byeval:ui-v3:lobby-flavio(LFB1 order above the invasion in 6 screens, new LFB6 columns; mutantscard-depois,quests-esquerda) andlobby-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,mainandlote-*always build, a missing or out-of-clone previous SHA builds, production is unchanged. Pinned byeval:vercelignore(real git repo, 3 mutants) in pr-fast. The audio/decals zips and every viewmodel asset are cached innode_modules/.cache/csb-packs/between Vercel builds (keyed by sha + URL; no-op locally).middleware.jsand/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.jsallowed()returnstrueunless an explicit refusal is stored incs_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 whilecount_hourlystill saw 100 to 1000game_loaded/day (08/11: 1046 loads, 125 SP match starts, 2 browsers inplayer_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 wipescs_acq/cs_ops_last/cs_session/cs_invite_landingand 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-checkproves default allow, refusal wins and withdrawal purge (mutantsignore-refusal,keep-optional-storage-on-refusal,vercel-continue-after-withdraw);privacy-ops-checkbootsops.jsunder a stored refusal (mutantops-ignore-refusal) and under no choice;login-prompt-checkLP8 expects events unless refused.
- CI and local test orchestration no longer requires the full 116-step deploy suite on every push.
check:prepushruns 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:fastandcheck:deploynow expandtools/eval/suites.mjs, with all original 338 and 116 steps preserved token-for-token and order-checked, pluseval:portalembedfrom staging. The CI keeps its complete independent lists. - Invariants now run in source, VM, bots, characters/materials and four map shards.
INVARIANTES_FAMILIAand map-check selectors reject unknown IDs before starting simulations, preserve eachfreshReportproducer 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=2is 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) staykind: browser(they are people) withagent: 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.mjsgains the five UA cases plus the open-Chrome andfacebookexternalhitcounter-cases, and is finally wired aseval:servertrafficinsidecheck:fast(it had no script since #988).
Fixed
- CI: os consumidores de
ferro-balcaoeboot-mutant-verdictreconhecem o exit 78 da taxonomia atual como medição inválida, em vez de esperar o exit 3 antigo e derrubar todopr-fast. - O hook local de
pre-pushmantém o seletorcheck:prepush,check:deployusa a suíte única do runner e o manifest declara o adapter Cloudflare/Wrangler exigidos pelos gates. tools/rig-from-donor.mjsnow fits the elbow and wrist joints to the mesh instead of copying themstskeleton 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 fromLeftHand/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, soretarget-glband the shared clips still apply) and recomputes the IBM of the moved subtree only;AJUSTE_JUNTAS=0reproduces 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 inpublic/were not re-rigged. Guarded byeval:rigmaos(CPU skinning with the 11 shared clips over a synthetic mesh with the pilot's offsets; mutantstransplante-cru,ibm-velha), in CI andcheck: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 comumtools/eval/KNOWN-RED.jsoncom 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
becausealém deporque, 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()calledresume()outside a user gesture, the promise rejected silently and the context stayedsuspendeduntil some later sound happened inside a gesture._resume()handles the rejection andunlockOnGesture()(capturingpointerdown/keydown) resumes on the first gesture and unbinds itself;main.jsarms it right after creating the Sfx. Pinned byeval:audiounlock(UNL1–4; mutantssem-destrave,gesto-vazio). - The Werewolf's growls stay with the Werewolf:
_voicePooldrops the in-game takes of speechless characters (SFX_ONLY_VOICE_IDS) from the generic faction pool, so Caipora (no voice yet) andsfx.voice('M')stop inheriting howls once the private manifest structurescharacterVoice.lobisomem.kill. VOZ10 + mutantlobo-no-poolineval:mp-voz-personagem. - Gates that had fallen behind the game:
audio-voice-mix-checkMIX11 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-checkfixture gainedprotocolVersion: 8(the whole gate died withprotocolo_incompativel);character-voice-contract-checkreports local-onlyspecs//plans/as NOTA instead of failing outside the owner's machine and VOICE5 reads the real installer (fab-game-local.mjs). .githooks/pre-pushnow serializes itself per machine (atomicmkdirlock with owner pid, stale lock reclaimed, 40 min max wait): three concurrentcheck:deployruns 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 toconsole.error; menu scenery failures release the splash instead of aborting boot; andmain.js/site-links.jsno longer require top-levelawait, 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 porworkflow_dispatchnão consulta mais sticky de PR e falha imediatamente seBASE_URLestiver vazio. WFS cobre os três caminhos com mutantes; E05 ganhou DOM completo e timeout, confirmando que o retry deguest_invalidtermina sem alterar o login. - Pre-push no longer falls back to the full
check:deploywhen a change touches the two edge entry points:middleware.js(Vercel proxy root) andsrc/middleware.ts(Workers) now selectcore + networkinselecao-pre-push.mjs(the landing PR #1291 burned a full local run because of this). Covered by a new case ineval-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:
pedirPickon a network drop with_nid === 0fell through to the spawn-rack path (pickupWeapon) and the server got the wrong request;limparDropsDeRedenever removed it on round reset; and_pickPendente = 0doubled as the "nothing pending" sentinel, so an input carryingpick: 0was omitted fromsendInput. The sentinel is nownull(set in the constructor), every check is!= null, andnet-event-id-checkgrows the drop lifecycle clause (drop 0/1/0xffffffff spawns,goneremoves it, round reset removes it,pick: 0reachessendInputand is consumed) plus the rack counter-case; the truthiness mutant dies.eval:netcodefails on virgin staging withprotocolo_incompativel(protocol v8 bump in flight by another lane) and is not affected by this change. - Revisão do release #1251:
origemCompartilhamentosó usacorosol.tono apex ou em subdomínios com fronteira (*.corosolto.com.br), sem desviar hosts comoevilcorosolto.com.br; o middleware Astro devolvenext()na Vercel, cujo proxy já conta a requisição, e só agenda/api/server-trafficno Workers. Regressões comportamentais cobrem apex/subdomínio/host estranho e os dois adaptadores;eval:shareoriginganha o mutante sem fronteira e os builds Vercel/Cloudflare passam. UIR20 deixa de prender a formanew Setdegeo.tse chamalangFromCountrypara verificarUS/GB → enePT/BR/ausente → pt. - Social login no longer gets stuck on
guest_invalidwhen 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_invalidwhen 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.characterVoicenow 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 invoice.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 byeval:mp-voz-personagem(VOZ1–6, mutantpool-da-faccao). - Bot radio callouts reach the multiplayer: the dedicated node died in
_botCallat the DOM check, so the snapshotvoicechannel (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 inNetGame.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 (mutantrede-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=lampiaostart; map art (javaporcos) still wins, other characters keep rotating.javaporcos-wallpaper-checkanchor updated. - The v3 multiplayer lobby keeps CRIAR SALA PRIVADA, quick play and private-room options visible when
/api/geo-langresolves aftertp/servidores.jsmounts. 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);
_collidescanned 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 noiseAudioBuffer. 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 byeval:bots-perf(node: LOS per bot, colliders visited, triangles per ray, same hash; 3 mutants) andeval:bots-perf:browser(Chrome, Flávio 12 bots, CPU 4×: p95 ≤ 100 ms and ≤ 40 program lookups per frame; mutantsia-antigaandrender-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 byeval:operacao-flavio-pickup(4 mutants), wired intoeval: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,
_mantleAlcancefell 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):
embarqueaccepts the head at once when it is a 2-parent merge whose tree equals parent 2 andci.ymlalready finishedsuccesson parent 2 (the lote PR run); any other case falls back to waiting for the push run.bump-tag-releaseapplies the sameverde_por_lotecheck beforepr_fast_verdewhen main moves, so only green SHAs are published (RLS17). Pinned by RLS18 ineval:release(realverdestep with fakegh/sleep, 11 scenarios; mutantslote-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 thetwqfunction instead of the<script>element and threw on every boot (ops-diag #1231). Guarded byeval:xpixel, which runs the real snippet from both pages, with theinsere-funcaomutant (CI andcheck:fast). - prod-watch no longer fails every scheduled run when
CF_API_TOKENcan't see thecorosolto.com.brzone: the Cloudflare purge is best-effort (continue-on-errorplus guarded parse), emits a::warningpointing at the token scopes (Zone:Read + Cache Purge) or the newCF_ZONE_NAMErepository variable, also warns onsuccess:falsepurges, and the edge-coherence probe still runs — no more falseprod-crashincidents. Pinned byeval:wfpurge(fake-curlruns of the real step, 3 mutants), wired into pr-fast. - No code requests a missing
/img/chars-hero/<id>.webpanymore (ops-diag #1231,julia-zanatta404 at boot):public/js/data/retratos.jsis the single source of which ids have hero (45) and model-cutout (54) art, andretratoFontes/heroUrlfeed 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 byeval:retratohero(sets == disk both ways, realportraitUrl/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-zoneguardcover 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-afundamutation. - The real Chromium escort scenario now runs in
check:deploythrough 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-lockandcancela-mouseupmutants. - 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 bypistol-golden-no-lancamento(VL8) andgolden-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=0disables it). The real-browser rulereval:vm-troca-sem-legadosaw 4 legacy frames on the first switch withoutprimeand 0 with it; it runs incheck:deploy, with thesem-primemutant. - 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-siteserial queue is split into parallelreguas-e-siteandmapas-e-sitejobs after measured cancellations at 30m16s (run42009772988) and 35m18s (run42016661426), both without a red verdict. Every step moved intact; the build job now requires both. The online escort suite is single-sourced througheval:operacao-flavio, with asuite-duplicadamutant 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.goldFramereframes only thegold#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 aquadro-pistolamutant, and the magazine ruler knows the pilot'sL_*/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-escoltamutant. 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 byoperacao-flavio-vip-jogador-checkwith 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_updateBotafter 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-baixoandkit-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 byescada-invertida,escada-longe-da-portaandaviao-sem-espelho. - Flávio's stairs are walkable ("a escada está bloqueada"). The stairs lost their solid box:
groundHeightAtfollows 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 mSTEP_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 byescada-solida,escada-plana,escada-degrau-alto,escada-sem-navandvanguarda-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 sBOARDING_TIMEhold, the 0.45 m platform radius andboardedForare 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 byembarque-so-no-topo,guarda-na-escada,embarque-jogador-nunca,embarque-jogador-so-no-topo,embarque-jogador-so-livre,embarque-exige-escoltaandembarque-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 57toz 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 toz 70; and a 12-pointaircraftRingjoins 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 byaircraft-ring-walkable-and-faithful-colliderswithasa-larga,fuselagem-larga,limite-norte-antigo,carro-na-asaandanel-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 theplaca-boiandotimeline scenario. The amber checkpoint floor rings that read as unexplained circles in the boarding lounge are gone (anel-no-loungemutant); 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-antigoandhud-antigomutants.
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-originem 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
Imostra 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
wwwpara abrir o jogo. A imagem de fallback do personagem recebesrcsomente 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:assetsreprovava com o pacote público mesmo depois do fetch. Oaudio-pack-v8(445 entradas, medido em 04/10/2026 no diretório central do zip) não tem pastaambiente/nem a chavemapSoundscapes, e o conserto —prepare-public-preview.mjs— era chamado SÓ pelo workflow de preview.scripts/fetch-audio.shagora termina a preparação em todo caminho público (ensure-map-soundscapes.mjs, que instalamapSoundscapesnos 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:audioruntimeassetspassa a provar os TRÊS estados do contrato — cru = vermelho, preparado = verde, parcial = vermelho — chamando oassert:assetsreal. - #741 — a
graffiti-editorial-checkmedia layouts que ninguém vê. OTypeErrordefy_corrego(id que viroucorrego) era a ponta visível: as cláusulasreligioso-vulgar,putinerostos-carecascomparavam comfy_corregoe passavam verdes sem medir nada — os três mutantes eram cegos.NOVOSpassou a listar os ids que o jogo pede nografitar({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,m17em22, 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:killstreakcobre 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:abateshudcom quatro mutantes, nocheck: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 emops:selfteste unidades emops:test, os dois nocheck: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 emwindow.__csbOpse 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:aquecere o passo noprod-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 issueops-diagem vermelho;portao-browser.ymlpassa a rodareval:boote as provas de navegador da camada operacional em PR que toca o boot.- O beacon de
/api/perfleva o resumo doops.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 peloglbchars.jsque 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:botfacacom três mutantes, nocheck: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:replaycampassou 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:bootvoltou a rodar: a fixture doboot-check.mjsancorava 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/onlinee/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 distinguecityparado compresenceviva (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
Versões anteriores à v2.1.0-alpha.140 estão no CHANGELOG.md.
◂ JOGAR