Skip to content

feat: fumaça do cano + tranco e cápsulas mais fortes no tiro - #405

Open
EmersonGarrido wants to merge 32 commits into
corosolto:mainfrom
EmersonGarrido:feat/muzzle-fx
Open

feat: fumaça do cano + tranco e cápsulas mais fortes no tiro#405
EmersonGarrido wants to merge 32 commits into
corosolto:mainfrom
EmersonGarrido:feat/muzzle-fx

Conversation

@EmersonGarrido

Copy link
Copy Markdown
Contributor

O quê

Aproxima o feel de disparo do jogo de uma referência em Three.js (fumaça saindo do cano, cápsulas voando, tranco de tela por tiro) reusando a infra que já existe — sem lib nova e mantendo a regra de zero alocação por tiro.

Mudanças (só public/js/game.js)

  • Fumaça do cano (novo) — em _flash(), 2–3 baforadas cinza subindo/à frente na boca (_muzzleWorld), via GPUParticles criado com _tintFx(0x8a8a8a, …). Compartilha uTime/uScale do puffFx (anima sem tick novo) e em quality:'low' o _tintFx devolve o puff branco → sem sistema/draw-call novo. Menor e mais perto na 1ª pessoa pra não virar blob na lente (padrão R7.6). Escala por _fxTune.smoke (novo campo).
  • Tranco mais perceptível_shotRecoil sobe teto/ganho do st.sh (0.013/0.16 → 0.020/0.22); _updatePlayer aplica um roll leve no eixo Z reusando o mesmo st.sh decadente numa frequência diferente do pitch (61 vs 78) → lê como "tremida", não só punch vertical. Vale pra mouse e toque (câmera finaliza num ponto só). Respeita ?gunfeel=0 (roll só existe no caminho do spring) e ADS (já reduz 32%).
  • Cápsulas mais visíveis_casingGeo maior (0.016×0.05, 8 seg), brass com metalness:1.0 + emissive leve, arco um pouco maior (up 1.7→2.0) e vida 1.6s → 2.2s.

Por que é barato

Reaproveita GPUParticles, _tintFx, _muzzleWorld, _flash, _shotRecoil, _ejectCasing e _fxTune. Custo: +1 draw call (partículas de fumaça, ring-buffer), sem alocação por tiro. Cápsulas e tranco já existiam — aqui só foram amplificados; a fumaça do cano é o único efeito novo.

Como testar

  1. npm run dev → atirar de rifle/pistola: baforada cinza dissipando na boca.
  2. Rajada da AK: tremida leve (pitch + roll); ADS treme menos; ?gunfeel=0 volta ao comportamento antigo.
  3. Cápsulas maiores brilhando, quicando e sumindo em ~2s (faca não ejeta).
  4. ?quality=low: fumaça cai pro puff branco, sem engasgo.

🤖 Generated with Claude Code

Aproveita a ideia de um FPS de referência (fumaça, cápsulas voando, tranco
por tiro) reusando a infra que já existe — sem lib nova, zero alocação por tiro:

- fumaça do cano por tiro em _flash(): GPUParticles via _tintFx (compartilha
  uTime/uScale do puff; em quality:low degrada pro puff branco, sem draw call novo).
  Menor/mais perto na 1a pessoa pra não virar blob na lente (padrão R7.6).
- tranco de tela mais perceptível: _shotRecoil sobe o teto/ganho de st.sh
  (0.013/0.16 -> 0.020/0.22) e _updatePlayer aplica um roll leve no eixo Z
  reusando o mesmo st.sh decadente (freq 61 vs 78 do pitch) => "tremida", não
  só punch vertical. Vale pra mouse e toque; respeita ?gunfeel=0 e ADS.
- cápsulas mais visíveis: geo maior (0.016x0.05, 8 seg), brass com metalness 1.0
  + emissive leve, arco um pouco maior e ttl 1.6s -> 2.2s.
- _fxTune ganha campo smoke pra tunar/desligar a fumaça via dev tooling.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Emerson Garrido <emersongarrido.dev@gmail.com>
Agent: Claude Code
@vercel

vercel Bot commented Aug 21, 2026

Copy link
Copy Markdown

@EmersonGarrido is attempting to deploy a commit to the rubenmarcus' projects Team on Vercel.

A member of the Team first needs to authorize it.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT csbrasil-BOT added needs-human-gameplay Mudança exige revisão humana de gameplay/render/HUD needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main labels Aug 21, 2026
@csbrasil-BOT

csbrasil-BOT commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

csbrasil-bot classification

Note

@EmersonGarrido abriu 9 arquivo(s) · +369 −23, base main.

O que mudou

área arquivos + amostra
📚 docs 8 +185 −12 ARCH.generated.md, README.md, STATUS.md
🎮 jogo 1 +184 −11 game.js

Labels

label por quê
needs-human-gameplay toca gameplay/render/HUD/mapa/personagem — decisão de humano
needs-staging mudança de runtime/UI — valida integrado no staging antes do merge
target:main vai direto pra main, sem fila de integração

