Skip to content

fechamento dos riscos: pytest 5, Rust vácuo, MSB1011, identidade de pid, -k e CI - #6

Merged
CRangelP merged 14 commits into
mainfrom
fix/fechamento-riscos
Aug 8, 2026
Merged

fechamento dos riscos: pytest 5, Rust vácuo, MSB1011, identidade de pid, -k e CI#6
CRangelP merged 14 commits into
mainfrom
fix/fechamento-riscos

Conversation

@CRangelP

@CRangelP CRangelP commented Aug 8, 2026

Copy link
Copy Markdown
Owner

Rodada de fechamento: os 13 riscos ainda abertos (K1-K13) viram correção testada ou contrato especificado. Nenhum fica em "aceito e documentado" sem teste.

Defeitos confirmados por execução e corrigidos

  • pytest que não coleta nada sai 5 — o gate dava RED falso em repo saudável. Agora é cap YELLOW ("no tests collected"), e se o pytest era o único check, exit 3 com gate manual.
  • cargo test em crate sem testes sai 0 — GREEN vácuo, o mesmo defeito já corrigido em Go e .NET. Agora Rust exige evidência (tests/*.rs ou #[test] no fonte, target/ e vendor/ fora), validado com o cargo real do host nos dois sentidos.
  • MSB1011: com uma única .sln/.slnx na raiz o gate a passa explícita ao dotnet. Validado em container com SDK 8.0 real: a fixture que dava RED falso passou a YELLOW cap, e uma solução com testes em src/App/Tests/ que o gate antigo ignorava agora dá GREEN de verdade.
  • Marcadores .NET por find -maxdepth 5 com prune de bin/obj — projeto de teste fundo aparece, artefato de build não conta.

Watchdog

  • GNU timeout ganha -k 2 quando o backend suporta (probe único na resolução): processo que ignora TERM não trava mais o gate. Backend sem -k degrada limpo, e as duas formas têm teste.
  • A varredura de descendentes confere identidade do pid pelo start time antes de sinalizar — a janela de reuso de PID deixa de ser risco aceito. Fallback para ps sem lstart (BusyBox) testado com stub, e o caminho sem ps nenhum também.
  • Exit 124 documentado como contrato: reservado ao watchdog, igual ao GNU timeout.

Suítes e CI

  • Extrator de exit codes da coherence agora atravessa aspas duplas e # dentro de string (necessário para o padrão #[test] do Rust); varredura NUL-safe; arquivos de protocolo derivados por grep com piso obrigatório; asserts do rollback por linha exata.
  • CI nova: as três suítes em ubuntu (GNU timeout real, procps) e macOS com /bin/bash 3.2 de fábrica, checkout pinado por SHA, contents: read.
  • 57 casos de gate (eram 40), 5 propriedades, 49 invariantes — verdes em macOS bash 3.2 e Linux bash 5. Prova diferencial: os casos novos falham contra o gate de main exatamente nos defeitos que corrigem.

CRangelP added 13 commits August 8, 2026 13:16
…em string

O strip de comentarios rodava antes da maquina de estados, entao um '#' dentro
de aspas simples cortava a linha e desbalanceava o estado. Agora comentarios e
strings saem numa unica varredura de caracteres, com estado de aspas simples e
duplas atravessando linhas. Auto-teste com script sintetico em heredoc.
find|xargs quebrava um nome com espaco em varios argumentos: uma string morta
escondida num arquivo assim passava batido. A varredura agora e NUL-safe de
ponta a ponta e a raiz virou parametro, o que permite o auto-teste num
mktemp -d. Nome com quebra de linha continua fora de alcance, por comentario.
A lista fixa nao alcancava uma reference nova que passasse a mandar rodar o
gate. Agora ela sai de quem menciona scripts/gate.sh, com piso obrigatorio nos
tres arquivos atuais para a invariante nunca virar vacua. READMEs ficam de fora
de proposito: apresentam a skill, nao guiam o passo a passo.
…otal

O caso do arquivo nao rastreado exigia a saida inteira do porcelain igual a
'?? c.txt': qualquer entrada extra e ruido, nao quebra da propriedade. Agora
ele exige a linha presente. Onde o vazio E a propriedade (casos 1, 2, 4 e 5) a
igualdade continua.
pytest sai 5 quando não coleta nenhum teste. O gate lia isso como falha e
reprovava um repo cuja suíte mora em outro lugar — o oposto do que o cap
YELLOW existe para fazer.

run() passa a aceitar a forma estendida <kind>:<rc>:<stack>: aquele rc vira
"nada coletado", não vermelho. O watchdog continua com prioridade absoluta:
124 sai 4 antes de qualquer outra classificação.
'cargo test' num crate sem nenhum teste sai 0 dizendo "0 passed", e o gate
contava isso como suíte verde — a mesma armadilha que o Go já cobria.

Agora exige evidência antes de rodar: um .rs sob tests/ ou um #[test] /
#[cfg(test)] nas fontes, sempre ignorando target/, que é saída de build.
Sem evidência, cargo test não roda e o veredito cai no cap YELLOW.
O timeout do coreutils manda só TERM. Um check que ignora o sinal continua
vivo e o gate espera por ele para sempre — justamente o caso que o watchdog
existe para cobrir. Passa a usar -k 2, que agenda o KILL 2s depois, a mesma
escalada que o backend perl já faz na mão.

Nem todo timeout entende a flag (o do BusyBox não), então a capacidade é
sondada uma vez na resolução do backend, com um comando que não trava. Sonda
que falha — inclusive por falta de 'true' no PATH — cai no comportamento de
hoje, sem a flag.
…evivente

Entre o snapshot da árvore e a varredura pós-kill existe a janela do TERM→KILL,
2s em que o sistema pode reciclar um pid da lista. O que morresse ali e voltasse
como outro processo levava TERM e KILL sem ter relação nenhuma com o check.

O snapshot passa a guardar o start time de cada processo (ps -eo
pid=,ppid=,lstart=) e a varredura repete o ps: só sinaliza pid cujo start time
ainda confere. Parse por regex de "dois inteiros e o resto", porque lstart tem
largura variável e quebra qualquer divisão por campos.

Onde o ps não entende lstart (BusyBox), nenhuma linha casa e o watchdog volta ao
formato antigo, sinalizando por pid — degradação, não falha. Custo: um ps a
mais, e só quando o timeout dispara.
…raiz

Uma raiz com .sln e .csproj de nomes-base diferentes faz o 'dotnet build'
sem argumento morrer com MSB1011 — o gate dava RED num repo que compila.
Com exatamente uma solução não há escolha a fazer: o gate a nomeia. Duas ou
mais é decisão real e ele se abstém; um .csproj sozinho já não é ambíguo, e
por isso só sln/slnx entram na conta.
Os três globs fixos perdiam um projeto de teste em src/App/Tests/ e contavam
como suíte um marcador esquecido em bin/. A varredura agora desce cinco
níveis podando bin, obj, node_modules e .git. O /dev/null no grep evita que
ele leia stdin quando a varredura volta vazia, e o head -1 fecha o pipe no
primeiro acerto.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@CRangelP
CRangelP merged commit b2576d1 into main Aug 8, 2026
2 checks passed
@CRangelP
CRangelP deleted the fix/fechamento-riscos branch August 8, 2026 17:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant