release: develop → main (8 INFRA aprovadas) #61

Merged
tarcisio merged 25 commits from develop into main 2026-10-08 16:02:19 -03:00
Owner

Release develop → main (25 commits)

Decisão do operador (sessão ORG/Lineu, 08/10/2026): fazer release das INFRA aprovadas que estão só na develop.

⚠️ Efeito do merge na frota

Os produtos consomem os reusables (ci.yml, ci-base.yml, release.yml...) pela main, então o merge muda o CI de todos os produtos na hora. Paths ci-images/images/*/Dockerfile também disparam build-ci-images.yml.

Chaves que entram (8)

INFRA-64942, INFRA-67340 (a correção já estava na main; entra o 46758b17f, da INFRA-68880), INFRA-68076, INFRA-68520, INFRA-68807, INFRA-68877, INFRA-68878, INFRA-68879.

Depois do merge, essas chaves vão para done no Hub, com o sha do merge como prova.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WkwTSVQjCH43hp1U5Fmc3x

## Release develop → main (25 commits) Decisão do operador (sessão ORG/Lineu, 08/10/2026): fazer release das INFRA aprovadas que estão só na develop. ### ⚠️ Efeito do merge na frota Os produtos consomem os reusables (`ci.yml`, `ci-base.yml`, `release.yml`...) pela `main`, então o merge muda o CI de **todos os produtos** na hora. Paths `ci-images/images/*/Dockerfile` também disparam `build-ci-images.yml`. ### Chaves que entram (8) INFRA-64942, INFRA-67340 (a correção já estava na main; entra o `46758b17f`, da INFRA-68880), INFRA-68076, INFRA-68520, INFRA-68807, INFRA-68877, INFRA-68878, INFRA-68879. Depois do merge, essas chaves vão para `done` no Hub, com o sha do merge como prova. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01WkwTSVQjCH43hp1U5Fmc3x
feat(hub-sync): PR aberto move a issue para review e falha alto sem HUB_TOKEN [INFRA-68386]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m46s
e5213ee6b7
- hub-issue-sync.yml: roda também em pull_request opened/reopened e leva as keys do título e da branch para review (qualquer base; nunca regride). Fechado sem merge segue sem fazer nada.
- Sem HUB_TOKEN, e só quando o sync se aplicaria, falha alto (::error:: + exit 1) atrás do input exigir_token, desligado por padrão até DANI e tennis-tracking terem o secret.
- Os passos do fallback do token (checkout, ci-config, Infisical) valem também para PR aberto.
- Template chamador: types [opened, reopened, closed]; a versão anterior fica em templates/hub-issue-sync-chamador.anterior.yml e o conferir-ci-identico.sh a aceita com aviso na transição.
- Testes: 38 em tests/hub-issue-sync (controle negativo: 11 falham no workflow antigo) e ajuste de um teste do ci-config.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
Reviewed-on: #48
feat(ci): reprovar if: em job-caller de reusable, que pula o gate e mostra success [INFRA-65706]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m47s
11e11c8820
- scripts/conferir_if_em_caller.py: sem dependencias, le o texto por indentacao; reprova com ::error file,line o job que tem uses: e if: no mesmo nivel (steps nao contam); excecao so com '# if-caller-ok: <motivo>'.
- conferir-ci-identico.sh passa a chamar o verificador, em qualquer modo.
- README: a regra, o exemplo errado e o certo, e a varredura da frota (46 repos, 317 workflows, 112 callers: nenhum com if: no job).
- tests/if-em-caller: 18 testes (controles positivo e negativo, steps, marca com e sem motivo, CLI, integracao com o conferidor).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
Reviewed-on: #49
feat(ci): tests_timeout_minutes por produto no ci.yml reusavel, com motivo obrigatorio [INFRA-68520]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m54s
2724ff299f
O passo 'Testes (completo)' tinha timeout-minutes 30 fixo para toda a frota. O backend do DANI usou 29m37s
(6300 passed) no run 41415 e o passo foi morto 20 s antes de a suite poder sair. Agora o ci-config declara
tests_timeout_minutes (padrao 30, 5 a 90); o teto do job sobe junto (+10, padrao 40, derivado no ci_config.py);
valor diferente de 30 exige tests_timeout_motivo (>= 10 caracteres).

Medido no runner (sondas em branch, removidas): timeout-minutes aceita expressao em passo e job (puro e
fromJSON), e output VAZIO vira passo/job SEM LIMITE, nao erro; por isso o fallback '|| 30' e '|| 40' no ci.yml
(o backend roda com if: always() mesmo se o changes falhar). Testes novos no ci-config e o teste existente dos
tetos atualizado para o desenho com fallback.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
Reviewed-on: #50
feat(ci): chamador unico cancela o run superado no push de develop, nunca o da release [INFRA-68076]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m37s
06a1226332
Decisao do operador (01/10/2026): run superado nao pode ocupar o runner. O bloco concurrency do templates/ci-chamador.yml passa a
usar o grupo ci-develop e cancel-in-progress tambem no push de develop (antes so em PR); o push de main (release/deploy) segue por
ref+sha e nunca cancela. templates/ci-chamador.anterior.yml guarda o template de antes byte a byte: o produto que ainda tem a
copia antiga passa no conferir-ci-identico com aviso ate migrar. Teste avalia a expressao por evento (PR, develop, main, outra ref)
e usa o template anterior como controle. README documenta a regra e o que fica fora do reusavel (max 5 PRs, develop vermelha,
prioridade de release entre produtos).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
feat(ci): chamador falha alto se um reusable apontar para repo privado [INFRA-64942]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m47s
a582dc57f1
O Forgejo so resolve reusable de OUTRO repo se ele for publico; apontar para privado faz o job morrer em 0 s sem mensagem e o gate
some em silencio. conferir_reusable_publico.py consulta anonimamente a visibilidade de cada reusable de outro repo (owner/repo/.forgejo/
workflows/x.yml@ref ou URL) e reprova se for privado, inexistente (404/403) ou de host externo; rede fora so avisa. Ligado ao
conferir-ci-identico.sh (job changes do CI unico). Varredura da frota: 14 repos, develop e main, so TMF/ci-shared (publico), 0 violacao.
Testes com consulta simulada e controle (TMF/infra reprova, TMF/ci-shared passa); controle real na rede: TMF/infra e TMF/ORG dao 404
anonimo. README documenta a regra e porque os reusables nao podem ir para o ORG.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019nhmgPciDjRhb5KSiZrePM
Reviewed-on: #51
merge: develop em feat/INFRA-64942 (README: mantém as duas seções novas)
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m27s
86285125fd
O conflito era só no README: este branch e o develop (INFRA-68076) acrescentaram uma seção no
fim. Ficam as duas. Testes do ci-shared: 563 passed, 0 failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExJBi69CXPBjwwyD96rBz9
Reviewed-on: #52
A main recebeu #53 e #54 direto; sem trazer para cá, o generate-docs.yml
divergiria e o release develop→main teria conflito no mesmo arquivo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jhn1rqHSES3DQEfP6F22V8
fix(generate-docs): detecta arquivo novo, entrega por PR para develop e falha alto [TH-68786]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m0s
aa2a2a197f
- mudança em docs/ detectada com git add -A + git diff --cached (arquivo novo conta);
  antes o git diff --quiet não via o artefato novo e o job saía verde sem entregar
- checkout da base_branch (padrão develop), commit na branch do bot
  chore/auto-gen-docs-<base> e PR aberto/atualizado pela API com o FORGEJO_TOKEN
  que o caller já passa (scripts/entregar-docs-gerados.sh); nunca push na main
- OpenAPI sem continue-on-error nem || echo; openapi=false pula com notice;
  openapi_app configurável (padrão app.main:app); deps do backend falham alto
- sem POSTGRES_DOCS_URL o schema é pulado com ::notice::, sem placeholder
- tests/generate-docs com controle: o passo antigo sai 'Nenhuma mudança',
  gera placeholder e engole a falha do OpenAPI; o novo não

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jhn1rqHSES3DQEfP6F22V8
fix(release): adiciona VERSION e CHANGELOG (conformidade padrão-ouro) [INFRA-68807]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 2m48s
419fb2fc5e
Introduz o versionamento formal do ci-shared na versão 0.1.0:
- VERSION na raiz (semver estrito), satisfazendo o check ver-version;
- CHANGELOG.md no formato Keep a Changelog (pt-BR), satisfazendo ver-changelog.

Corrige a não-conformidade bloqueante ver-version e o aviso ver-changelog
levantados pela auditoria /aderencia (epic INFRA-68805). Também deixa verde o
gate conferir-release.sh do próprio repo (modos pr e tag).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
Reviewed-on: #55
Reviewed-on: #56
feat(sync-docs): filtro de segurança PII/confidencial no reusável, global-first [TH-68789]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m30s
a21a1759ef
O filtro de segurança do sync docs→Hub passa a morar no reusável/canônico do
ci-shared (não em cópia por produto). Script canônico
`scripts/docs/sync_docs_to_hub.py` + anonimizador vendorizado
`scripts/docs/anonimizar-docs.py` vivem aqui; o reusável clona o próprio
ci-shared (público, sem token) na mesma ref do caller e os roda contra o
`docs/` do produto via `--repo-root`.

Filtro fail-closed:
- denylist de caminho: `legal/` e `seguranca/` barrados;
- front-matter `audiencia: confidencial` barrado;
- ausência de `audiencia` barra (default = não enviar);
- anonimização `--check` antes do sync aborta tudo se houver PII.

Teste de controle negativo real em tests/sync-docs-filtro/ (falha se o filtro
for removido). Follow-up: substituir as cópias nos 7 produtos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HEu6RgsuRhe5fsePE3Dojv
chore(ci-shared): saneia refs a repos arquivados, cria config e fatia docs [INFRA-68876]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m10s
e2dea5e171
Em 2026-10-07 foram arquivados TMF/TMF_Claude_Specs (standards/ADRs migraram para
TMF/ORG) e TMF/infra (monorepo de infra). Este PR corrige o que o ci-shared ainda
apontava para esses repos mortos, cria o config do projeto e fatia o README.

- refs [INFRA-68877]: cabeçalho CANÔNICO de 10 workflows TMF/TMF_Claude_Specs -> TMF/ORG.
- build-ci-images [INFRA-68880]: as 3 mensagens de erro do gate de Trivy deixam de
  mandar "rodar 'Build CI Images' no TMF/infra" (arquivado) e passam a dizer a verdade
  (rebuild sem lar ativo), apontando a decisão INFRA-68880. Exemplo `uses:` do
  reusable-trivy-scan corrigido de TMF/infra para TMF/ci-shared.
- config [INFRA-68878]: cria .claude/config.json (issue_product=infra, client_id).
- docs [INFRA-68879]: fatia o README (1457 -> 40 linhas) em docs/ (workflows reusáveis,
  guia de adoção, scripts, runbook de CI vermelho) + README de índice; remove a
  duplicação literal das seções de adoção. Os testes que liam a documentação do README
  (tests/ci-unico, tests/release) passam a ler do novo local em docs/.

A migração do build de imagens (epic INFRA-66795, marcado Done sem aterrissar no
ci-shared) fica registrada como a decisão INFRA-68880 (needs_human, com opções).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
feat(ci-images): restaura o build das imagens de CI no ci-shared [INFRA-68880]
Some checks failed
PR checks (ci-shared) / testes (pull_request) Failing after 3m23s
46758b17fa
Conclui a migração que o epic INFRA-66795 deu como feita sem ter acontecido: o
build-ci-images.yml e o ci-images/ viviam só no TMF/infra, arquivado em 07/10,
onde não rodam mais (repo read-only) — o cron semanal do Trivy DB estava morto.

Traz, do develop do TMF/infra (versão pós INFRA-67340 + INFRA-67861, a corrigida):
- .forgejo/workflows/build-ci-images.yml (name "Build CI Images"): dispatch por
  imagem (python-ci, node-ci, docker-ci, nginx-base, trivy-ci, php-ci, android-ci,
  deploy-ci), push em main por Dockerfile, schedule mensal (patch apt/apk) e
  semanal (vuln DB do Trivy);
- ci-images/ com os Dockerfiles das imagens tmf-ci-* e o README.

Cópia fiel (Dockerfiles e FROMs inalterados). Únicos ajustes: label OCI
image.source do deploy-ci de TMF/infra para TMF/ci-shared, e nota de migração no
cabeçalho do workflow. tests/soberania verde (sem origem externa nova).

Nota operacional: schedule/cron do Forgejo roda no default branch (main). O cron
do Trivy só volta ao ar quando este workflow chegar em main (release develop->main);
em develop ele fica disponível por workflow_dispatch.

Não dispara build nem publica imagem/tag — isso é do cron/dispatch após o merge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
test(ci-unico): build-ci-images.yml entra na allowlist de gatilho próprio [INFRA-68880]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m20s
610cc913e4
A restauração do build de imagens adicionou um 2º workflow com gatilho próprio
(schedule/dispatch/push), quebrando test_e_o_unico_workflow_com_gatilho_proprio,
que só conhecia o pr-checks.yml.

- allowlist passa a ser {build-ci-images.yml, pr-checks.yml};
- novo teste garante que build-ci-images.yml NUNCA dispara em pull_request (senão
  viraria check obrigatório nos PRs deste repo — contexto de proteção inesperado).

Fortalece a invariante em vez de só relaxá-la.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
feat(ci): agregador ci-ok + fim do || true nos gates de install [INFRA-68925]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m19s
474ef96cd0
Implementa na origem (ci-shared) o "padrão único de correção" do epic de gates
falsos INFRA-68918:

(a) Agregador ci-ok no ci.yml reusável — job final (needs: todos, if: always())
    que reprova failure/cancelled ou skip sem motivo, via
    scripts/ci/avaliar_gate_final.py (função pura + anti-deriva). É o ÚNICO check
    que a proteção precisa exigir (CI / ci-ok), no lugar do glob CI /* ou de jobs
    individuais que publicam "não se aplica" como success. ADITIVO: não altera os
    4 jobs existentes; só vira required quando o operador ajustar a proteção
    (achados C1-C4: INFRA-68919/20/21/22/24 — do operador, bot leva 403).

(b) Remove o || true que mascarava falha de pip install de requirements-dev/-app
    em ci-base.yml e ci.yml (achado TMFP-61455): arquivo opcional vira
    "if [ -f ]; then ... fi" e a falha de install volta a reprovar o gate.

Testes: tests/ci-ok/ (lógica do avaliador + anti-deriva contra o ci.yml); contrato
de jobs atualizado 4->5 em test_ci.py e test_reuso_por_tree.py. Todas as suítes verdes.

Pendente (fora deste PR): doc do padrão em TMF/ORG (com o Lineu) e a troca da
proteção de branch nos repos (operador).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
Reviewed-on: #57
Reviewed-on: #59
Merge pull request 'feat(ci): agregador ci-ok + fim do || true nos gates de install [INFRA-68925]' (#60) from feat/INFRA-68925-ci-ok-e-gates into develop
All checks were successful
PR checks (ci-shared) / testes (push) Successful in 3m40s
PR checks (ci-shared) / testes (pull_request) Successful in 3m28s
ecedcd75ea
Reviewed-on: #60
tarcisio deleted branch develop 2026-10-08 16:02:19 -03:00
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!61
No description provided.