Skip to content

feat(project): hourly reconciler para Project nfe/5 (abordagem híbrida)#22

Open
joaokita wants to merge 1 commit intomainfrom
feature/project-5-reconciler-only
Open

feat(project): hourly reconciler para Project nfe/5 (abordagem híbrida)#22
joaokita wants to merge 1 commit intomainfrom
feature/project-5-reconciler-only

Conversation

@joaokita
Copy link
Copy Markdown
Contributor

Contexto

Alternativa enxuta ao #20. Em vez de sincronizar um workflow em cada um dos 100 repos da org (template + provisioner), usa o workflow builtin nativo do Projects v2 para os repos principais e mantém apenas um reconciler aqui no nfe/.github como safety-net.

Origem: avaliação conjunta de como cobrir o gap "issues criadas pela UI não entram no Project #5" sem poluir .github/workflows/ nos repos da org.

Arquitetura

┌─ PRIMARY (<5s, builtin nativo) ──────────────┐
│ Project #5 → Workflows → "Auto-add to project"│
│ filter: is:issue,is:open                      │
│ repos: <lista curada dos principais>          │
└───────────────────────────────────────────────┘
┌─ RECONCILER (hourly, este PR) ────────────────┐
│ nfe/.github → reconcile-project-items         │
│ diff (issues abertas na org − issues no #5)   │
│ addProjectV2ItemById em cada órfã             │
└───────────────────────────────────────────────┘

O que este PR adiciona

Um único arquivo: .github/workflows/reconcile-project-items.yml

  • Cron horário + workflow_dispatch manual (com dry_run)
  • Lê todas as issues abertas em todos os 100 repos não-arquivados da org (filtrando pull_request == null)
  • Lê todos os items (tipo Issue) já no Project PVT_kwDOAID6As4BUp17 via paginação
  • comm -23 dos dois sets → órfãs
  • Para cada órfã: addProjectV2ItemById via GraphQL
  • Idempotente: rodar 2× não duplica (GitHub dedupe em addProjectV2ItemById)

Vantagens vs #20

#20 (Actions em toda a org) Este PR (híbrido)
Arquivos nos 100 repos 1 em cada 0
Workflows em nfe/.github 3 1
Secret necessário PAT c/ repo + workflow + project PAT c/ só project
PRs automáticos abertos ~100 (provisioner) 0
Latência em repos principais <30s (Actions) <5s (builtin)
Latência em repos secundários <30s (Actions) até 1h (reconciler)
Cobertura de repos novos na org automática (provisioner) automática (reconciler)
Manutenção 3 workflows + 100 arquivos sincronizados 1 workflow + lista de repos na UI

Trade-off explícito: repos fora da lista curada do builtin têm latência de até 1h em vez de <30s. Se alguma issue precisar entrar no Project instantaneamente, ela deve estar num repo listado no builtin.

⚠️ Pré-requisitos manuais (antes de merge)

1. Secret org-level WORK_PROJECT_TOKEN

PAT em https://github.com/settings/tokens com scope project apenas (não precisa de repo nem workflow nesta abordagem).

Adicionar como secret org-level em https://github.com/organizations/nfe/settings/secrets/actions:

  • Name: WORK_PROJECT_TOKEN
  • Repository access: "All repositories" (ou mínimo: nfe/.github)

2. Habilitar builtin "Auto-add to project" no Project #5

Em https://github.com/orgs/nfe/projects/5/workflows:

  • Localizar/criar workflow "Auto-add to project"
  • Filter: is:issue,is:open
  • Repos: selecionar os principais onde nascem a maioria das issues (produtos principais)
  • Enable

Repos fora dessa lista ainda serão cobertos pelo reconciler em até 1h.

Plano de rollout

  1. Merge este PR
  2. Criar o secret WORK_PROJECT_TOKEN
  3. Habilitar o builtin no Project (passo 2 acima)
  4. Rodar o reconciler em dry_run=true uma vez via Actions → Reconcile Project items → Run workflow → dry_run=true — confere contagem de órfãs
  5. Rodar normal — o primeiro ciclo vai adicionar todas as issues órfãs históricas
  6. Deixar o cron horário rodando

Relação com #20

Este PR substitui o #20. Se for aprovado, #20 pode ser fechado sem merge — o reconciler aqui já é idêntico ao arquivo reconcile-project-items.yml do #20; o que sai são o template + o provisioner.

Test plan

  • Secret WORK_PROJECT_TOKEN criado com scope project e visível para nfe/.github
  • Builtin "Auto-add to project" habilitado no Project feat(skills): adicionar skill create-issue com Origem e Referências obrigatórias #5 com repos principais e filter is:issue,is:open
  • Reconciler em dry_run=true — contagem de órfãs bate com query manual
  • Reconciler em modo normal — órfãs adicionadas, logs limpos
  • Segundo ciclo (1h depois) — 0 órfãs novas (confirmação de idempotência)
  • Nova issue num repo principal → aparece no Project em <5s (via builtin)
  • Nova issue num repo secundário → aparece no Project em até 1h (via reconciler)

🤖 Generated with Claude Code

Hybrid approach: this reconciler is the safety-net for issues that
escape the native "Auto-add to project" workflow (to be enabled in the
Project UI for the main repos). Runs hourly, diffs all open org issues
against Project #5 membership, and adds orphans via addProjectV2ItemById.
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