Skip to content

fix(examples): mesma correcao de log nos tres demos que ainda usam :latest (core#135, preventivo) - #137

Merged
fabianocruz merged 1 commit into
mainfrom
fix/core135-container-logs-remaining-three
Sep 6, 2026
Merged

fix(examples): mesma correcao de log nos tres demos que ainda usam :latest (core#135, preventivo)#137
fabianocruz merged 1 commit into
mainfrom
fix/core135-container-logs-remaining-three

Conversation

@fabianocruz

Copy link
Copy Markdown
Member

Continuacao do #136, que aplicou isto nos quatro validate.sh dos jobs vermelhos. Aqui vao os tres restantes: pix-nfse-skeleton, nfse-from-natural-language e whatsapp-installment-negotiation.

Por que mexer no que esta passando

Estes tres jobs estao verdes por contingencia, nao por estrutura. Eles carregavam exatamente o mesmo docker run -d --rm dos quatro que quebraram. A unica diferenca e qual imagem puxam, e isso e configuracao, nao desenho:

jobs imagem criada User
os 4 que ficaram vermelhos ghcr.io/codespar/codespar:main 2026-08-22 node (uid 1000)
estes 3 ghcr.io/codespar/codespar:latest (default) 2026-05-31 vazio = root

O :latest passa porque e de maio, roda como root e e anterior a mudanca que fez o runtime exigir um diretorio de estado onde possa escrever. Ele nao passa porque esta certo; passa porque esta velho.

No dia em que alguem mover estes tres para a imagem atual — e mover para a imagem atual e o comportamento desejado, nao um acidente — eles falham igual e sem diagnostico nenhum, e a pessoa que pegar redescobre a core#135 do zero. Custa a mesma mudanca que ja foi validada quatro vezes.

Este PR e preventivo. Nao ha job vermelho aqui para consertar.

O que mudou

Identico ao #136, ja verificado em CI real:

  • docker run -d --rm vira docker run -d. O container que morre no startup para de levar o proprio log junto.
  • cleanup_docker remove o container explicitamente, ja que o --rm saiu.
  • docker rm -f defensivo antes do docker run, contra orfao de execucao morta com SIGKILL (o nome usa $$).
  • Caminho de timeout: alem do docker logs, imprime docker inspect (status, exit code, OOM) e o tail -n 20 do $RUNTIME_LOG.
  • Caminho de falha do docker run: imprime o arquivo em vez de pedir para alguem abrir um arquivo num runner efemero.

O pix-nfse-skeleton nao usa aimock, entao o cleanup_docker dele nao tem stop_aimock; fora isso a mudanca e a mesma. Depois deste PR as linhas de docker sao byte-identicas nos sete validate.sh (mesmo hash do bloco).

$ grep -rn "docker run -d --rm" examples/*/scripts/validate.sh
  nenhum

Verificacao

bash -n limpo nos tres. Nao da para rodar o validate.sh inteiro localmente: macOS traz bash 3.2, que sob set -u engole o multibyte depois de $AIMOCK_PORT; CI roda ubuntu com bash 5.

O controle deste PR e o oposto do controle do #136. La eu precisava que a falha passasse a se explicar. Aqui eu preciso que o caminho feliz continue feliz: os tres jobs tem que permanecer verdes. Se o docker run tivesse quebrado, ficariam vermelhos; se o cleanup_docker tivesse quebrado, o container vazaria. Comento com o resultado do CI.

Refs core#135. Itens 2 e 3 da issue seguem abertos e sem dono.

…test

Preventive, not corrective. These three jobs are green today, and the reason
is contingency rather than structure: they pull ghcr.io/codespar/codespar:latest,
built 2026-05-31, which runs as root and predates the change that made the
runtime require a writable state directory. The four jobs pinned to :main
(built 2026-08-22, runs as `node` uid 1000) went red on 03/09 for exactly that
reason.

They carried the identical `docker run -d --rm`, so the day anyone moves them
to the current image they fail the same way AND with the same missing
diagnostic, and whoever picks it up rediscovers core#135 from scratch.

Same change already verified on the other four in #136: no --rm, explicit
removal in cleanup_docker, a defensive rm before docker run, and a timeout
path that prints docker inspect plus the tail of $RUNTIME_LOG. The docker
lines are now byte-identical across all seven validate.sh.

Refs core#135.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fabianocruz

Copy link
Copy Markdown
Member Author

Controle verificado: o caminho feliz continua feliz

O CI rodou. Os tres jobs que este PR toca continuam verdes, e verdes pelo motivo certo — o container sobe e responde:

validate-example-skeleton:                        starting runtime from ghcr.io/codespar/codespar:latest … runtime up after 2s
validate-example-nfse-from-natural-language:      starting runtime from ghcr.io/codespar/codespar:latest … runtime up after 2s
validate-example-whatsapp-installment-negotiation: starting runtime from ghcr.io/codespar/codespar:latest … runtime up after 2s

Era esse o controle que faltava. O #136 precisava provar que a falha passa a se explicar; este precisa provar que a mudanca nao quebra o que passava. Se o docker run tivesse quebrado, os tres ficariam vermelhos; se o cleanup_docker tivesse quebrado, o container vazaria em vez de ser removido. Nenhum dos dois aconteceu, e o runtime up after 2s confirma que o container realmente subiu, em vez de o job passar por algum atalho.

Os quatro vermelhos do rollup sao os mesmos pre-existentes da core#135, intocados por este PR.

SUCCESS  ci
SUCCESS  gitleaks
SUCCESS  validate-example-skeleton                          <- tocado aqui
SUCCESS  validate-example-nfse-from-natural-language         <- tocado aqui
SUCCESS  validate-example-whatsapp-installment-negotiation   <- tocado aqui
FAILURE  validate-example-payment-failure-triage             \
FAILURE  validate-example-boleto-expiry-fiscal-remediation    | os 4 da core#135,
FAILURE  validate-example-service-invoice-meta-tool           | nao tocados aqui
FAILURE  validate-example-installment-negotiation-meta-tool  /

@fabianocruz
fabianocruz merged commit 15dec02 into main Sep 6, 2026
5 of 9 checks passed
fabianocruz added a commit that referenced this pull request Sep 10, 2026
…re#135)

Os quatro jobs validate-example pinados em ghcr.io/codespar/codespar:main
estão vermelhos no main desde 03/09 (core#135), com a mesma assinatura no
run do main em 15dec02 e no run deste PR: o runtime roda como `node`
(uid 1000), o checkout no runner pertence ao uid 1001 com modo 755, e o
`mkdir /example/.codespar` morre em EACCES antes do /health responder.
CODESPAR_STATE_DIR não redireciona (core#135, item 3).

Conserto: o validate.sh cria `$SKELETON_DIR/.codespar` com modo 0777
antes do `docker run`, nos sete scripts que fazem o mesmo bind mount
(os três em :latest rodam como root e não precisam hoje; ganham a
mesma linha pelo motivo do #137). O diretório já é gitignored.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FV48HsCVN4Q53Yt3GwrDGG
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