Skip to content

perf(vram): KTX2 nas armas (259 → 32 MB) + régua que mede o relógio do jogador - #417

Open
rubenmarcus wants to merge 13 commits into
mainfrom
perf/ktx2-texturas
Open

perf(vram): KTX2 nas armas (259 → 32 MB) + régua que mede o relógio do jogador#417
rubenmarcus wants to merge 13 commits into
mainfrom
perf/ktx2-texturas

Conversation

@rubenmarcus

Copy link
Copy Markdown
Member

Empilhado sobre o #413 (a fiação do cliente fica ao lado da do meshopt). Rebasear para main quando o #413 entrar.

Summary

  • textura passa a chegar comprimida na GPU (KTX2/ETC1S) em vez de RGBA8;
  • KTX2Loader + transcoder vendorizados, no mesmo padrão do three.module.js;
  • optimize-ktx2.mjs converte as 211 texturas de personagem e arma.

O ganho, e o preço — os dois medidos

antes depois
VRAM (personagens + armas) 703 MB 87 MB (-88%)
disco 31,5 MB 38,3 MB (+6,8)
transcoder no boot +488 KB de wasm

Ou seja: ~+7,3 MB de download por visita fria em troca de -616 MB de VRAM. Numa base onde 98% das sessões roda abaixo de 30 FPS, a troca compensa — mas é troca, não almoço grátis. A decisão de mergear é sua.

Qualidade, com a régua da casa

eval:mat (cor da arma na mão contra a do chão, 12 mapas × 26 armas):

mapa WebP KTX2
praca_poderes 4,54 4,53
piscina_treta -0,92 -0,95
loja_h 0,95 0,95

A cor não se move. Perda do encoder por pixel: erro médio 3,1–4,6 de 255 (1,2–1,8%).

Três coisas que só apareceram rodando

  1. O KTX2Loader tem três dependências além do transcoder (WorkerPool.js, ktx-parse, zstddec). Sem elas o main.js para de avaliar e o menu fica morto — o jogo nem sobe.
  2. O loader precisa do renderer para saber o formato que a GPU aceita, e os módulos avaliam antes do main.js. Por isso o ktx2.js guarda a instância e a aplica na carga, não na montagem.
  3. O mat_shade.py quebrou (lia textura assumindo EXT_texture_webp). Consertado com basisu -unpack — e cuidado: o basisu escreve um PNG por nível de mipmap e um do canal alfa; pegar o primeiro da ordem alfabética compara alfa com cor e inventa ΔL* de 7. Aconteceu aqui e me fez achar, por meia hora, que o KTX2 tinha destruído a cor.

Validation

  • check:fast 58/58
  • no navegador: arma e personagem chegam como CompressedTexture com 10 mipmaps, jogo vivo
  • eval:mat sem movimento de cor

Risk

  • high — caminho de carga de textura + 211 ativos reescritos + 571 KB de terceiros vendorizados

@vercel

vercel Bot commented Aug 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
csbrasil Error Error Aug 22, 2026 8:57pm

Request Review

@csbrasil-BOT csbrasil-BOT added needs-staging Mudança precisa validação integrada em staging target:main PR apontando para a branch main labels Aug 22, 2026
@csbrasil-BOT

csbrasil-BOT commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

csbrasil-bot classification

Note

@rubenmarcus abriu 54 arquivo(s) · +1272 −41, base main.

O que mudou

área arquivos + amostra
🎨 assets 26 +0 −0 ak.glb, akm.glb, awp.glb
📚 docs 11 +32 −32 ARCH.generated.md, README.md, STATUS.md
📦 outros 7 +1043 −0 package.json, basis_transcoder.js, basis_transcoder.wasm
🎮 jogo 5 +26 −3 fparms.js, glbchars.js, ktx2.js
🧪 arnês 4 +165 −6 ARCH.md, mat_shade.py, tela-check.mjs
🤖 CI 1 +6 −0 portao-browser.yml

Labels

label por quê
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

  • assets (71): adjim.glb, ancap.glb, blackmetal.glb, bombado.glb
  • docs (11): ARCH.generated.md, README.md, STATUS.md, arquitetura.md
  • outros (6): basis_transcoder.js, basis_transcoder.wasm, ktx-parse.module.js, zstddec.module.js
  • jogo (5): fparms.js, glbchars.js, ktx2.js, main.js
  • arnês (3): ARCH.md, mat_shade.py, optimize-ktx2.mjs

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
  game_js["game.js"] --> fparms_js["fparms.js"]
  main_js["main.js"] --> fparms_js["fparms.js"]
  fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
  game_js["game.js"] --> glbchars_js["glbchars.js"]
  loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
  fparms_js["fparms.js"] --> weapons_js["weapons.js"]
  game_js["game.js"] --> weapons_js["weapons.js"]
  glbchars_js["glbchars.js"] --> weapons_js["weapons.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 🤡

rubenmarcus and others added 4 commits August 22, 2026 02:14
MEDIDO: 9,9 MB de WebP em disco viravam ~703 MB de VRAM (RGBA8 + mipmaps) — a textura só é
pequena no arquivo. Com KTX2/ETC1S ela chega COMPRIMIDA na GPU e fica em ~87 MB.

O PREÇO, medido e não escondido: disco sobe 31,5 -> 38,3 MB (+6,8) e o transcoder pesa 488 KB
de wasm no boot. Ou seja, ~+7,3 MB de download por visita fria em troca de -616 MB de VRAM.
Numa base onde 98% das sessões roda abaixo de 30 FPS, a troca compensa — mas é troca, não almoço
grátis, e a decisão de mergear é do dono.

QUALIDADE, com a régua da casa (eval:mat, cor da arma na mão contra a do chão, 12 mapas × 26
armas): praça 4,54 -> 4,53 · piscina -0,92 -> -0,95 · loja_h 0,95 -> 0,95. A cor NÃO se move.
Perda do encoder por pixel: erro médio 3,1-4,6 de 255 (1,2-1,8%).

Pré-requisitos que só apareceram rodando:
- o KTX2Loader precisa de WorkerPool.js, ktx-parse e zstddec, além do transcoder — sem os três
  o jogo nem sobe (o main.js para de avaliar e o menu fica morto);
- o loader precisa do RENDERER para saber o formato que a GPU aceita, e os módulos avaliam ANTES
  do main.js — daí o ktx2.js guardar a instância e aplicá-la NA CARGA, não na montagem;
- o mat_shade.py lia textura assumindo EXT_texture_webp e quebrou; agora desempacota KTX2 com o
  basisu. ATENÇÃO: o basisu escreve um PNG por nível de mipmap E um do canal ALFA — pegar o
  primeiro da ordem alfabética compara alfa com cor e inventa ΔL* de 7 (aconteceu aqui).

Conferido no navegador: arma e personagem chegam como CompressedTexture com 10 mipmaps, jogo
vivo, zero erro fora dos 404 conhecidos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Commit-grande: transcoder KTX2 vendorizado (wasm de 488 KB) + loader e dependências, um arquivo por peça
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
Rodado `node tools/optimize-ktx2.mjs` nas duas pastas.
armas: disco 9,2 -> 11,5 MB · VRAM 259 -> 32 MB
personagens: disco 22,3 -> 26,8 MB · VRAM 444 -> 55 MB

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Commit-grande: 71 GLBs reescritos pelo optimize-ktx2 — binário, um por personagem/arma
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
@rubenmarcus
rubenmarcus changed the base branch from perf/anims-meshopt to main August 22, 2026 01:17
@rubenmarcus

Copy link
Copy Markdown
Member Author

Rebaseado direto sobre a main e a base do PR trocada — o #413 (compressão de animação) foi fechado porque o dono jogou e os personagens deslizavam, então este PR não pode mais depender dele.

O que mudou aqui: saíram os commits de animação e o decodificador meshopt. Ficou só o KTX2, que é independente — ele mexe em textura, não em clipe. Os 570 clipes voltaram ao original (mst.glb bate byte a byte com a main) e conferi no navegador que o boneco continua animando.

Portão 58/58, e os números do KTX2 seguem os mesmos: VRAM 703 → 87 MB, disco +6,8 MB, transcoder +488 KB, e a régua de cor da casa sem movimento.

@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

  • assets (71): adjim.glb, ancap.glb, blackmetal.glb, bombado.glb
  • docs (11): ARCH.generated.md, README.md, STATUS.md, arquitetura.md
  • outros (6): basis_transcoder.js, basis_transcoder.wasm, ktx-parse.module.js, zstddec.module.js
  • jogo (5): fparms.js, glbchars.js, ktx2.js, main.js
  • arnês (3): ARCH.md, mat_shade.py, optimize-ktx2.mjs

Tip

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

limpo pelos critérios das minhas ações desta rodada

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

impacto cruzado

graph RL
  game_js["game.js"] --> fparms_js["fparms.js"]
  main_js["main.js"] --> fparms_js["fparms.js"]
  fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
  game_js["game.js"] --> glbchars_js["glbchars.js"]
  loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
  fparms_js["fparms.js"] --> weapons_js["weapons.js"]
  game_js["game.js"] --> weapons_js["weapons.js"]
  glbchars_js["glbchars.js"] --> weapons_js["weapons.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 🤡

@rubenmarcus

Copy link
Copy Markdown
Member Author

Medido na tela de personagens: 10× mais thread travada, e o elenco não aparece

"testei aqui e ta muito lerdo o carregamento dos personagens... na tela de personagens"

Medi as duas árvores no mesmo ambiente (build de produção servido estático, Chrome headless, mesmo viewport, mesma janela de 12 s depois de abrir a tela). O contador é PerformanceObserver de longtask — que é literalmente "quanto tempo a thread principal ficou presa".

main #417
thread travada 6.353 ms 64.903 ms 10,2× pior
tarefas longas 83 476 5,7× mais
maior travada única 300 ms 1.717 ms 5,7×
personagens na tela em 12 s 8 0 não encheu
até desistir de esperar 14,0 s 73,5 s

A linha que decide é a quarta: em 12 segundos a tela de personagens do #417 não mostrou nenhum item, contra os 8 da main. Não é "um pouco mais lento" — é a tela não funcionando.

Por quê

As texturas KTX2 vêm embutidas nos GLB, e Basis exige transcodificação na CPU a cada carga. A tela de personagens carrega o elenco inteiro de uma vez, então ela paga o custo de todas as texturas junto, na thread principal. A troca é real: VRAM 703 → 87 MB, mas o preço é tempo de CPU exatamente onde o jogador está olhando.

Vale registrar que setWorkerLimit não está configurado em ktx2.js — o KTX2Loader fica no padrão. Isso talvez ajude, mas 10× não se fecha só com workers.

O que eu faria

O dono já disse que assim não ajuda o jogo, e o número concorda. Duas saídas:

  1. Deixar KTX2 fora do elenco. Textura de personagem é o pior lugar para pagar transcodificação, porque a tela mostra muitos de uma vez. Mapa e arma têm carga mais espaçada — se o ganho de VRAM sobreviver só neles, talvez ainda valha.
  2. Reverter inteiro e voltar ao assunto quando houver medição de tempo até a tela pronta, não só de VRAM.

Em qualquer um dos dois: a régua deste PR mede VRAM e não mede o que quebrou. É o mesmo padrão do #413, onde a AD2 media desvio angular e o que quebrou foi contato de pé — grandeza vizinha. Se o KTX2 voltar, a régua que o guarda tem de ser "tempo até o elenco estar na tela", que é o que o jogador sente.

(Medição reproduzível: scratchpad/medir-chars.mjs na branch.)

🤖 Generated with Claude Code

@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.

rubenmarcus and others added 5 commits August 22, 2026 04:12
Nasce de duas reprovações minhas. O #413 media desvio angular quando o que quebrou era contato de
pé; o #417 media VRAM quando o que quebrou era tempo de tela. VRAM e bytes são baratos de medir e
por isso sedutores; o que o jogador sente é o relógio.

TETO COM PROCEDÊNCIA — a lição que faltou nas duas: a medição varia sozinha ±8% (4 corridas na
main: 6083, 6607, 6854, 7086 ms). O teto de 9300 ms é ~1,4× a mediana, cinco vezes o ruído
observado e bem abaixo dos 12557 ms que o KTX2 no elenco produziu. Passa ruído, morde regressão.

Mutante `lento` estrangula a CPU em 4× e acende a cláusula (10.449 ms).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
Medido: primeira linha do elenco em 12.557 ms com KTX2 contra 6.854 ms na main (1,8x). A tela de
personagens carrega o elenco inteiro de uma vez e Basis transcodifica na CPU, então o custo cai
na thread principal exatamente onde o jogador está olhando. As armas seguem em KTX2, onde a
medição não regride.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Commit-grande: 45 GLBs de personagem revertidos ao WebP — binário, um por personagem
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code

# Conflicts:
#	ARCH.generated.md
#	README.md
#	STATUS.md
#	docs/docs/comecando.md
#	docs/docs/quality-gates.md
#	docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md
#	docs/i18n/en/docusaurus-plugin-content-docs/current/quality-gates.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
Agent: Claude Code
@rubenmarcus rubenmarcus changed the title perf(vram): KTX2/Basis nas texturas — 703 MB de VRAM viram 87 MB perf(vram): KTX2 nas armas (259 → 32 MB) + régua que mede o relógio do jogador Aug 22, 2026
@rubenmarcus

Copy link
Copy Markdown
Member Author

Você tinha razão, e eu confirmei com medição própria

Medi as duas árvores no mesmo ambiente (?assetcheck=1, que força os GLBs reais — meu primeiro teste usou nav=1 e mediu o nada):

main (WebP) KTX2 no elenco
primeira linha do elenco 6.854 ms 12.557 ms (1,8×)

Personagens voltaram ao WebP. A tela de personagens carrega o elenco inteiro de uma vez e o Basis transcodifica na CPU, então o custo cai na thread principal exatamente onde o jogador está olhando.

O que sobrou, medido

As armas ficam em KTX2, e as duas telas não regridem:

main só-armas KTX2
primeira linha do elenco 6.854 ms 6.147 ms
até jogável 27,6 s 24,7 s
VRAM das armas 259 MB 32 MB

A régua que faltava

Duas vezes seguidas uma régua minha aprovou o que você reprovou jogando, e pelo mesmo motivo: media a grandeza vizinha.

VRAM e bytes são baratos de medir, e por isso sedutores. O que o jogador sente é o relógio. A TELA1 mede o tempo até a primeira linha do elenco aparecer, e roda no portão de navegador.

O teto tem procedência — a lição que faltou nas duas vezes: a medição varia sozinha ±8% (4 corridas na main: 6083, 6607, 6854, 7086 ms). O teto de 9.300 ms é ~1,4× a mediana: cinco vezes o ruído observado, e bem abaixo dos 12.557 ms que o KTX2 no elenco produziu. Passa ruído, morde regressão — e teria pego esta.

Mutante lento (CPU 4× estrangulada) acende a cláusula: 10.449 ms.

Portão 62/62. Crédito à sessão game4-fc pelo diagnóstico e pela sugestão da régua.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: dá para consertar sozinho, mas este PR está com allow edits by maintainers desligado. Rode npm run docs && node tools/gen-arch.mjs e commite — ou ligue a opção e eu faç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

  • assets (26): ak.glb, akm.glb, awp.glb, carbine.glb
  • docs (11): ARCH.generated.md, README.md, STATUS.md, arquitetura.md
  • outros (7): package.json, basis_transcoder.js, basis_transcoder.wasm, ktx-parse.module.js
  • jogo (5): fparms.js, glbchars.js, ktx2.js, main.js
  • arnês (4): ARCH.md, mat_shade.py, tela-check.mjs, optimize-ktx2.mjs
  • CI (1): portao-browser.yml

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
  game_js["game.js"] --> fparms_js["fparms.js"]
  main_js["main.js"] --> fparms_js["fparms.js"]
  fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
  game_js["game.js"] --> glbchars_js["glbchars.js"]
  loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
  fparms_js["fparms.js"] --> weapons_js["weapons.js"]
  game_js["game.js"] --> weapons_js["weapons.js"]
  glbchars_js["glbchars.js"] --> weapons_js["weapons.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 41854ff757d1
checks vermelhos 2
classe outra
hora do plantão 2026-08-22T03:52:15.813Z

Vermelho:

portao (https://github.com/corosolto/client/actions/runs/32548714163/job/96971786543)
Vercel (https://vercel.com/rubenmarcus-projects/csbrasil/7m1RFth4ALz9td45Yo59HQ4KwY9c)

Rabo do log:

2026-08-22T03:24:03.9497271Z ##[group]Run npm run eval:tela
2026-08-22T03:24:03.9497597Z npm run eval:tela
2026-08-22T03:24:03.9538094Z shell: /usr/bin/bash -e {0}
2026-08-22T03:24:03.9538545Z env:
2026-08-22T03:24:03.9538795Z   BASE: http://localhost:8123
2026-08-22T03:24:03.9539091Z   PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers
2026-08-22T03:24:03.9539478Z   CHROME_BIN: /opt/pw-browsers/chromium-1234/chrome-linux64/chrome
2026-08-22T03:24:03.9539827Z ##[endgroup]
2026-08-22T03:24:04.0553620Z
2026-08-22T03:24:04.0554561Z > coro-solto@2.0.0-alpha.176 eval:tela
2026-08-22T03:24:04.0555496Z > node tools/eval/tela-check.mjs
2026-08-22T03:24:04.0555835Z
2026-08-22T03:24:30.8821990Z   TELA1 primeira linha do elenco: 17198 ms (teto 9300) · 8 linhas
2026-08-22T03:24:32.6966377Z   ✗ TELA1 elenco levou 17198 ms para aparecer (teto 9300)
2026-08-22T03:24:32.7153778Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: dá para consertar sozinho, mas este PR está com allow edits by maintainers desligado. Rode npm run docs && node tools/gen-arch.mjs e commite — ou ligue a opção e eu faço.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: dá para consertar sozinho, mas este PR está com allow edits by maintainers desligado. Rode npm run docs && node tools/gen-arch.mjs e commite — ou ligue a opção e eu faço.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: dá para consertar sozinho, mas este PR está com allow edits by maintainers desligado. Rode npm run docs && node tools/gen-arch.mjs e commite — ou ligue a opção e eu faço.

1 similar comment
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: dá para consertar sozinho, mas este PR está com allow edits by maintainers desligado. Rode npm run docs && node tools/gen-arch.mjs e commite — ou ligue a opção e eu faço.

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>
@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.

@estraga-codigo

Copy link
Copy Markdown
Collaborator

Esbirro

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

check vermelho parado neste PR

Warning

Classe régua velha: o check reprova num contrato que este PR muda de propósito. A régua codificou o contrato antigo — o PR não está "errado". Atualizar a régua é decisão humana, o vigia não mexe.

o quê valor
head 9ec5aacec5f5
checks vermelhos 4
classe regua-velha
hora do plantão 2026-08-22T07:13:04.237Z

Vermelho:

build (https://github.com/corosolto/client/actions/runs/32558953671/job/96997434101)
autofix (https://github.com/corosolto/client/actions/runs/32558951986/job/96997430178)
dco (https://github.com/corosolto/client/actions/runs/32558953671/job/96997434400)
Vercel (https://vercel.com/rubenmarcus-projects/csbrasil/A5Hbx59fnDemrXbufs58o5JxNvrc)

Rabo do log:

2026-08-22T07:12:15.2396257Z ✗ DOCS1  a documentação está DESATUALIZADA em relação ao código.
2026-08-22T07:12:15.2399416Z          - 4 arquivo(s) com bloco gerado DESATUALIZADO: STATUS.md, docs/docs/comecando.md, ARCH.generated.md, docs/i18n/en/docusaurus-plugin-content-docs/current/comecando.md
2026-08-22T07:12:15.2400981Z          Rode: npm run docs
2026-08-22T07:12:15.2526895Z ##[error]Process completed with exit code 1.
2026-08-22T07:12:20.0341050Z ##[group]Run python3 scripts/ci/agente_check.py < /tmp/dco.json
2026-08-22T07:12:20.0341532Z python3 scripts/ci/agente_check.py < /tmp/dco.json
2026-08-22T07:12:20.0379223Z shell: /usr/bin/bash -e {0}
2026-08-22T07:12:20.0379488Z env:
2026-08-22T07:12:20.0379759Z   pythonLocation: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-22T07:12:20.0380373Z   PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.13.15/x64/lib/pkgconfig
2026-08-22T07:12:20.0380812Z   Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-22T07:12:20.0381194Z   Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-22T07:12:20.0381581Z   Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.13.15/x64
2026-08-22T07:12:20.0381963Z   LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.13.15/x64/lib
2026-08-22T07:12:20.0382296Z ##[endgroup]
2026-08-22T07:12:20.1032965Z Cada commit diz quem escreveu: acrescente o trailer 'Agent: <nome do agente ou humano>'.
2026-08-22T07:12:20.1033946Z {"ok": false, "sem_agent": ["f2e14e7f8b0ac48977e2b0757dab5f795d4b3e6d"]}
2026-08-22T07:12:20.1034577Z   git rebase --exec 'git commit --amend --no-edit --trailer "Agent: <nome>"' <base>
2026-08-22T07:12:20.1089853Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

@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.

@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

  • assets (26): ak.glb, akm.glb, awp.glb, carbine.glb
  • docs (11): ARCH.generated.md, README.md, STATUS.md, arquitetura.md
  • outros (7): package.json, basis_transcoder.js, basis_transcoder.wasm, ktx-parse.module.js
  • jogo (5): fparms.js, glbchars.js, ktx2.js, main.js
  • arnês (4): ARCH.md, mat_shade.py, tela-check.mjs, optimize-ktx2.mjs
  • CI (1): portao-browser.yml

Tip

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

limpo pelos critérios das minhas ações desta rodada

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

impacto cruzado

graph RL
  game_js["game.js"] --> fparms_js["fparms.js"]
  main_js["main.js"] --> fparms_js["fparms.js"]
  fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
  game_js["game.js"] --> glbchars_js["glbchars.js"]
  loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
  fparms_js["fparms.js"] --> weapons_js["weapons.js"]
  game_js["game.js"] --> weapons_js["weapons.js"]
  glbchars_js["glbchars.js"] --> weapons_js["weapons.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 🤡

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.

@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.

@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

  • assets (26): ak.glb, akm.glb, awp.glb, carbine.glb
  • docs (11): ARCH.generated.md, README.md, STATUS.md, arquitetura.md
  • outros (7): package.json, basis_transcoder.js, basis_transcoder.wasm, ktx-parse.module.js
  • jogo (5): fparms.js, glbchars.js, ktx2.js, main.js
  • arnês (4): ARCH.md, mat_shade.py, tela-check.mjs, optimize-ktx2.mjs
  • CI (1): portao-browser.yml

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
  game_js["game.js"] --> fparms_js["fparms.js"]
  main_js["main.js"] --> fparms_js["fparms.js"]
  fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
  game_js["game.js"] --> glbchars_js["glbchars.js"]
  loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
  fparms_js["fparms.js"] --> weapons_js["weapons.js"]
  game_js["game.js"] --> weapons_js["weapons.js"]
  glbchars_js["glbchars.js"] --> weapons_js["weapons.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 🤡

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

@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 caaf6c018bb1
checks vermelhos 4
classe outra
hora do plantão 2026-08-22T21:14:47.470Z

Vermelho:

portao (https://github.com/corosolto/client/actions/runs/32598157356/job/97092235790)
build (https://github.com/corosolto/client/actions/runs/32598157398/job/97092235897)
dco (https://github.com/corosolto/client/actions/runs/32598157398/job/97092235815)
Vercel (https://vercel.com/rubenmarcus-projects/csbrasil/HQrz5nDzjMFM69qyFJiXjXZJUjqF)

Rabo do log:

2026-08-22T20:59:55.7350378Z ##[group]Run npm run eval:tela
2026-08-22T20:59:55.7350785Z npm run eval:tela
2026-08-22T20:59:55.7396077Z shell: /usr/bin/bash -e {0}
2026-08-22T20:59:55.7396404Z env:
2026-08-22T20:59:55.7396680Z   BASE: http://localhost:8123
2026-08-22T20:59:55.7397046Z   PLAYWRIGHT_BROWSERS_PATH: /opt/pw-browsers
2026-08-22T20:59:55.7397508Z   CHROME_BIN: /opt/pw-browsers/chromium-1234/chrome-linux64/chrome
2026-08-22T20:59:55.7397935Z ##[endgroup]
2026-08-22T20:59:55.8198644Z
2026-08-22T20:59:55.8199276Z > coro-solto@2.0.0-alpha.179 eval:tela
2026-08-22T20:59:55.8199736Z > node tools/eval/tela-check.mjs
2026-08-22T20:59:55.8199934Z
2026-08-22T21:00:16.3640266Z   TELA1 primeira linha do elenco: 12292 ms (teto 9300) · 8 linhas
2026-08-22T21:00:18.0152020Z   ✗ TELA1 elenco levou 12292 ms para aparecer (teto 9300)
2026-08-22T21:00:18.0303251Z ##[error]Process completed with exit code 1.


nada fora do normal no meu turno 🕵️

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

5 similar comments
@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

@csbrasil-BOT

Copy link
Copy Markdown
Collaborator

🤖 autofix: a base andou e o conflito encostou em arquivo de código — não é meu para resolver. Os arquivos em conflito estão no log do run; rode git merge origin/main e decida.

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

Labels

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