feat(release): GitProviderPort e adapter Forgejo [TMFP-65898] #161

Merged
tmf-ia merged 2 commits from feat/TMFP-65898-git-provider-port into develop 2026-11-03 22:01:25 -03:00
Owner

O que muda

Primeira peça do "fechar release" no ci-shared (ADR 0022, TMF/ORG#432; epic TMFP-60560).

  • scripts/release/git_provider.py: porta GitProviderPort e o adapter ForgejoProvider, extraído do que a skill /release do tmf-platform faz.
    • Operações: whoami, ensure_identity, create_tag, get_tag, create_release, dispatch_workflow, find_run, wait_run_exists, commit_status, merge_pr.
    • Guarda de identidade antes de escrita: recusa identidade diferente de tmf-ia (IdentityMismatch) e falha fechada quando o token não pode ler /user (IdentityUnverifiable, falta o escopo read:user).
  • Os quatro gotchas do Forgejo viram teste:
    • dispatch só em branch (ref com cara de tag é recusado);
    • dispatch devolve 204 sem criar run (DispatchNotRegistered depois do timeout);
    • merge devolve 405 e efetiva (confirmado relendo o PR);
    • run na fila ainda não tem task (busca por /actions/runs, não /actions/tasks).
  • tests/release-provider/test_git_provider.py: 27 testes contra um servidor HTTP falso.
  • CHANGELOG.md e docs/scripts.md.

Nada é chamado por workflow ainda: o orquestrador é a TMFP-65900 e o workflow a TMFP-71790.

Prova local

python3 -m unittest discover -s tests/release-provider -q
Ran 27 tests in 1.751s
OK

TMFP-65898

🤖 Generated with Claude Code

https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2

## O que muda Primeira peça do "fechar release" no ci-shared (ADR 0022, TMF/ORG#432; epic TMFP-60560). - `scripts/release/git_provider.py`: porta `GitProviderPort` e o adapter `ForgejoProvider`, extraído do que a skill `/release` do tmf-platform faz. - Operações: `whoami`, `ensure_identity`, `create_tag`, `get_tag`, `create_release`, `dispatch_workflow`, `find_run`, `wait_run_exists`, `commit_status`, `merge_pr`. - Guarda de identidade antes de escrita: recusa identidade diferente de `tmf-ia` (`IdentityMismatch`) e falha fechada quando o token não pode ler `/user` (`IdentityUnverifiable`, falta o escopo `read:user`). - Os quatro gotchas do Forgejo viram teste: - dispatch só em branch (ref com cara de tag é recusado); - dispatch devolve 204 sem criar run (`DispatchNotRegistered` depois do timeout); - merge devolve 405 e efetiva (confirmado relendo o PR); - run na fila ainda não tem task (busca por `/actions/runs`, não `/actions/tasks`). - `tests/release-provider/test_git_provider.py`: 27 testes contra um servidor HTTP falso. - `CHANGELOG.md` e `docs/scripts.md`. Nada é chamado por workflow ainda: o orquestrador é a TMFP-65900 e o workflow a TMFP-71790. ## Prova local ``` python3 -m unittest discover -s tests/release-provider -q Ran 27 tests in 1.751s OK ``` TMFP-65898 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
Porta (typing.Protocol) e ForgejoProvider só com stdlib. Guarda de identidade tmf-ia antes de qualquer escrita; dispatch recusa tag; prova do run por /actions/runs (fila conta, 204 sem run falha alto); merge confirmado pelo GET do PR (405 que efetiva). Testes com Forgejo falso em tests/release-provider. ADR 0022.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(release): guarda de identidade falha fechada com causa explícita sem read:user [TMFP-65898]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 5m24s
2de5a4bbab
GET /user com 403 por falta do escopo read:user (medido no Forgejo real em 03/11/2026 com o token do bot) vira IdentityUnverifiable, em pt-BR, e nenhuma escrita é feita. Requisito do escopo registrado na docstring e em docs/scripts.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
tmf-ia merged commit dcaa7eab63 into develop 2026-11-03 22:01:25 -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!161
No description provided.