release: ci-shared develop → main — conserto do ci-ok reusável (INFRA-68925) + #62–#66 #69

Merged
tarcisio merged 17 commits from release/2026-10-08-ci-ok into main 2026-10-08 23:02:28 -03:00
Owner

Release do ci-shared: develop → main (08/10/2026)

Motivo: destravar o DANI. O ci-ok do ci.yml reusável, já na main, reprova em todo consumidor reusável. Isso deixa vermelho o CI / ci exigido pela proteção do DANI e trava o PR #907 e o release do DANI.

Causa, verificada no log do DANI (run 3637, job 5): o toJSON(needs) do reusável chega com chaves ci.changes, ci.gates, ci.backend, ci.frontend. O avaliador reprovava por "ausente" + "job que não conhece".

O que entra

PR Issue O quê
#68 INFRA-68925 O avaliador do ci-ok normaliza o prefixo <chamador>. e imprime chaves e results (nunca outputs)
#62 INFRA-68918 Agregador ci-ok também no ci-base.yml legado (HelpCor, Hub, TMF9)
#63 INFRA-65726 Playbook de migração ci-base.yml → ci.yml (só docs)
#64 INFRA-68918 O verificar-docs separa falha de setup de achado de docs
#65 INFRA-68918 Os jobs de validação do ci-base sempre rodam (always + guarda)
#66 INFRA-64941 sync-docs: raiz sem docs/ falha fechado; compliance/security na denylist

Risco e conferência pós-merge

  • O ci-ok passa a rodar no CI legado de HelpCor, Hub e TMF9. Com o #68, o prefixo do chamador é tratado, mas um nome de job fora das CI_OK_REGRAS reprova (anti-deriva, de propósito).
  • Depois do merge: o 1º run do DANI (#907) precisa mostrar ci-ok: TODOS os jobs necessários passaram, e o 1º run de um produto do ci-base também. Se reprovar, a saída do avaliador já mostra chaves e results para corrigir.
  • Rollback: reverter o merge na main. Os consumidores usam @main.

🤖 Generated with Claude Code

https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn

## Release do ci-shared: develop → main (08/10/2026) **Motivo:** destravar o DANI. O `ci-ok` do `ci.yml` reusável, já na main, reprova em todo consumidor reusável. Isso deixa vermelho o `CI / ci` exigido pela proteção do DANI e trava o PR #907 e o release do DANI. **Causa, verificada no log do DANI (run 3637, job 5):** o `toJSON(needs)` do reusável chega com chaves `ci.changes`, `ci.gates`, `ci.backend`, `ci.frontend`. O avaliador reprovava por "ausente" + "job que não conhece". ## O que entra | PR | Issue | O quê | |---|---|---| | #68 | INFRA-68925 | O avaliador do `ci-ok` normaliza o prefixo `<chamador>.` e imprime chaves e results (nunca outputs) | | #62 | INFRA-68918 | Agregador `ci-ok` também no `ci-base.yml` legado (HelpCor, Hub, TMF9) | | #63 | INFRA-65726 | Playbook de migração ci-base.yml → ci.yml (só docs) | | #64 | INFRA-68918 | O verificar-docs separa falha de setup de achado de docs | | #65 | INFRA-68918 | Os jobs de validação do ci-base sempre rodam (always + guarda) | | #66 | INFRA-64941 | sync-docs: raiz sem `docs/` falha fechado; compliance/security na denylist | ## Risco e conferência pós-merge - O `ci-ok` passa a rodar no CI legado de HelpCor, Hub e TMF9. Com o #68, o prefixo do chamador é tratado, mas um nome de job fora das `CI_OK_REGRAS` reprova (anti-deriva, de propósito). - Depois do merge: o 1º run do DANI (#907) precisa mostrar `ci-ok: TODOS os jobs necessários passaram`, e o 1º run de um produto do ci-base também. Se reprovar, a saída do avaliador já mostra chaves e results para corrigir. - Rollback: reverter o merge na main. Os consumidores usam `@main`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
feat(ci): agregador ci-ok no ci-base.yml legado [INFRA-68918]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m34s
c177ed08aa
Conserta o skip-como-success NA ORIGEM para os produtos que ainda chamam o
reusável legado ci-base.yml (Hub, HelpCor, Fina): os jobs do ci-base têm
`needs: changes` SEM `always()`, então quando o changes falha eles viram
`skipped` e o Forgejo publica skipped como SUCCESS — o falso verde do epic.

- job `ci-ok` no ci-base.yml (needs: todos + if: always()) — o único check que a
  proteção precisa exigir (`CI / ci-ok`), no lugar do glob `CI /*` ou dos jobs
  individuais do ci-base (achados C1/C2: INFRA-68919/68920). ADITIVO: não altera
  os 6 jobs existentes; vira required quando o operador trocar a proteção.
- avaliar_gate_final.py generalizado: aceita a lista de jobs por env CI_OK_REGRAS
  (o ci-base tem jobs diferentes do ci.yml). Retrocompatível — o ci.yml continua
  usando o REGRAS default. Mesmo molde do ci.yml e do tmf-platform (TMFP-68058).
- tests/ci-ok: anti-deriva do ci-base (CI_OK_REGRAS == jobs do ci-base) + avaliador
  com as 6 regras. Todas as suítes verdes.

Cobre Hub/HelpCor/Fina de uma vez, sem tocar em repo de produto (eles já apontam
ci-base@main). Não força a migração para o ci.yml (CI único, INFRA-65726); entrega
o gate honesto já.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
docs(ci): playbook de migração ci-base.yml → ci.yml (CI único) [INFRA-65726]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m19s
f8388fd3db
Roteiro para Hub, HelpCor e Fina saírem do reusável legado ci-base.yml para o
ci.yml único. O ci-ok no ci-base (INFRA-68918) deu o gate honesto já; este playbook
é o caminho para eliminar a divergência por produto.

- docs/migracao-ci-base-para-ci-unico.md: o que muda, o que quebra, como validar, e
  o MAPA por produto (cada job "ao lado" → vira chave do ci-config, extra_gates_cmd,
  arquivo próprio, ou some por redundância com o que o ci.yml já faz).
- README: doc no índice.

Cada sessão dona aplica no seu repo (a sessão ci-shared entrega o mapa, não toca nos
três). Ordem sugerida: Fina (mais barata) → HelpCor → Hub.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
fix(ci): verificar-docs separa falha de setup de achado de docs [INFRA-68918]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m8s
c0404520d4
O check "Verificar docs/ (ADR 0012)" vermelho confundia duas coisas: (a) o
verificador rodou e reprovou o docs/ (achado real) e (b) o SETUP falhou (token do
TMF/ORG ausente, clone do verificador, pip) e o verificador NEM RODOU. Os dois
viravam o mesmo "failure", mandando investigar o docs/ quando o problema era infra.

Caso real (HelpCor, hoje): "Verificar docs/" vermelho em todos os PRs era o secret
ORG_LEITURA_TOKEN ausente no repo/usuário tarcisio — o docs/ está conforme (total 0
achados, verificado por reprodução). Custou ~1h até isolar.

- passo aditivo `Natureza da falha — setup ou documentação` (if: failure()): lê
  steps.rodar.outcome; se o verificador reprovou, diz DOCS; se nem rodou, diz SETUP
  e aponta a causa (token/clone/pip) e que o docs NÃO foi reprovado. NÃO muda o
  resultado do job — só rotula.
- tests/ci-unico: TestNaturezaDaFalha (existe, if: failure(), distingue por outcome,
  roda depois do verificador).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
fix(ci): caller DEVE declarar secrets: ORG_LEITURA_TOKEN (with: chega vazio) [INFRA-68918]
Some checks failed
PR checks (ci-shared) / testes (pull_request) Has been cancelled
b5c4bfa26a
Causa raiz do HelpCor (Lineu, medido): o token NÃO estava ausente — existe desde
05/10. O chamador do HelpCor passava só via `with: org_leitura_token: ${{ secrets.X }}`,
e o Forgejo NÃO resolve secret dentro de `with:` de workflow_call: chega vazio. Os 7
produtos verdes todos declaram `secrets: ORG_LEITURA_TOKEN:` no caller (caminho 2).
HelpCor: 18/18 falhas por usar só o caminho 1.

Atualiza o reusável para não gerar outro caso (aditivo, sem mudar comportamento):
- descrição do input org_leitura_token: alerta que with: chega vazio; o caller TEM
  de declarar secrets: (input mantido só por compat);
- cabeçalho (ordem do token): caminho 1 marcado como não-funcional sozinho, caminho 2
  (secrets:) é o que funciona e é obrigatório;
- mensagem do exit 1 (sem token) e do rótulo de SETUP: citam explicitamente
  "declare secrets: ORG_LEITURA_TOKEN: no caller".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
fix(ci): tira ${{ }} das mensagens do verificar-docs (expande antes do shell)
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m0s
42afe67d19
O commit anterior citava 'with: ... ${{ secrets.X }}' literalmente nas mensagens de
erro dentro de run: — e o test_script_do_clone_nao_tem_expressao_do_runner pegou: o
Forgejo expande ${{ }} ANTES do shell (o \ não escapa), então um ${{ secrets.X }}
numa mensagem injetaria o secret. Reescrito como "pelo input with: org_leitura_token
(interpolando o secret)", sem o literal ${{. Mesma informação, sem o risco que o
próprio teste existe para barrar. 84 testes verdes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
fix(ci): jobs de validação do ci-base sempre rodam (always + guarda) [INFRA-68918]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m6s
732a27eee8
Os gates do reusável legado ci-base.yml (lint-python, test-python, build-react,
audit-ds) tinham `needs: changes` SEM `always()`: quando o changes falha, viram
`skipped` publicado como success — o falso verde. O comentário do job já PROMETIA
"o job SEMPRE roda", mas o código não garantia.

Pela regra 2 do padrão (ORG#385, "gate nunca é pulado"), check de validação sempre
roda e decide aplicabilidade no 1º step. Alinha o ci-base ao molde do ci.yml
(INFRA-67721): if: always() + guarda "changes passou?" como 1º step (falha de verdade
se changes != success, em vez de sumir). ADITIVO — no caminho feliz nada muda; só o
caminho de erro passa de falso-verde a falha explícita, com diagnóstico melhor que
"ci-ok vermelho". security-trivy fica fora (não tem needs: changes).

O ci-ok (#62) já reprovava o skip no topo; isto conserta na origem, em cada gate.

- tests/ci-unico: TestCiBaseGuarda (os 4 gates têm always()+guarda; security-trivy fora).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SCXwCdbp97ioN6p3rC3diT
fix(sync-docs): raiz sem docs/ falha fechado e compliance/security voltam à denylist (INFRA-64941)
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m23s
80d28e13f1
- sync_docs_to_hub.py: raiz sem docs/ (ou sem .md) sai com exit 2 e mensagem
  clara, em vez de 'Sync 0 arquivos' com exit 0; nova flag --allow-empty.
  Vale também para --prune/--dedup (raiz vazia faria tudo parecer órfão).
- DENY_PATH_DIRS recupera compliance e security (regressão da troca de
  SKIP_DIRS), case-insensitive como os demais.
- Reusável sync-docs-to-hub.yml: input allow_empty (default false) repassa
  --allow-empty; nenhum caller atual precisa dele.
- Testes: raiz sem docs/ -> 2, --allow-empty -> 0, compliance/security
  barrados, confidencial em pasta renomeada barrado, público enviado,
  controle sem filtro.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
merge: origin/develop -> docs/INFRA-65726-playbook-migracao-ci-base
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m21s
a90691a0a3
Atualiza a branch com a base (pr.py atualizar: merge --no-commit + commit como tmf-ia).
merge: origin/develop -> fix/INFRA-68918-verificar-docs-setup-vs-achado
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m1s
ee8de97b41
Atualiza a branch com a base (pr.py atualizar: merge --no-commit + commit como tmf-ia).
merge: origin/develop -> fix/INFRA-68918-ci-base-jobs-always
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m22s
f4b16e94e1
Atualiza a branch com a base (pr.py atualizar: merge --no-commit + commit como tmf-ia).
Reviewed-on: #65
Reviewed-on: #66
fix(ci-ok): avaliador normaliza chaves <chamador>.<job> e imprime diagnóstico do needs [INFRA-68925]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 3m15s
0769ceab44
O ci-ok do ci.yml reusável reprova em 2s no DANI (run 3637, único consumidor do
ci.yml@main), com os 4 jobs verdes. Hipótese não verificada (o log do Forgejo 15
não sai por API): no reusável expandido, as chaves de toJSON(needs) vêm como
'<chamador>.<job>'.

- normalizar_chaves(): tira o prefixo até o último ponto; colisão fica como veio
  (e reprova por job desconhecido).
- resumo_bruto(): imprime tamanho, chaves e results do NEEDS_JSON (nunca outputs),
  para o próximo run provar a causa, seja ela qual for.
- 5 testes novos; 3 falham sem a correção.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017QrAM1chSgVpSwDrKJVLVn
Merge pull request 'fix(ci-ok): normaliza chaves <chamador>.<job> do needs e imprime diagnóstico [INFRA-68925]' (#68) from fix/INFRA-68925-ci-ok-chaves-reusavel into develop
All checks were successful
PR checks (ci-shared) / testes (push) Successful in 3m15s
PR checks (ci-shared) / testes (pull_request) Successful in 3m6s
db5147adf8
tarcisio deleted branch release/2026-10-08-ci-ok 2026-10-08 23:02:29 -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!69
No description provided.