release: ci-shared v0.2.0 (develop → main) — Trivy do ci-base + pin 0.74 + guard de deploy #100

Merged
tarcisio merged 47 commits from develop into main 2026-10-10 11:40:40 -03:00
Owner

Release ci-shared v0.2.0 (develop → main)

⛔ No merge, DESMARQUE "apagar branch após merge". Não apagar a develop. A source deste PR é o trunk. Em 08/10 o release #61 apagou a develop assim (INFRA-68957).

Os produtos consomem os reusáveis por @main: só depois deste merge o que está abaixo chega à frota.

Entra

  • #82 checkout do security-trivy (ci-base) em PR→main cai para refs/pull/N/head (TH-60348). Destrava o release do HelpCor e todo PR→main de quem usa o ci-base.
  • #84 pin da tmf-ci-trivy em 0.74.0-db20261009-e231b48 (INFRA-69010 / decisão da INFRA-69046).
  • #83 build-ci-images.yml: schedule só para o build-trivy-ci (INFRA-68880 / ADR 0018).
  • #81 guard global de autorização do deploy de produção, com 4 bypasses fechados (INFRA-68070, segurança).
  • #79 reusable-sonar.yml: SonarQube só como relatório (INFRA-69052).
  • #87 VERSION 0.2.0 + CHANGELOG.
  • #89 .claude/config.json: issue_modules: ["ci"] (só config de sessão, sem efeito no CI).
  • #90 README: exceção nomeada para o PR semanal do pin do Trivy ir direto para a main.
  • #88 chave deploy_gate (padrão false) no release.yml + modo host no tmf-deploy-gate (INFRA-68093).
  • #93, #94 backmerges main → develop (sem mudança de conteúdo).
  • #97 constraints/frota.txt: pisos de CVE (jinja2, python-multipart, sentry-sdk), com o impacto medido na frota.
  • #98 release.yml: depois do deploy, as issues do release vão para done no Hub (chave deploy_hub_done, padrão true, continue-on-error) (INFRA-69129).
  • #99 teto do cache do buildkit: docker buildx prune --max-used-space (padrão 10gb) ao fim dos jobs de build-ci-images, cve-os e install-docker, mais gc no builder (INFRA-69215).
  • #88, #98 e #99 estão em [Não lançado] no CHANGELOG.

Depois do merge (operador)

  • Tag v0.2.0 no merge commit da main.
  • Conferir que a develop e a default_branch continuam de pé (pr.py conferir-trunk).

Aberto pelo /deploy-safe e parado aqui: merge e tag ficam com o operador.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2

## Release ci-shared v0.2.0 (develop → main) > ⛔ **No merge, DESMARQUE "apagar branch após merge". Não apagar a develop.** A source deste PR é o trunk. Em 08/10 o release #61 apagou a develop assim (INFRA-68957). Os produtos consomem os reusáveis por `@main`: só depois deste merge o que está abaixo chega à frota. ### Entra - **#82** checkout do `security-trivy` (ci-base) em PR→main cai para `refs/pull/N/head` (TH-60348). **Destrava o release do HelpCor** e todo PR→main de quem usa o ci-base. - **#84** pin da `tmf-ci-trivy` em `0.74.0-db20261009-e231b48` (INFRA-69010 / decisão da INFRA-69046). - **#83** `build-ci-images.yml`: `schedule` só para o `build-trivy-ci` (INFRA-68880 / ADR 0018). - **#81** guard global de autorização do deploy de produção, com 4 bypasses fechados (INFRA-68070, segurança). - **#79** `reusable-sonar.yml`: SonarQube só como relatório (INFRA-69052). - **#87** VERSION 0.2.0 + CHANGELOG. - **#89** `.claude/config.json`: `issue_modules: ["ci"]` (só config de sessão, sem efeito no CI). - **#90** README: exceção nomeada para o PR semanal do pin do Trivy ir direto para a main. - **#88** chave `deploy_gate` (padrão false) no release.yml + modo `host` no tmf-deploy-gate (INFRA-68093). - **#93**, **#94** backmerges main → develop (sem mudança de conteúdo). - **#97** `constraints/frota.txt`: pisos de CVE (jinja2, python-multipart, sentry-sdk), com o impacto medido na frota. - **#98** release.yml: depois do deploy, as issues do release vão para `done` no Hub (chave `deploy_hub_done`, padrão true, continue-on-error) (INFRA-69129). - **#99** teto do cache do buildkit: `docker buildx prune --max-used-space` (padrão 10gb) ao fim dos jobs de build-ci-images, cve-os e install-docker, mais gc no builder (INFRA-69215). - #88, #98 e #99 estão em [Não lançado] no CHANGELOG. ### Depois do merge (operador) - Tag `v0.2.0` no merge commit da main. - Conferir que a develop e a default_branch continuam de pé (`pr.py conferir-trunk`). Aberto pelo `/deploy-safe` e parado aqui: merge e tag ficam com o operador. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
feat(ci): reusable-sonar — análise SonarQube só relatório, nunca vermelho [INFRA-69052]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m15s
d90bad0090
Scanner do espelho tmf/mirror/sonar-scanner-cli:12.2.0.4256_8.1.0; SONAR_TOKEN do
Infisical (INFRA/prod/ci) pelo carregador embutido (cópia idêntica, coberta por
tests/infisical-secrets); sonar.qualitygate.wait=false. Job preparo pula com
:⚠️: sem token, servidor fora, token recusado ou imagem sem tag fixa; job
analise com continue-on-error e passo final que vira aviso. Roda em push para
develop, schedule e dispatch; nunca em PR. Testes em tests/sonar e docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
feat(ci): guard global de autorização do deploy de produção [INFRA-68070]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m55s
9e029ef4af
scripts/ci/conferir_autorizacao_deploy.py vira canônico no ci-shared (origem: Hub
PR #3321 + DANI ffa630037b), mesma interface (conferir, descobrir-pr). Regras novas:
- data da frase no fuso America/Sao_Paulo; vale só hoje e ontem (amanhã reprova);
- strip() nas pontas continua aceito;
- quebra de linha, caractere de controle ou '::' na frase/tag reprova antes de
  qualquer eco; a frase só vai ao log depois de validada, numa linha;
- push só passa sem frase se o ref for refs/tags/v*;
- RE_PR casa (#N) e (!N).

tests/deploy-guard: 61 testes (unittest), incluindo os 6 xfail estritos do DANI
como regra decidida, com controle negativo contra o script antigo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
fix(ci): guard de deploy fecha 4 bypasses da revisão de segurança [INFRA-68070]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m46s
c3daf160f7
- F1: push de tag refs/tags/v* deixa de ser passe livre: a tag (e o GITHUB_SHA)
  tem de ser o merge commit de PR mergeado em main, com o mesmo ato humano do
  release-aprovado; sem PR, sem ato ou sem token: Recusa.
- F2: ato humano só de DEPLOY_APROVADORES (padrão tarcisio, minúsculas) para
  review, merged_by e AUTORIZO hotfix; bot nunca conta.
- F3: ref decisório só do GITHUB_REF; DISPATCH_REF só se idêntico; dispatch
  só de refs/heads/main.
- F4: review só conta com official: true (ausente não conta).

Cada bypass tem teste que falha no 9e029ef (21 falhas) e passa aqui.
Guia de adoção documenta DEPLOY_APROVADORES e o limite da frase manual
(não criptográfica; bloqueio real na INFRA-68022/68023).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
fix(ci-base): checkout do security-trivy cai para refs/pull/N/head em PR [TH-60348]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 7m27s
0edcc9f1f9
Terceiro sintoma da TH-60348. O checkout git puro do security-trivy tentava o
github.sha e, se recusado, o github.ref. Em pull_request os DOIS são
não-anunciados pelo Forgejo (merge-SHA e refs/pull/N/merge), então todo PR→main
de quem usa o ci-base falhava em ~5s no setup — foi o release v2.89.0 do HelpCor
(#1438). Em PR→develop o gate dá "não se aplica" e ninguém via.

Aditivo: em pull_request o fallback passa a ser refs/pull/<number>/head (sempre
anunciado; para trivy fs em lockfiles é o mesmo conteúdo do merge). Fora de PR
segue o ref do evento. Push e PRs que já funcionavam não mudam.

Teste: TestCiBaseTrivyCheckoutDePR (ordem SHA → head do PR → ref do evento).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(ci-images): build-ci-images sem schedule — lar é o tmf_imagens [INFRA-68880]
Some checks failed
PR checks (ci-shared) / testes (pull_request) Has been cancelled
f061757d7a
O build-ci-images.yml restaurado no #59 roda os mesmos crons do tmf_imagens
(dia 1 03:00 e segunda 06:00 UTC) e publica as mesmas tags em tmf/ci-images:
corrida de escrita, quem roda por último vence. Pela ADR 0018 (item 1) o lar é o
tmf_imagens. Tira só o `schedule:`; `workflow_dispatch` fica como reserva. A
remoção completa (este arquivo + ci-images/) vem depois que o tmf_imagens provar
a paridade.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(ci-images): schedule fica só para o build-trivy-ci [INFRA-68880]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m52s
9290926032
Correção do commit anterior, com a medição da TMF Imagens: o tmf_imagens não
publica a tmf-ci-trivy:0.68.2 com origem interna, e o gate da frota está pinado
nela (reprova DB com mais de 10 dias). Se o refresh semanal parar, o gate quebra
por volta de 19/10. O `schedule:` volta, mas só o build-trivy-ci reage a ele; os
5 jobs que ainda rodavam no cron (python, node, nginx, php, deploy) saem — a cópia
deles aqui está atrasada e sobrescrevia as imagens boas do tmf_imagens. O
schedule do trivy sai depois que a INFRA-69046 mover o pin para a 0.74.

Teste-guarda: test_build_ci_images_schedule (só build-trivy-ci no schedule).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Reviewed-on: #81
Reviewed-on: #82
Reviewed-on: #83
A fila do produto infra é compartilhada (Imagens, Observabilidade, tmf_ia). Sem
issue_modules o /issue-loop pegaria a fila inteira (139 candidatas medidas); com
ele, só as do módulo ci (2 hoje). Issue sem módulo não entra — a classificação é
do Lineu/Gestor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
chore(trivy): pin da tmf-ci-trivy em 0.74.0-db20261009-e231b48 [INFRA-69010]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m4s
ecc2fb0394
Rebuild semanal verde da tmf-ci-trivy no TMF/tmf_imagens; digest sha256:a9a0fca35ba94978ebdb722eb15350d76f417ba39f885570b11a852146363395.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Reviewed-on: #84
O release.yml mandava `bash -s -- <modo> ...` com o deploy-remoto.sh pelo stdin e
`hostname` como guarda de host; o tmf-deploy-gate (comando forçado da chave SSH) só
aceita `<modo> 'K=v' ...`, ignora stdin e recusa `hostname`. Contratos incompatíveis.

- schema/ci_config: chave `deploy_gate` (boolean, padrão false), publicada pelo job tag
  e passada ao job deploy por env (DEPLOY_GATE).
- release.yml: com true, deploy/rollback/orfaos vão como `ssh deploy "<modo> 'K=v' ..."`
  sem stdin e sem CODE_DIR/ENV_DIR/CONTAINER (o conf do gate manda); a guarda de host
  usa `ssh deploy host`. Com false, o comando é o de sempre. Valor fora de true|false
  falha antes do SSH. Aspas simples recusadas sem subshell (o exit vale).
- tmf-deploy-gate: modo `host` (sem argumentos, só `uname -n`). `hostname` continua
  recusado de propósito: host com gate e chave false falha CEDO na guarda, com a
  mensagem "o host tem o tmf-deploy-gate: ponha deploy_gate: true".
- testes: tests/release/test_deploy_gate_contrato.py roda os passos do release.yml com
  ssh falso ligado ao gate real (true passa; false recusado; estrutura stdin/sem stdin);
  modo host em test_tmf_deploy_gate.py.
- docs: guia-de-adocao (chave + roteiro liga/desliga), exemplo do ci-config, CHANGELOG.

Não verificado em host real: o gate segue desligado.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Merge origin/develop em feat/INFRA-68093-deploy-gate-contrato [INFRA-68093]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m14s
d818ac4918
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
chore(ci): Trivy 0.74.0 (imutável db20261009-e231b48) nos reusables e no SBOM [INFRA-69046]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m20s
aa6f0fe053
Sai a 0.68.2 da faixa do incidente de supply chain (GHSA-69fq-xp46-6x23). ci-base, ci,
reusable-image-cve-os e reusable-trivy-scan pinam tmf-ci-trivy:0.74.0-db20261009-e231b48;
o reusable-sbom troca a camada do binário (sha256:4c984bdd…, digest conferido no registry) e o
sha256 do binário (d89bcc65…, o mesmo verificado por sigstore no pacote generic TMF/trivy-cli).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axu8pSLigGKWaQj1sASKC
feat(cve): gate de imagem avalia bibliotecas contra a lista única, por ecossistema [INFRA-69093]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m58s
99c14bf95b
cve_os_gate.py ganha --com-libs: lang-pkgs do Trivy (python-pkg/pip/poetry/uv → pypi; node-pkg/npm/
yarn/pnpm → npm) casam com a lista única por (ecossistema, pacote normalizado, produtos). Exceção os só
cobre SO e pypi só cobre lib Python (antes o casamento ignorava o ecossistema); lib de outro ecossistema
corrigível reprova. Sem a flag, comportamento igual, e exceção pypi/npm não aparece como morta.
reusable-image-cve-os.yml: input libs (padrão false) liga --pkg-types os,library e --com-libs juntos.
Prova com os scans reais da tmf-superset: candidata rc=0 (5 cobertas pela lista do ORG #403), imagem de
produção rc=1; vencida a validade, a candidata reprova.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axu8pSLigGKWaQj1sASKC
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
chore(release): v0.2.0 — CHANGELOG inclui o pin do trivy 0.74 (#84)
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m41s
26f75aff80
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
merge: develop em feat/INFRA-69084-issue-modules-ci
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m46s
d1b9b0ac57
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
docs(readme): exceção nomeada — PR semanal do pin do Trivy direto para a main [INFRA-69010]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m6s
68b7ebfaf6
Decisão do operador (09/10): os produtos consomem o ci-shared por @main e o gate
de CVE reprova DB do Trivy com mais de 10 dias. O PR do pin vai para a develop E
para a main com o mesmo commit. Fica registrado com escopo estreito: título
chore(trivy): pin, branch chore/pin-trivy-*, só a tag tmf-ci-trivy nos 4
workflows que a fixam, CI verde e aprovação humana.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Reviewed-on: #85
Reviewed-on: #86
Merge pull request 'chore(release): v0.2.0 — bump + CHANGELOG' (#87) from release/v0.2.0 into develop
All checks were successful
PR checks (ci-shared) / testes (push) Successful in 4m39s
191248d9b4
Reviewed-on: #87
Reviewed-on: #89
Reviewed-on: #90
fix(hub-issue-sync): template passa TMF_HUB_TOKEN na falta de HUB_TOKEN [INFRA-68751]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m14s
e5c73b3623
Nenhum repo da frota tem o secret HUB_TOKEN (levantamento por nome, 09/10): o input chegava vazio e o
sync dependia do Infisical. Hub, Platform, HelpCor e Tennis têm TMF_HUB_TOKEN, que agora entra como
fallback. exigir_token fica de fora até tmf9, DANI, Priceshow e Fina terem token (decisão do operador,
09/10). Nenhum produto usa a versão atual do template (DANI/Tennis/Priceshow estão no .anterior, só
closed, que segue aceito com aviso), então mudar no lugar não deixa ninguém vermelho.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014axu8pSLigGKWaQj1sASKC
chore(git): backmerge main → develop (só merges de release, sem mudança de conteúdo) [INFRA-68957]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m14s
b8dd3169e1
A develop não continha os 5 merges de release da main (#69, #73, #76, #78 e o
merge intermediário). O conteúdo é idêntico, mas o pré-check do pr.py recusa o
release develop→main enquanto a develop estiver atrás da main. O ci-shared não
tem backmerge.yml automático.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
merge: develop em feat/INFRA-68093 — CHANGELOG: deploy_gate fica em [Não lançado] (a 0.2.0 já fechou) [INFRA-68093]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m36s
e37a563f77
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Reviewed-on: #88
Reviewed-on: #93
chore(git): backmerge main → develop após o pin direto na main (#91) [INFRA-69010]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m41s
a8b7492ecc
O #91 (exceção do pin do Trivy) entrou na main com um commit próprio, não o
mesmo da develop. O conteúdo já estava na develop; o merge não muda arquivo,
só devolve à develop o histórico da main — o pré-check do pr.py recusa o
release develop→main enquanto a develop estiver atrás.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(build): todo docker build com --pull, inclusive o gate de CVE de SO [INFRA-69062]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m28s
4f56eb81c4
Sem --pull o build usa a base do cache do runner: a imagem da v3.10.0 do DANI saiu com o uv
antigo (quinn-proto 0.11.14) porque a tmf-python-base:3.12-uv flutuante estava velha no cache.
No reusable-image-cve-os o efeito é pior: o gate escanearia uma base velha e daria verde.
- build-ci-images.yml: 3 builds sem --pull
- reusable-image-cve-os.yml: buildx build --pull
- tests/soberania/test_build_sempre_com_pull.py: todo docker build dos workflows tem --pull

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
feat(release): deploy de produção fecha as issues do release (approved → done) [INFRA-69129]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m27s
03e12b2bc7
Nada na frota levava issue a done: o hub-issue-sync para em approved no merge em develop
e não mexe no merge em main ("o deploy leva a done"), mas nenhum deploy fazia isso.

- release.yml (job deploy): três passos depois do deploy por tag com sucesso, só em prod,
  atrás da chave nova deploy_hub_done do ci-config (padrão true), todos com
  continue-on-error — falha do Hub vira :⚠️:, nunca derruba o deploy.
  HUB_TOKEN do Infisical do produto (infisical_*), mesmo mecanismo do hub-issue-sync.
- scripts/hub_done_no_deploy.py: chaves do assunto dos commits <tag anterior>..<tag>
  (branch do merge pelo assunto, corpo nunca, mesma regex do hub-issue-sync); pula chave
  com commit em origin/develop fora da tag (git log --cherry-pick --right-only); só
  approved → done (API v2); recusa do Hub (filha aberta) = pulada; comentário com tag,
  SHA e run; resumo no GITHUB_STEP_SUMMARY.
- tests/hub-done-no-deploy: repo git temporário com tags, Hub falso e contrato do yaml.
- docs (guia de adoção, scripts, workflows reusáveis), exemplo do ci-config e CHANGELOG.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(constraints): pisos de CVE para jinja2, python-multipart e sentry-sdk [TMF9-69150]
Some checks failed
PR checks (ci-shared) / testes (pull_request) Has been cancelled
67bf064c92
Achado do pip-audit do reusable-trivy-scan no tmf9: três libs com CVE que tem
correção. Pisos na constraint da frota: jinja2>=3.1.6,<4 (PYSEC-2026-1471/1472/
1475), python-multipart>=0.0.32 (PYSEC-2026-3040), sentry-sdk>=1.45.1
(PYSEC-2026-1917). Sem teto <2 no sentry: 5 produtos já estão na 2.x.

Provado em tmf-ci-python:3.12 (uv 0.11.26): uv lock --check e uv sync --frozen
ignoram UV_CONSTRAINT; pip install com pin abaixo do piso falha. Todo produto
medido tem uv.lock no backend, então nenhum CI quebra; quem está abaixo sobe o
lock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
docs(constraints): cabeçalho diz o alcance — uv com lock ignora a lista; só pip legado é barrado [TMF9-69150]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m45s
a79c43a450
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
- hub_done_prefixos: só chaves do produto vão a done; vazio = nada move (:⚠️:)
- container (epic/initiative/issue com subtarefas, pelo campo type) pulado: decisão humana
- chave com commit Revert no intervalo pulada
- HUB_DONE_REFS com origin/epic/* (glob via git for-each-ref); squash develop→main documentado
  como falha para o lado seguro
- ensaio automático (só lista) no 1º deploy sem tag anterior e acima de 50 candidatas;
  HUB_DONE_DRY_RUN força; hub_done_issue_controle opcional recebe a lista
- docs: HUB_TOKEN do produto direto na API; trava HUB_STATUS_HUMANO não se aplica
  (decisão do operador, 09/10/2026)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
Merge origin/develop em feat/INFRA-69129-done-no-deploy-v2
Some checks failed
PR checks (ci-shared) / testes (pull_request) Failing after 23m40s
ad1d23531f
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
Reviewed-on: #94
Reviewed-on: #97
Reviewed-on: #98
fix(ci): cache de build com teto em todo job que builda imagem [INFRA-69215]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m30s
557ab18158
O disco raiz do host do runner (tmf-prod) lotou; o maior escritor era o cache
do buildkit que os jobs de build deixavam e ninguém removia (INFRA-69105).

- build-ci-images.yml (8 jobs), reusable-image-cve-os.yml (cve-os) e
  install-docker.yml (install) terminam com "Limpar cache de build (teto)":
  if: always(), continue-on-error, `docker buildx prune -f --builder <o que o
  job usou> --filter until=24h --max-used-space <teto>`; falha vira :⚠️:.
- Teto padrão 10gb: input build_cache_max_used_space nos reusáveis,
  env.BUILD_CACHE_MAX_USED_SPACE no build-ci-images.
- Flags medidas no buildx v0.36.0 da tmf-ci-docker:29.7.1-20261009-2e51884
  (--keep-storage depreciado -> reserved-space; o teto é --max-used-space).
- buildkit-builder nasce com --buildkitd-config (gc = true, gcpolicy com
  keepDuration 24h + maxUsedSpace); builder antigo sem gc gera :⚠️: e
  não é recriado à força.
- tests/cache-build: reprova job de build sem a limpeza como último passo,
  builder errado, system prune -a / volume prune / --keep-storage.
- CHANGELOG e docs/workflows-reusaveis.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Merge pull request 'fix(ci): cache de build com teto em todo job que builda imagem [INFRA-69215]' (#99) from fix/INFRA-69215-cache-buildkit into develop
All checks were successful
PR checks (ci-shared) / testes (push) Successful in 3m42s
PR checks (ci-shared) / testes (pull_request) Successful in 3m49s
eaa7695aa1
Sign in to join this conversation.
No reviewers
No labels
seguranca
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
TMF/ci-shared!100
No description provided.