@estraga-codigo estraga-codigo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Palhaço Mal

Palhaço Mal · revisor da casa · 🤡

mapa da mudança

  • jogo (1): game.js

Tip

Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓

pente fino passado: nenhum achado que eu defenda em voz alta

Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.

impacto cruzado

graph RL
  main_js["main.js"] --> game_js["game.js"]
Loading

(grafo local de public/js, uma rodada atrás do head do PR.)

maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

Esbirro · plantão da produção · 🕵️

check vermelho parado neste PR

Caution

Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.

o quê valor
head 2f0f7623969c
checks vermelhos 3
classe outra
hora do plantão 2026-08-21T18:48:59.943Z

Vermelho:

classify (https://github.com/corosolto/client/actions/runs/32513638080/job/96870235165)
build (https://github.com/corosolto/client/actions/runs/32512877895/job/96867833658)
Vercel (https://vercel.com/git/authorize?team=rubenmarcus'%20projects&slug=rubenmarcus-projects&teamId=team_4nZdRW8viHMCXpdixaCtzZ7z&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%222f0f7623969c4248d83de7307486d3219af9b9f4%22%7D%2C%22id%22%3A%22QmXAjXk28grSfEpQPo5E7Stcr7NM5zTfb1gPE6MVLBB1en%22%2C%22org%22%3A%22corosolto%22%2C%22prId%22%3A405%2C%22repo%22%3A%22client%22%7D)

Rabo do log:

2026-08-21T18:29:51.6824629Z ##[group]Run if [ -z "$GH_TOKEN" ]; then
2026-08-21T18:29:51.6825905Z if [ -z "$GH_TOKEN" ]; then
2026-08-21T18:29:51.6828246Z   echo "::error::CSBRASIL_BOT_TOKEN ausente — crie o secret (PAT da conta csbrasil-bot, scopes: repo/workflow). Sem ele o classify posta como github-actions[bot] ou não posta."
2026-08-21T18:29:51.6830558Z   exit 1
2026-08-21T18:29:51.6831269Z fi
2026-08-21T18:29:51.6883459Z shell: /usr/bin/bash -e {0}
2026-08-21T18:29:51.6884655Z env:
2026-08-21T18:29:51.6885130Z   GH_TOKEN:
2026-08-21T18:29:51.6885575Z   PR_NUMBER: 405
2026-08-21T18:29:51.6886038Z   DESIRED_BASE_BRANCH: staging
2026-08-21T18:29:51.6886553Z ##[endgroup]
2026-08-21T18:29:51.7058585Z ##[error]CSBRASIL_BOT_TOKEN ausente — crie o secret (PAT da conta csbrasil-bot, scopes: repo/workflow). Sem ele o classify posta como github-actions[bot] ou não posta.
2026-08-21T18:29:51.7074244Z ##[error]Process completed with exit code 1.


de plantão: vi, registrei, hora no relógio 🕵️

…ado)

Investigação com régua no navegador REAL (Edge headed) provou: o caminho de tiro
executa sem exceção e RENDERIZA (cápsulas ejetam, muzzle flash dispara, fumaça
aparece como nuvem) — não era bug de código nem de cache (URL versionada ?v=<hash>
de conteúdo serve o código novo). O buraco era só na quality:'low' (perfil da
máquina fraca do dono): _tintFx devolvia o puffFx BEGE e minúsculo, então a fumaça
sumia justamente onde ele testa.

- _muzzleSmokeFx agora é GPUParticles CINZA dedicado (não cai no puff bege em low);
  1 draw call, ring buffer 64, compartilha uTime/uScale do puff (anima sem tick).
- _flash: baforadas maiores/mais numerosas (fp 3x0.2, mundo 4x0.32) pra ler como
  fumaça mesmo na low.

Nota medida: em mapa branco (Havan) fumaça clara é naturalmente de baixo contraste;
manter modesta pra não tapar a própria mira.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Emerson Garrido <emersongarrido.dev@gmail.com>
Agent: Claude Code
@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@estraga-codigo estraga-codigo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Palhaço Mal

Palhaço Mal · revisor da casa · 🤡

mapa da mudança

  • jogo (1): game.js

Tip

Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓

pente fino passado: nenhum achado que eu defenda em voz alta

Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.

impacto cruzado

graph RL
  main_js["main.js"] --> game_js["game.js"]
Loading

(grafo local de public/js, uma rodada atrás do head do PR.)

maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

Esbirro · plantão da produção · 🕵️

check vermelho parado neste PR

Caution

Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.

o quê valor
head 70fa2e7acda5
checks vermelhos 3
classe outra
hora do plantão 2026-08-21T19:49:58.079Z

Vermelho:

classify (https://github.com/corosolto/client/actions/runs/32518841591/job/96886412351)
build (https://github.com/corosolto/client/actions/runs/32518340832/job/96884886852)
Vercel (https://vercel.com/git/authorize?team=rubenmarcus'%20projects&slug=rubenmarcus-projects&teamId=team_4nZdRW8viHMCXpdixaCtzZ7z&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%2270fa2e7acda5fa60f280c0a8c913cd9e8801924f%22%7D%2C%22id%22%3A%22QmShwnB1TdjnKp9b33xHaJEQJN9F9bnDYTQeeubhpydowj%22%2C%22org%22%3A%22corosolto%22%2C%22prId%22%3A405%2C%22repo%22%3A%22client%22%7D)

Rabo do log:

2026-08-21T19:30:50.4891235Z ##[group]Run if [ -z "$GH_TOKEN" ]; then
2026-08-21T19:30:50.4891975Z if [ -z "$GH_TOKEN" ]; then
2026-08-21T19:30:50.4893326Z   echo "::error::CSBRASIL_BOT_TOKEN ausente — crie o secret (PAT da conta csbrasil-bot, scopes: repo/workflow). Sem ele o classify posta como github-actions[bot] ou não posta."
2026-08-21T19:30:50.4894639Z   exit 1
2026-08-21T19:30:50.4895075Z fi
2026-08-21T19:30:50.4939468Z shell: /usr/bin/bash -e {0}
2026-08-21T19:30:50.4940277Z env:
2026-08-21T19:30:50.4940687Z   GH_TOKEN:
2026-08-21T19:30:50.4941120Z   PR_NUMBER: 405
2026-08-21T19:30:50.4941568Z   DESIRED_BASE_BRANCH: staging
2026-08-21T19:30:50.4942056Z ##[endgroup]
2026-08-21T19:30:50.5281597Z ##[error]CSBRASIL_BOT_TOKEN ausente — crie o secret (PAT da conta csbrasil-bot, scopes: repo/workflow). Sem ele o classify posta como github-actions[bot] ou não posta.
2026-08-21T19:30:50.5294282Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

rubenmarcus added a commit that referenced this pull request Aug 21, 2026
…ergear (#411)

* feat(ci): autofix conserta o mecânico, com lista de permissão e sem mergear

MEDIDO nos últimos 29 PRs: nenhum bot deste repositório jamais commitou um
conserto. Quem conserta é sempre uma pessoa. O #405 está vermelho por
`DOCS1: documentação DESATUALIZADA`, cujo conserto é `npm run docs` mais um
commit - trabalho sem julgamento nenhum que hoje devolve o PR para o autor.

O autofix roda em `pull_request_target`, o único gatilho que enxerga secret em PR
de fork (é a mesma regra que a WSEC1 passou a guardar), regenera os blocos
derivados e empurra o commit.

A TRAVA é o que torna isso aceitável: `autofix_allowlist.py` só libera arquivo
GERADO, e o commit sai da saída dela - nunca de um `git add -A`. Encostou em
qualquer outro caminho, o bot aborta e comenta. Sem a lista, o primeiro conserto
errado reescreve o mapa de um colaborador e ninguém repara; com ela, o pior caso
é regenerar uma doc que já era derivada.

`.github/` está entre os PROIBIDOS de propósito: um bot que edita o workflow que
o governa amplia a própria permissão num commit. E as ferramentas que rodam são
restauradas da BASE antes de executar - PR nenhum reescreve o gerador e faz o bot
executar o que ele mandar.

Duas saídas sem push, porque vermelho que o autor não entende é o dano que este
trabalho inteiro está atacando: fork com "allow edits by maintainers" desligado
recebe o comando por comentário, e sem `CSBRASIL_BOT_TOKEN` o job avisa e sai
verde em vez de reprovar.

A régua AF1/AF2/AF3 guarda as três condições - escrita só depois da trava, lista
sem caminho de código, e o bot NÃO mergeia (deixar pronto e fechar são coisas
diferentes). Os quatro mutantes mordem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

* fix(ci): bot marca `pronto-pra-merge` em vez de mergear sozinho (#412)

A intenção declarada dos bots é autocorreção e autorrevisão para deixar o PR
PRONTO - não fechar o assunto. Só que o `csbrasil-bot-automerge` chamava
`gh pr merge --squash --delete-branch --auto`, e era a ÚNICA coisa que um bot
deste repositório fazia sozinho: justamente a que não devia.

O passo agora aplica a etiqueta `pronto-pra-merge` e comenta por que o PR está
pronto. Quando o PR deixa de ser elegível, a etiqueta sai - senão ela vira um
carimbo velho que ninguém confere. O botão de merge continua humano.

A AF4 estende a régua do autofix para o repositório inteiro: nenhum workflow
pode chamar `gh pr merge`. Ela ignora linha de comentário de propósito, para que
o comentário que explica por que a chamada saiu possa citá-la. O mutante
`automerge-volta` recoloca a chamada e reprova.

Fora do alcance deste repositório: o Esbirro, que repetiu o mesmo alerta de
`bundle-em-dia` a cada 30 minutos por 17 horas na issue #393 sem nunca agir, vive
em `game3/bots/vigia-prod/plantao.mjs`. Dar ação a ele é trabalho de lá.



Agent: Claude Code

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

---------

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
rubenmarcus added a commit that referenced this pull request Aug 21, 2026
* fix(ci): quem bloqueia o PR é o build do CI, não a Vercel

MEDIDO nos últimos 29 PRs: a Vercel reprovou 13 dos 14 PRs vindos de fork, sempre
com `Authorization required to deploy.` - proteção de fork da própria Vercel, que
nenhum commit do colaborador resolve. Nos PRs de casa o vermelho era build de
verdade, uma vez porque o `fetch-decals.sh` não baixou o acervo (196 de 197
decalques faltando) num soluço de rede.

O `ci.yml` já constrói o site em `pull_request`: o portão que importa existe e é
esse. A régua nova guarda as três condições que deixam a Vercel sair do caminho
crítico sem perder cobertura:

  DG1 o CI constrói no PR - sem isso, tirar a Vercel do bloqueio deixaria o PR sem
      nenhuma prova de que o site compila;
  DG2 nenhum `curl` do caminho do build corre sem `--retry`. `set -e` mais curl sem
      retry transforma soluço de rede em PR vermelho, e o autor não tem o que
      consertar - mesmo dano do portão que não pode medir;
  DG3 a etiqueta que autoriza o preview de fork é criada por quem depende dela.

A DG3 achou código morto: o job `preview` do preview-bot já sabe publicar pela CLI
da Vercel depois de conferir permissão do ator e SHA aprovado, mas dispara em
`labeled` com `preview-autorizado` - e essa etiqueta NUNCA existiu no repositório.
O bot pedia um rótulo que ninguém tinha como aplicar. Agora o próprio workflow a
cria.

Os dois ajustes que sobram são de painel da Vercel e não cabem no repositório;
ficaram escritos no PROD-READINESS.md, com o que medir.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

* feat(ci): autofix conserta o mecânico, com lista de permissão e sem mergear (#411)

* feat(ci): autofix conserta o mecânico, com lista de permissão e sem mergear

MEDIDO nos últimos 29 PRs: nenhum bot deste repositório jamais commitou um
conserto. Quem conserta é sempre uma pessoa. O #405 está vermelho por
`DOCS1: documentação DESATUALIZADA`, cujo conserto é `npm run docs` mais um
commit - trabalho sem julgamento nenhum que hoje devolve o PR para o autor.

O autofix roda em `pull_request_target`, o único gatilho que enxerga secret em PR
de fork (é a mesma regra que a WSEC1 passou a guardar), regenera os blocos
derivados e empurra o commit.

A TRAVA é o que torna isso aceitável: `autofix_allowlist.py` só libera arquivo
GERADO, e o commit sai da saída dela - nunca de um `git add -A`. Encostou em
qualquer outro caminho, o bot aborta e comenta. Sem a lista, o primeiro conserto
errado reescreve o mapa de um colaborador e ninguém repara; com ela, o pior caso
é regenerar uma doc que já era derivada.

`.github/` está entre os PROIBIDOS de propósito: um bot que edita o workflow que
o governa amplia a própria permissão num commit. E as ferramentas que rodam são
restauradas da BASE antes de executar - PR nenhum reescreve o gerador e faz o bot
executar o que ele mandar.

Duas saídas sem push, porque vermelho que o autor não entende é o dano que este
trabalho inteiro está atacando: fork com "allow edits by maintainers" desligado
recebe o comando por comentário, e sem `CSBRASIL_BOT_TOKEN` o job avisa e sai
verde em vez de reprovar.

A régua AF1/AF2/AF3 guarda as três condições - escrita só depois da trava, lista
sem caminho de código, e o bot NÃO mergeia (deixar pronto e fechar são coisas
diferentes). Os quatro mutantes mordem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

* fix(ci): bot marca `pronto-pra-merge` em vez de mergear sozinho (#412)

A intenção declarada dos bots é autocorreção e autorrevisão para deixar o PR
PRONTO - não fechar o assunto. Só que o `csbrasil-bot-automerge` chamava
`gh pr merge --squash --delete-branch --auto`, e era a ÚNICA coisa que um bot
deste repositório fazia sozinho: justamente a que não devia.

O passo agora aplica a etiqueta `pronto-pra-merge` e comenta por que o PR está
pronto. Quando o PR deixa de ser elegível, a etiqueta sai - senão ela vira um
carimbo velho que ninguém confere. O botão de merge continua humano.

A AF4 estende a régua do autofix para o repositório inteiro: nenhum workflow
pode chamar `gh pr merge`. Ela ignora linha de comentário de propósito, para que
o comentário que explica por que a chamada saiu possa citá-la. O mutante
`automerge-volta` recoloca a chamada e reprova.

Fora do alcance deste repositório: o Esbirro, que repetiu o mesmo alerta de
`bundle-em-dia` a cada 30 minutos por 17 horas na issue #393 sem nunca agir, vive
em `game3/bots/vigia-prod/plantao.mjs`. Dar ação a ele é trabalho de lá.



Agent: Claude Code

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

---------

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

---------

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
rubenmarcus added a commit that referenced this pull request Aug 22, 2026
… pode ter (#408)

* fix(ci): classify não reprova PR de fork por secret que o gatilho não pode ter

MEDIDO nos últimos 29 PRs: `classify` vermelho em 11 dos 14 vindos de FORK e em 0
dos 15 de casa. A causa não era o código de ninguém. Num PR de fork, os gatilhos
`pull_request_review` e `pull_request_review_comment` rodam SEM os secrets do
repositório - regra do GitHub - e o guard de identidade saía com erro.

A prova é o mesmo PR, o mesmo commit, dois runs: `pull_request_target` fecha em
22s com sucesso e aplica o rótulo; `pull_request_review` morre em 4s com
`GH_TOKEN` vazio. O rótulo estava certo o tempo todo; o vermelho que o
colaborador via era de um run que nunca teve chance.

Mesma regra que o #402 deu ao portão de autoria em clone raso: portão que não
pode medir não vota. O job ganha um `if:` que o restringe aos gatilhos que
enxergam secret. Para não perder o motivo pelo qual os gatilhos de review
existem - reclassificar DEPOIS que o CodeRabbit comenta, o defeito da #240 - entra
um sweep de meia em meia hora que roda no contexto base e reclassifica os PRs
abertos por `workflow_dispatch`, caminho que tem token. O classify já dedupe
rótulo e comentário, então repetir não polui o PR.

A régua nova (WSEC1) varre os 14 workflows e reprova a combinação que causou
isto: guard de secret junto de gatilho cego, sem `if:` que exclua o caso de fork.
Os dois mutantes mordem - tirar o `if:` do classify e pôr um gatilho cego no
preview-bot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

* fix(ci): quem bloqueia o PR é o build do CI, não a Vercel (#409)

* fix(ci): quem bloqueia o PR é o build do CI, não a Vercel

MEDIDO nos últimos 29 PRs: a Vercel reprovou 13 dos 14 PRs vindos de fork, sempre
com `Authorization required to deploy.` - proteção de fork da própria Vercel, que
nenhum commit do colaborador resolve. Nos PRs de casa o vermelho era build de
verdade, uma vez porque o `fetch-decals.sh` não baixou o acervo (196 de 197
decalques faltando) num soluço de rede.

O `ci.yml` já constrói o site em `pull_request`: o portão que importa existe e é
esse. A régua nova guarda as três condições que deixam a Vercel sair do caminho
crítico sem perder cobertura:

  DG1 o CI constrói no PR - sem isso, tirar a Vercel do bloqueio deixaria o PR sem
      nenhuma prova de que o site compila;
  DG2 nenhum `curl` do caminho do build corre sem `--retry`. `set -e` mais curl sem
      retry transforma soluço de rede em PR vermelho, e o autor não tem o que
      consertar - mesmo dano do portão que não pode medir;
  DG3 a etiqueta que autoriza o preview de fork é criada por quem depende dela.

A DG3 achou código morto: o job `preview` do preview-bot já sabe publicar pela CLI
da Vercel depois de conferir permissão do ator e SHA aprovado, mas dispara em
`labeled` com `preview-autorizado` - e essa etiqueta NUNCA existiu no repositório.
O bot pedia um rótulo que ninguém tinha como aplicar. Agora o próprio workflow a
cria.

Os dois ajustes que sobram são de painel da Vercel e não cabem no repositório;
ficaram escritos no PROD-READINESS.md, com o que medir.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

* feat(ci): autofix conserta o mecânico, com lista de permissão e sem mergear (#411)

* feat(ci): autofix conserta o mecânico, com lista de permissão e sem mergear

MEDIDO nos últimos 29 PRs: nenhum bot deste repositório jamais commitou um
conserto. Quem conserta é sempre uma pessoa. O #405 está vermelho por
`DOCS1: documentação DESATUALIZADA`, cujo conserto é `npm run docs` mais um
commit - trabalho sem julgamento nenhum que hoje devolve o PR para o autor.

O autofix roda em `pull_request_target`, o único gatilho que enxerga secret em PR
de fork (é a mesma regra que a WSEC1 passou a guardar), regenera os blocos
derivados e empurra o commit.

A TRAVA é o que torna isso aceitável: `autofix_allowlist.py` só libera arquivo
GERADO, e o commit sai da saída dela - nunca de um `git add -A`. Encostou em
qualquer outro caminho, o bot aborta e comenta. Sem a lista, o primeiro conserto
errado reescreve o mapa de um colaborador e ninguém repara; com ela, o pior caso
é regenerar uma doc que já era derivada.

`.github/` está entre os PROIBIDOS de propósito: um bot que edita o workflow que
o governa amplia a própria permissão num commit. E as ferramentas que rodam são
restauradas da BASE antes de executar - PR nenhum reescreve o gerador e faz o bot
executar o que ele mandar.

Duas saídas sem push, porque vermelho que o autor não entende é o dano que este
trabalho inteiro está atacando: fork com "allow edits by maintainers" desligado
recebe o comando por comentário, e sem `CSBRASIL_BOT_TOKEN` o job avisa e sai
verde em vez de reprovar.

A régua AF1/AF2/AF3 guarda as três condições - escrita só depois da trava, lista
sem caminho de código, e o bot NÃO mergeia (deixar pronto e fechar são coisas
diferentes). Os quatro mutantes mordem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

* fix(ci): bot marca `pronto-pra-merge` em vez de mergear sozinho (#412)

A intenção declarada dos bots é autocorreção e autorrevisão para deixar o PR
PRONTO - não fechar o assunto. Só que o `csbrasil-bot-automerge` chamava
`gh pr merge --squash --delete-branch --auto`, e era a ÚNICA coisa que um bot
deste repositório fazia sozinho: justamente a que não devia.

O passo agora aplica a etiqueta `pronto-pra-merge` e comenta por que o PR está
pronto. Quando o PR deixa de ser elegível, a etiqueta sai - senão ela vira um
carimbo velho que ninguém confere. O botão de merge continua humano.

A AF4 estende a régua do autofix para o repositório inteiro: nenhum workflow
pode chamar `gh pr merge`. Ela ignora linha de comentário de propósito, para que
o comentário que explica por que a chamada saiu possa citá-la. O mutante
`automerge-volta` recoloca a chamada e reprova.

Fora do alcance deste repositório: o Esbirro, que repetiu o mesmo alerta de
`bundle-em-dia` a cada 30 minutos por 17 horas na issue #393 sem nunca agir, vive
em `game3/bots/vigia-prod/plantao.mjs`. Dar ação a ele é trabalho de lá.



Agent: Claude Code

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

---------

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

---------

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* Merge da main (alpha.175) na pilha de CI, e liga o que ela citava sem definir

Dos 8 arquivos em conflito, 7 eram gerados. O único de verdade era o
package.json - e ele quase me pegou: resolvendo pela linha do `check:`, fiquei com
a lista de um lado e PERDI as DEFINIÇÕES do outro. `eval:wfsecret`,
`eval:deploygate` e `eval:autofix` viraram nome órfão de uma vez. Um nome órfão
mata o npm em "missing script" e TODOS os passos depois dele param de rodar - o
portão pararia no meio sem ninguém perceber.

Foi o segundo caso do dia: o #372 citava `eval:gelo` no `check:fast` sem nunca ter
definido o script, com a régua existindo em disco e desligada. Conflito de
`package.json` é o mais comum que existe aqui, porque todo PR que acrescenta régua
mexe na mesma linha - então isto vai se repetir.

Daí a PI: todo passo citado nos dois portões tem de estar definido (PI1) e toda
régua tem de apontar para arquivo que existe (PI2). 97 citações conferidas. Os
dois mutantes mordem, e ela reprova o #372 de verdade, não só o caso sintético.

As três réguas desta pilha também receberam o padrão do #416, que entrou na main
depois delas: prova que não morde é vermelho, não aviso.

Agent: Claude Opus 5 (Claude Code)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Commit-grande: merge da main na pilha de CI — 21 dos 24 arquivos são bloco gerado re-derivado
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>

---------

Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: o conserto encostou em arquivo fora da lista de permissão, então não commitei nada. Rode npm run docs && node tools/gen-arch.mjs e confira o que mudou.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão.

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão.

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão.

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-7j3id4se3-rubenmarcus-projects.vercel.app

@estraga-codigo estraga-codigo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Palhaço Mal

Palhaço Mal · revisor da casa · 🤡

mapa da mudança

  • docs (7): ARCH.generated.md, README.md, STATUS.md, arquitetura.md
  • jogo (1): game.js

Tip

Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓

pente fino passado: nenhum achado que eu defenda em voz alta

Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.

impacto cruzado

graph RL
  main_js["main.js"] --> game_js["game.js"]
Loading

(grafo local de public/js, uma rodada atrás do head do PR.)

maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

Esbirro · plantão da produção · 🕵️

check vermelho parado neste PR

Warning

Classe drift de gerados: bloco gerado desatualizado. Não consegui commitar (o PR vem de fork). Conserto:

npm run docs && npm run arch
o quê valor
head 466971596814
checks vermelhos 3
classe drift
hora do plantão 2026-08-23T22:30:25.523Z

Vermelho:

build (https://github.com/corosolto/client/actions/runs/32670360484/job/97270180861)
dco (https://github.com/corosolto/client/actions/runs/32670360484/job/97270180696)
Vercel (https://vercel.com/git/authorize?team=rubenmarcus'%20projects&slug=rubenmarcus-projects&teamId=team_4nZdRW8viHMCXpdixaCtzZ7z&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%22466971596814e889ba9c3b8a8d8e8f2c7bc83f0c%22%7D%2C%22id%22%3A%22QmUXQVy95EUdcY87eoU3e6jgo2xNSqzpny3hPn5XENufJT%22%2C%22org%22%3A%22corosolto%22%2C%22prId%22%3A405%2C%22repo%22%3A%22client%22%7D)

Rabo do log:

2026-08-23T22:22:35.4221980Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-23T22:22:35.4222363Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-23T22:22:35.4222750Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-23T22:22:35.4223140Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.13.15/x64/lib
2026-08-23T22:22:35.4223796Z ##[endgroup]
2026-08-23T22:22:35.5372460Z {"ok": false, "missing": ["ae78542a7195bc5fe6dad346732307fc5185e785"]}
2026-08-23T22:22:35.5436854Z ##[error]Process completed with exit code 1.
2026-08-23T22:22:37.9916764Z ##[group]Run npm run arch:check
2026-08-23T22:22:37.9917115Z npm run arch:check
2026-08-23T22:22:37.9954017Z shell: /usr/bin/bash -e {0}
2026-08-23T22:22:37.9954291Z ##[endgroup]
2026-08-23T22:22:38.0953374Z
2026-08-23T22:22:38.0954071Z > coro-solto@2.0.0-alpha.183 arch:check
2026-08-23T22:22:38.0954685Z > node tools/gen-arch.mjs --check
2026-08-23T22:22:38.0954932Z
2026-08-23T22:22:38.1396636Z ✗ ARCH1  ARCH.md está DESATUALIZADO em relação ao código.
2026-08-23T22:22:38.1398788Z          game.js tem 6937 linhas; o índice do ARCH.md não bate.
2026-08-23T22:22:38.1399651Z          Rode: npm run arch
2026-08-23T22:22:38.1516798Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

- Tecla B cicla: 1ª pessoa -> 3ª SOCOM (cintura pra cima) -> ombro colado
- Reusa buildCharacterModel dos bots (grip procedural: mount RightHand + IK + curl)
- Corpo cai na morte (ctrl.die), visivel ate em 1ª pessoa; some no respawn
- Em 3ª pessoa, tiro/fumaca saem do OLHO (_eyeWorld/_aimOrigin), nao da camera
- Doc da pega de arma no Blender: docs/RIG-PEGA-ARMA.md

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Emerson Garrido <emersongarrido.dev@gmail.com>
Agent: Claude Code
@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

Rodado pelo autofix: só arquivo gerado, conferido pela lista de permissão.

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-amrpcfer5-rubenmarcus-projects.vercel.app

@estraga-codigo estraga-codigo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Palhaço Mal

Palhaço Mal · revisor da casa · 🤡

mapa da mudança

  • docs (8): ARCH.generated.md, README.md, STATUS.md, RIG-PEGA-ARMA.md
  • jogo (1): game.js

Tip

Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓

nada aqui que quebre amanhã. amanhã é outro diff

Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.

impacto cruzado

graph RL
  main_js["main.js"] --> game_js["game.js"]
Loading

(grafo local de public/js, uma rodada atrás do head do PR.)

todo bug confessa no diff, eu só faço o interrogatório 🤡

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

Esbirro · plantão da produção · 🕵️

check vermelho parado neste PR

Caution

Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.

o quê valor
head 7535712a1913
checks vermelhos 4
classe outra
hora do plantão 2026-08-24T13:02:21.695Z

Vermelho:

portao (https://github.com/corosolto/client/actions/runs/32728095136/job/97433905300)
build (https://github.com/corosolto/client/actions/runs/32728095122/job/97433849061)
dco (https://github.com/corosolto/client/actions/runs/32728095122/job/97433848787)
Vercel (https://vercel.com/git/authorize?team=rubenmarcus'%20projects&slug=rubenmarcus-projects&teamId=team_4nZdRW8viHMCXpdixaCtzZ7z&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%227535712a19133b313f49d8142f49bc7a1fea62ec%22%7D%2C%22id%22%3A%22QmfD4oSNUKacMJvDncVsYGAq6hsHSDp8TNh6pmj1XSJwap%22%2C%22org%22%3A%22corosolto%22%2C%22prId%22%3A405%2C%22repo%22%3A%22client%22%7D)

Rabo do log:

2026-08-24T12:40:24.5888412Z ##[group]Run npm run eval:armas
2026-08-24T12:40:24.5888901Z npm run eval:armas
2026-08-24T12:40:24.5942211Z shell: /usr/bin/bash -e {0}
2026-08-24T12:40:24.5942629Z env:
2026-08-24T12:40:24.5942983Z   BASE: http://localhost:8123
2026-08-24T12:40:24.5943462Z   PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers
2026-08-24T12:40:24.5944127Z   CHROME_BIN: /opt/pw-browsers/chromium-1234/chrome-linux64/chrome
2026-08-24T12:40:24.5944712Z ##[endgroup]
2026-08-24T12:40:24.6991231Z
2026-08-24T12:40:24.6991743Z > coro-solto@2.0.0-alpha.183 eval:armas
2026-08-24T12:40:24.6992381Z > node tools/eval/armas-check.mjs
2026-08-24T12:40:24.6992701Z
2026-08-24T12:40:41.7958886Z   ARM1 armas no bloqueante (<= 12): 26  FALHOU
2026-08-24T12:40:41.8002439Z   ARM2 bots com arma de caixa (== 0):  0 de 7 bots
2026-08-24T12:40:41.8038037Z   ARM3 armas carregadas ao todo:       26 em 0s
2026-08-24T12:40:55.2978841Z   ✗ ARM1 preload bloqueante com 26 armas (teto 12)
2026-08-24T12:40:55.3003221Z   ✗ ARM3 carga tardia não chegou: parou em 26 armas
2026-08-24T12:40:55.3223197Z ##[error]Process completed with exit code 1.


de plantão: vi, registrei, hora no relógio 🕵️

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

Agent: csbrasil-bot (autofix)

Signed-off-by: csbrasil-bot <csbrasil-bot@users.noreply.github.com>
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 cs-brasil-ai-bot: candidato a preview; um mantenedor deve revisar o SHA e aplicar o label preview-autorizado.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: regenerei os blocos derivados e empurrei o commit. O PR não precisa de mais nada disso.

@github-actions

Copy link
Copy Markdown
Contributor

🤖 preview no ar → https://csbrasil-gfmfa5im8-rubenmarcus-projects.vercel.app

@estraga-codigo estraga-codigo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Palhaço Mal

Palhaço Mal · revisor da casa · 🤡

mapa da mudança

  • docs (8): ARCH.generated.md, README.md, STATUS.md, RIG-PEGA-ARMA.md
  • jogo (1): game.js

Tip

Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓

nada aqui que quebre amanhã. amanhã é outro diff

Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.

impacto cruzado

graph RL
  main_js["main.js"] --> game_js["game.js"]
Loading

(grafo local de public/js, uma rodada atrás do head do PR.)

maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

Esbirro · plantão da produção · 🕵️

check vermelho parado neste PR

Caution

Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.

o quê valor
head 2488cbef9223
checks vermelhos 4
classe outra
hora do plantão 2026-08-24T18:10:02.478Z

Vermelho:

portao (https://github.com/corosolto/client/actions/runs/32758607980/job/97532001212)
build (https://github.com/corosolto/client/actions/runs/32758607995/job/97531839307)
dco (https://github.com/corosolto/client/actions/runs/32758607995/job/97531839411)
Vercel (https://vercel.com/git/authorize?team=rubenmarcus'%20projects&slug=rubenmarcus-projects&teamId=team_4nZdRW8viHMCXpdixaCtzZ7z&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%222488cbef92237051b0776715e6dd131b7d530038%22%7D%2C%22id%22%3A%22QmUt7sUYxQVEMjXELdWMZLWEEQGbvFHNeM8bJZcn8WC5B1%22%2C%22org%22%3A%22corosolto%22%2C%22prId%22%3A405%2C%22repo%22%3A%22client%22%7D)

Rabo do log:

2026-08-24T17:50:28.1988128Z ##[group]Run npm run eval:armas
2026-08-24T17:50:28.1988454Z npm run eval:armas
2026-08-24T17:50:28.2025109Z shell: /usr/bin/bash -e {0}
2026-08-24T17:50:28.2025384Z env:
2026-08-24T17:50:28.2025886Z   BASE: http://localhost:8123
2026-08-24T17:50:28.2026212Z   PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers
2026-08-24T17:50:28.2026624Z   CHROME_BIN: /opt/pw-browsers/chromium-1234/chrome-linux64/chrome
2026-08-24T17:50:28.2026997Z ##[endgroup]
2026-08-24T17:50:28.3000328Z
2026-08-24T17:50:28.3001192Z > coro-solto@2.0.0-alpha.184 eval:armas
2026-08-24T17:50:28.3002227Z > node tools/eval/armas-check.mjs
2026-08-24T17:50:28.3002777Z
2026-08-24T17:50:44.2953540Z   ARM1 armas no bloqueante (<= 12): 26  FALHOU
2026-08-24T17:50:44.2977836Z   ARM2 bots com arma de caixa (== 0):  0 de 7 bots
2026-08-24T17:50:44.2980315Z   ARM3 armas carregadas ao todo:       26 em 0s
2026-08-24T17:51:04.4900102Z   ✗ ARM1 preload bloqueante com 26 armas (teto 12)
2026-08-24T17:51:04.4901106Z   ✗ ARM3 carga tardia não chegou: parou em 26 armas
2026-08-24T17:51:04.5091285Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-human-gameplay Mudança exige revisão humana de gameplay/render/HUD needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants