mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-12 22:13:05 +00:00
14 arquivos removidos: .forgejo/workflows/* (6), forgejo-pr-automerge.mjs, forgejo-dispatch.mjs, ci-classify-production.mjs, lib/dockerignore.mjs, lib/branch-protection.mjs + 3 specs órfãs. Consumidores ajustados: test-affected-core (HIGH_RISK_EXACT), ciSkipInvariants (re-ancorado no deploy.yml dispatch-only — deploy nunca automático), comentários com referência morta (gate-ci, github-pr-automerge, agent-pr-ready-automerge). Docs: AGENTS.md, runbook (rollback via git history), README (era GitHub). Tracker intocado (forgejo-api/agent-*/issue-transition ficam).
9 KiB
9 KiB
Impl: OPS71 Fase 2 — remover arquivos do Forgejo (workflows/scripts) após validação do GitHub Actions
Status: aprovado Atualizado em: 2026-08-19 Issue: #111 Intenção: docs/plans/ops71-ci-github-actions-tracker-forgejo.md (§"Fase 2 — entrega sucessora", linha 99-101 do impl da Fase 1) Appetite restante: pequeno — remoção + fixups de consumidores + docs (1 sessão)
Leitura da intenção
- Outcome: o fluxo GitHub Actions (OPS71 Fase 1, validado ao vivo: PRs #742/#743 — CI verde, auto-merge nativo, flips via API) é a única via de CI/PR/deploy no repo; os arquivos do fluxo Forgejo saem do tree; docs residuais atualizados; nada do tracker é tocado.
- O que NÃO negociar: tracker no Forgejo (Issues/labels/claims/flips via API) —
forgejo-api.mjs,agent-*.mjs,issue.mjs,forgejo-issue-transition.mjs,agent-promote-related-on-merge.mjsficam;.forgejo/worktree.envfica (fora do escopoworkflows/*, consumido pelo provisionamento de worktree); desligar o runner do Forgejo é passo manual do runbook (fora do código);ci.ymlde main não volta (deploy = dispatch manual). - O que reavaliar: a hipótese da intenção dizia "grep
forgejo-pr-automerge|forgejo-dispatch|ci-classify|dockerignorecomo saída" — a varredura achou dois consumidores funcionais além de docs, não listados no escopo literal:scripts/lib/test-affected-core.mjs(HIGH_RISK_EXACT com os 2 paths mortos) etests/unit/ciSkipInvariants.unit.spec.ts(lê.forgejo/workflows/ci.yml+ci-pr.ymle pina o gate OPS65). Ambos precisam ser editados — são o contrato que quebraria se os arquivos sumissem. Também achado:README.mdainda descreve o fluxo Forgejo pré-Fase 1 (janela de 30 min, deploy automático, linha de CI apontando.forgejo/workflows/).
Abordagem recomendada
flowchart LR
D[14 arquivos deletados] --> C1[test-affected-core: -2 entries HIGH_RISK]
D --> C2[ciSkipInvariants: -2 paths .next-e2e, -2 high-risk, teste OPS65 reescrito para deploy.yml dispatch-only]
D --> C3[gate-ci: comentário .github/workflows/ci-pr.yml]
D --> C4[github-pr-automerge + agent-pr-ready-automerge: comentário sem referência morta]
D --> DOC[AGENTS.md + runbook + README — era GitHub só]
DOC --> CL[changelog ops71-fase2 + changelog:build]
Opções consideradas:
- A — Remoção seca + fixups mínimos dos consumidores (o escopo do body + os 2 consumidores funcionais + 3 docs). Nada de novo é criado; invariantes de CI re-ancorados no
.github/workflows/. - B — Reescrever
ciSkipInvariantspara pinar ".forgejo/não existe" — redundante: a deleção é o próprio diff do PR; e o teste que importa é o invariante vivo (deploy nunca automático), que re-pino nodeploy.yml. - C — Deletar o teste OPS65 inteiro (remover o teste da janela de 30 min e pronto) — perderia o pin "nunca deploy automático" sem reposição; o GitHub manteve o espírito (dispatch manual), o teste deve continuar existindo apontando para o arquivo certo.
Recomendação: A — porque os consumidores são pequenos e bem delimitados, a substituição do pin OPS65 pelo pin equivalente da era GitHub (deploy.yml sem trigger push/schedule; ci-pr.yml sem o gate morto) preserva a invariante de deploy manual, e nada além do escopo declarado é tocado.
Rejeitadas:
- Manter os arquivos como rollback inerte — o propósito da Issue é a remoção; rollback passa a ser git history (o main congelado do Forgejo é uma cópia íntegra da era Forgejo; o PR é um commit reversível).
- Deletar
forgejo-issue-transition.mjs/agent-promote-related-on-merge.mjs/forgejo-api.mjs/agent-*.mjs— anti-goal explícito (tracker vivo). - Deletar
.forgejo/worktree.env— fora do escopo (workflows/*); consumido pelo provisionamento de worktree. - Editar
docs/plans/*,docs/changelog/*,docs/CHANGELOG-AGENTS.md— história congelada/insert-only; a narrativa de "preservados até Fase 2" vive nos changelogs antigos e permanece. - Tocar
docs/AGENT-OPS.md— já é era-GitHub (grep não acha referência a nenhum arquivo removido).
Componentes / mudanças
- Deletados (14):
.forgejo/workflows/(6: ci-pr.yml, ci.yml, agent-pr-ready-automerge.yml, issue-done-on-main-merge.yml, plan-issue-ready-on-main-merge.yml, archive-cursor-agent.yml);scripts/forgejo-pr-automerge.mjs,scripts/forgejo-dispatch.mjs,scripts/ci-classify-production.mjs,scripts/lib/dockerignore.mjs,scripts/lib/branch-protection.mjs; specstests/unit/ciClassifyProduction.unit.spec.ts,tests/unit/dockerignoreMatch.unit.spec.ts,tests/unit/branchProtection.unit.spec.ts. Nenhuma importação viva aponta para eles (grep: sótest-affected-core+ciSkipInvariants+ docs). scripts/lib/test-affected-core.mjs: removescripts/ci-classify-production.mjsescripts/lib/dockerignore.mjsdeHIGH_RISK_EXACT(paths mortos nunca aparecem em diff; listas devem espelhar o tree).tests/unit/ciSkipInvariants.unit.spec.ts: (1) tiraci.yml+ci-pr.ymldo loop.next-e2e; (2) tira os 2 paths do pin de high-risk; (3) reescreve o teste "main CI 30-min window (OPS65)" para a era GitHub: lê.github/workflows/deploy.ymle pinaworkflow_dispatch:presente,push:/schedule:ausentes (deploy nunca automático) e.github/workflows/ci-pr.ymlsemci-classify-production.mjs(gate morto).scripts/gate-ci.mjs(comentário do header): "Local mirror of.forgejo/workflows/ci-pr.yml" →.github/workflows/ci-pr.yml.scripts/github-pr-automerge.mjs+.github/workflows/agent-pr-ready-automerge.yml: comentários com o parêntese "(forgejo-pr-automerge.mjs)" → referência genérica à era Forgejo (arquivo não existe mais).AGENTS.md: frase "The Forgejo-era files (...) are preserved as rollback until the OPS71 Fase 2 removal" → removidos na Fase 2; rollback via git history (main congelado do Forgejo / revert do PR).docs/ops/teqo-1313-deploy.md(§"Rollback do cutover"): "os workflows de.forgejo/workflows/seguem no repo até a Fase 2" → arquivos removidos; restauração via git history do main congelado do Forgejo.README.md: bloco de fluxo stale (janela 30 min, deploy automático, linhaCI: .forgejo/workflows/ci-pr.yml + ci.yml) → fluxo era-GitHub (PR →CI (PR) / checks→ auto-merge nativo → deploy manual dispatch).- Changelog:
docs/changelog/2026-08-19-ops71-fase2.md+pnpm changelog:build. - Migration: sem migration (nenhum schema).
- Access / Consent / UI: N/A.
Fases verificáveis
- Deleção + fixups de código —
git rmdos 14 arquivos; editatest-affected-core.mjs,ciSkipInvariants.unit.spec.ts, comentários degate-ci.mjs/github-pr-automerge.mjs/agent-pr-ready-automerge.yml. Gate:pnpm test:unit(ciSkipInvariants/testAffected/github*). - Docs + changelog — AGENTS.md, runbook, README,
docs/changelog/2026-08-19-ops71-fase2.md+pnpm changelog:build. - Gates finais —
pnpm exec tsc --noEmit,pnpm lint,pnpm format:check,pnpm exec knip,pnpm check:cycles,pnpm test(unit+int),pnpm build; grep de saneamento (forgejo-pr-automerge|forgejo-dispatch|ci-classify|dockerignore.mjs|branch-protection.mjs→ só histórico/docs/changelogs); push → PR GitHub → CI (PR) / checks → auto-merge.
Rabbit holes / Não escopo (engenharia)
- Re-engenharia do
ciSkipInvariantsalém do re-pino — não; só o que o arquivo lê muda. pnpm configure:branch-protection/github libs — intocados (era GitHub).- Pool/
agent-pool*dormente (OPS65) — intocado. - Desligar o runner do Forgejo — passo manual no runbook, não código.
.dockerignore(o arquivo) — permanece: odocker builddodeploy-homeserver.sho consome; só o libdockerignore.mjs(parse de regras, gate OPS65) morre.
Riscos e mitigação
ciSkipInvariantsquebrar por leitura de arquivo removido — os 3 pontos são editados na mesma fase da deleção; gate localpnpm test:unitantes de qualquer push.- Pin perdido do "deploy manual" — mitigado pelo teste reescrito (dispatch-only, sem
push:/schedule:); se um dia oci.ymlvoltar com trigger, o teste acende. - Referência morta residual fora do grep — saneamento final com o grep do escopo + knip (dead exports/deps é CI-blocking); docs históricos (plans/changelogs antigos) são allowlist consciente.
- Knip acusar
branch-protection.mjs/dockerignore.mjscomo órfãos na Fase 1→Fase 2 — a deleção é atômica com a remoção das referências (mesma fase); nada fica órfão no diff. - PR de plano vs
check-plans-only-pr-closes— este PR tem código (não é plans-only); guard não se aplica.
Aceite de engenharia
- Aceite de produto da intenção ainda coberto (remoção completa + docs; tracker intacto)
- Invariantes AGENTS/engineering-standards (sem migration/schema; nada do tracker; docs históricos intocados; changelog insert-only)
- Testes de domínio previstos: ciSkipInvariants re-ancorado na era GitHub (deploy dispatch-only); unit suíte verde