OPS75 — Re-home do C141 no GitHub main (mergeado só no Forgejo no cutover) + push mirror Forgejo→GitHub para prevenir a classe #127

Closed
opened 2026-08-20 16:13:20 +00:00 by fsolla · 4 comments
Owner
id depends serializes priority model
OPS75
126
P1 composer-2.5

Plano: —

Contexto (descoberto na execução do C142, Issue #107)

O C141 (perfis de permissão por assessor) está done+in-prod no tracker (PR #110 do Forgejo, merge 2026-08-20T01:24:56Z), mas o código dele nunca chegou ao GitHub main — o remote vivo pós-cutover OPS71:

  • campaignAdvisorProfile.ts não existe no GitHub main (verificado via API: 404).
  • Migration 20260819_214755_add_campaign_user_advisor_permission_profile não existe no GitHub main.
  • CampaignUser.ts no GitHub main não tem visibility/editing (grep: 0 ocorrências).
  • Nenhum PR do C141 no GitHub (busca em todas as PRs por C141/permissao/perfil/advisor: 0), nenhuma branch, nenhum commit.
  • Os commits c319995e (feat) e 81e322a5 (changelog, rebase sobre S10) existem só em forgejo/main e na branch forgejo/C141-perfis-de-permissao-por-assessor-visao-edicao-configura.
  • O débito do cutover já documentado (OPS73-FOLLOWUP, #126) cobre o re-home do S10 — mas o C141 não estava listado; o gap do C141 ficou invisível.

Causa raiz: o agente do C141 operou o fluxo Forgejo (PR + merge no Forgejo) na janela do cutover, e o OPS73 só re-homou S8/S9 (+ S10 pendente na #126). O C141 caiu no mesmo buraco sem ninguém registrar.

Impacto: C142 (#107, in-progress) está bloqueado — o modelo de permissão sobre o qual a interface deve ser construída não existe no base do worktree (cortado de origin/main).

Fases

F1 — Re-home do C141 no GitHub main (mesma mecânica do re-home S8/S9 do OPS73)

  • Cherry-pick dos commits do C141 sobre o main do GitHub. Duas opções de fonte:
    • 60857ad3 (commit original do C141, branch forgejo/C141-..., base pré-S10) — aplica direto sobre o main atual sem depender do S10; ou
    • c319995e + 81e322a5 (versão rebaseada sobre S10 em forgejo/main) — só depois do re-home do S10 (#126).
  • Escopo do cherry-pick: src/lib/campaignAdvisorProfile.ts + src/collections/CampaignUser.ts (campos visibility/editing) + migration 20260819_214755_... (.ts/.json + entrada no index.ts) + eixos de escrita (advisorEditingAccess, resolveProfileScopedRead, assertPersonContactWritable) + UI de /campanha/assessores + testes (campaignAdvisorPermission.int.spec.ts, campaignAdvisorProfile.unit.spec.ts, accessShared.unit.spec.ts) + changelog.
  • Gates: pnpm push completo + e2e da superfície assessores no CI.
  • Verificar ao vivo: migration aplicada no local; /campanha/assessores com coluna Permissão; perfil resolvido para assessor com editing: somente_leitura.

F2 — Sincronização automática Forgejo → GitHub (prevenir a classe inteira)

O usuário pediu (2026-08-20): "o push no Forgejo deve enviar automaticamente uma cópia pro GitHub, do lado do Forgejo mesmo". O Forgejo suporta isso nativamente:

  • Push mirror (Settings → Repository → Mirror Settings → Add Push Mirror, ou POST /api/v1/repos/fsolla/teqo/push_mirrors): remote URL https://github.com/fsolla/teqo.git, usuário GitHub + fine-grained PAT (permissões Contents + Workflows no repo), sync_on_commit: true (dispara a cada push), branch filter (ex.: main ou vazio = todas).
  • CRÍTICO — não habilitar antes da convergência: forgejo/main e GitHub main estão divergentes (cada lado tem commits que o outro não tem — OPS71-OPS74/S11/C143 só no GitHub; S10/C141/C144 só no Forgejo). Um push mirror sobre refs divergentes pode sobrescrever a história do GitHub main (comportamento force de mirror) ou falhar. Sequência segura: (1) convergir main (F1 + re-home do S10 da #126 + re-home dos plans C141/C143/C142/C144), (2) só então armar o mirror com main no branch filter, (3) validar em repo de teste antes (a semântica force/não-force do push mirror do Forgejo precisa de confirmação empírica).
  • Alternativa local (fallback do usuário): git remote set-url --add --push com Forgejo como origin principal e push para os dois — não recomendada: inverte a decisão do OPS71 (CI/PR/deploy vivem no GitHub) e reintroduz dupla fonte de verdade; o mirror server-side cobre o caso sem inverter o fluxo.

Aceite

  • C141 rodando no GitHub main (arquivos + migration + testes) e o worktree de C142 rebaseado sobre ele.
  • Push mirror Forgejo→GitHub ativo com sync_on_commit, validado (push no Forgejo → commit aparece no GitHub) e com main convergido antes.
  • Verificação: docs/ops/teqo-1313-deploy.md anotado com a falha conhecida "PR mergeado no Forgejo não chega ao GitHub main".

Não escopo

  • Re-homar S8/S9 de novo (já no main via OPS73).
  • Mudar a decisão de fluxo do OPS71 (GitHub como host de CI/PR/deploy; Forgejo como tracker) — o mirror é rede de segurança, não inversão.
  • Executar o C142 em si (é a Issue #107, só desbloqueada).

Referências

--- id: OPS75 depends: [126] serializes: [] priority: P1 model: composer-2.5 --- Plano: — ## Contexto (descoberto na execução do C142, Issue #107) O C141 (perfis de permissão por assessor) está `done`+`in-prod` no tracker (PR #110 do Forgejo, merge 2026-08-20T01:24:56Z), mas o **código dele nunca chegou ao GitHub main** — o remote vivo pós-cutover OPS71: - `campaignAdvisorProfile.ts` **não existe** no GitHub main (verificado via API: `404`). - Migration `20260819_214755_add_campaign_user_advisor_permission_profile` **não existe** no GitHub main. - `CampaignUser.ts` no GitHub main **não tem** `visibility`/`editing` (grep: 0 ocorrências). - **Nenhum PR do C141 no GitHub** (busca em todas as PRs por `C141`/`permissao`/`perfil`/`advisor`: 0), nenhuma branch, nenhum commit. - Os commits `c319995e` (feat) e `81e322a5` (changelog, rebase sobre S10) existem só em `forgejo/main` e na branch `forgejo/C141-perfis-de-permissao-por-assessor-visao-edicao-configura`. - O débito do cutover **já documentado** (OPS73-FOLLOWUP, #126) cobre o re-home do **S10** — mas o C141 não estava listado; o gap do C141 ficou invisível. **Causa raiz:** o agente do C141 operou o fluxo Forgejo (PR + merge no Forgejo) na janela do cutover, e o OPS73 só re-homou S8/S9 (+ S10 pendente na #126). O C141 caiu no mesmo buraco sem ninguém registrar. **Impacto:** C142 (#107, `in-progress`) está bloqueado — o modelo de permissão sobre o qual a interface deve ser construída não existe no base do worktree (cortado de `origin/main`). ## Fases ### F1 — Re-home do C141 no GitHub main (mesma mecânica do re-home S8/S9 do OPS73) - Cherry-pick dos commits do C141 sobre o main do GitHub. **Duas opções de fonte:** - `60857ad3` (commit original do C141, branch `forgejo/C141-...`, base pré-S10) — aplica direto sobre o main atual sem depender do S10; **ou** - `c319995e` + `81e322a5` (versão rebaseada sobre S10 em `forgejo/main`) — só depois do re-home do S10 (#126). - Escopo do cherry-pick: `src/lib/campaignAdvisorProfile.ts` + `src/collections/CampaignUser.ts` (campos `visibility`/`editing`) + migration `20260819_214755_...` (.ts/.json + entrada no `index.ts`) + eixos de escrita (`advisorEditingAccess`, `resolveProfileScopedRead`, `assertPersonContactWritable`) + UI de `/campanha/assessores` + testes (`campaignAdvisorPermission.int.spec.ts`, `campaignAdvisorProfile.unit.spec.ts`, `accessShared.unit.spec.ts`) + changelog. - Gates: `pnpm push` completo + e2e da superfície assessores no CI. - **Verificar ao vivo:** migration aplicada no local; `/campanha/assessores` com coluna Permissão; perfil resolvido para assessor com `editing: somente_leitura`. ### F2 — Sincronização automática Forgejo → GitHub (prevenir a classe inteira) O usuário pediu (2026-08-20): "o push no Forgejo deve enviar automaticamente uma cópia pro GitHub, do lado do Forgejo mesmo". **O Forgejo suporta isso nativamente:** - **Push mirror** (Settings → Repository → Mirror Settings → Add Push Mirror, ou `POST /api/v1/repos/fsolla/teqo/push_mirrors`): remote URL `https://github.com/fsolla/teqo.git`, usuário GitHub + **fine-grained PAT** (permissões Contents + Workflows no repo), `sync_on_commit: true` (dispara a cada push), branch filter (ex.: `main` ou vazio = todas). - **CRÍTICO — não habilitar antes da convergência:** `forgejo/main` e GitHub `main` estão **divergentes** (cada lado tem commits que o outro não tem — OPS71-OPS74/S11/C143 só no GitHub; S10/C141/C144 só no Forgejo). Um push mirror sobre refs divergentes pode **sobrescrever a história** do GitHub main (comportamento force de mirror) ou falhar. Sequência segura: (1) convergir `main` (F1 + re-home do S10 da #126 + re-home dos plans C141/C143/C142/C144), (2) só então armar o mirror com `main` no branch filter, (3) validar em repo de teste antes (a semântica force/não-force do push mirror do Forgejo precisa de confirmação empírica). - Alternativa local (fallback do usuário): `git remote set-url --add --push` com Forgejo como origin principal e push para os dois — **não recomendada**: inverte a decisão do OPS71 (CI/PR/deploy vivem no GitHub) e reintroduz dupla fonte de verdade; o mirror server-side cobre o caso sem inverter o fluxo. ## Aceite - C141 rodando no GitHub main (arquivos + migration + testes) e o worktree de C142 rebaseado sobre ele. - Push mirror Forgejo→GitHub ativo com `sync_on_commit`, validado (push no Forgejo → commit aparece no GitHub) e com `main` convergido antes. - Verificação: `docs/ops/teqo-1313-deploy.md` anotado com a falha conhecida "PR mergeado no Forgejo não chega ao GitHub main". ## Não escopo - Re-homar S8/S9 de novo (já no main via OPS73). - Mudar a decisão de fluxo do OPS71 (GitHub como host de CI/PR/deploy; Forgejo como tracker) — o mirror é rede de segurança, não inversão. - Executar o C142 em si (é a Issue #107, só desbloqueada). ## Referências - OPS73-FOLLOWUP (#126) — re-home do S10 + origem do workspace + race seedUser. - PR #110 (Forgejo) — merge do C141. - C141 (#105, `done`+`in-prod`) e C142 (#107, `in-progress`). - Docs: https://forgejo.org/docs/latest/user/repo-mirror/
fsolla added the
kind:chore
prio:P1
labels 2026-08-20 16:13:34 +00:00
Author
Owner

F1 — Re-home do C141 no GitHub main: CONCLUÍDO (2026-08-20, na sessão de execução do C142).

===

  • PR GitHub #757 OPS75-rehome-c141-github-main → mergeado via auto-merge nativo em 3f74b696 (required check CI (PR) / checks verde).
  • Fonte do cherry-pick: commit 60857ad3 (branch forgejo/C141-...), aplicado sobre o GitHub main; fusão com o C143 (já no main) resolvida em 3 arquivos:
    • src/utilities/access/demands.ts — mantém a regra C143 (responsáveis explícitos) na leitura; adiciona o eixo de edição do C141 (somente_leitura fecha updates) sobre o escopo do C143.
    • src/migrations/index.ts — registra APENAS a migration do C141 (20260819_214755_...); S10 NÃO entrou (pending #126).
    • src/payload-types.ts — mantém responsibles (C143) + visibility/editing (C141).
  • Verificação: 41 arquivos herdados do C141 (diff vs 60857ad3 idêntico em todos os não-conflitantes), sem S10; gates locais verdes (tsc, lint, format, knip exit 0, cycles, unit 2451, int 815 com campaignAdvisorPermission.int.spec.ts, build); importMap com handler S3 intacto (sem regressão OPS69).
  • Worktree C142 rebaseado sobre o novo main (3f74b696) — o modelo de permissão está disponível.

F2 — Push mirror Forgejo→GitHub: segue pendente (req. fine-grained PAT + convergência do main — S10 da #126 ainda pendente). Ver notas da fase no body.

**F1 — Re-home do C141 no GitHub main: CONCLUÍDO** (2026-08-20, na sessão de execução do C142). === - **PR GitHub #757** `OPS75-rehome-c141-github-main` → mergeado via auto-merge nativo em `3f74b696` (required check `CI (PR) / checks` verde). - **Fonte do cherry-pick:** commit `60857ad3` (branch `forgejo/C141-...`), aplicado sobre o GitHub main; fusão com o C143 (já no main) resolvida em 3 arquivos: - `src/utilities/access/demands.ts` — mantém a regra C143 (responsáveis explícitos) na leitura; adiciona o eixo de edição do C141 (`somente_leitura` fecha updates) sobre o escopo do C143. - `src/migrations/index.ts` — registra APENAS a migration do C141 (`20260819_214755_...`); S10 NÃO entrou (pending #126). - `src/payload-types.ts` — mantém `responsibles` (C143) + `visibility`/`editing` (C141). - **Verificação:** 41 arquivos herdados do C141 (diff vs `60857ad3` idêntico em todos os não-conflitantes), sem S10; gates locais verdes (tsc, lint, format, knip exit 0, cycles, unit 2451, int 815 com `campaignAdvisorPermission.int.spec.ts`, build); importMap com handler S3 intacto (sem regressão OPS69). - **Worktree C142** rebaseado sobre o novo main (`3f74b696`) — o modelo de permissão está disponível. **F2 — Push mirror Forgejo→GitHub:** segue pendente (req. fine-grained PAT + convergência do `main` — S10 da #126 ainda pendente). Ver notas da fase no body.
Author
Owner

F1 (convergência) — CONCLUÍDO.

  • PR Forgejo #128 mergeado: e7b47455 ("merge(OPS75): convergência dos mains Forgejo + GitHub").
  • Merge commit com pais = Forgejo main (9ae34b68) e GitHub main (3f74b696) — ambos são ancestrais → convergido de verdade: nenhum commit de nenhuma linhagem se perde, em qualquer direção de force-push do mirror.
  • Conflitos resolvidos: migrations/index.ts (5 migrations dos dois lados), demands.ts (C143 leitura + eixo C141), newsletter (S10/pixel), importMap.js (restaurado com handler S3 — classe OPS69), CHANGELOG-AGENTS.md (regenerado, 46 entradas).
  • Gates verdes: tsc/lint/format/knip/cycles/unit 2457/int 815/build; migrations aplicadas ao teoq_test.

Mirror Forgejo→GitHub: agora é SEGURO criar (a convergência elimina o risco de force-push destruir história). Recriar pela UI:

  1. Settings → Repository → Mirror Settings → Add Push Mirror.
  2. Remote URL git@github.com:fsolla/teqo.git (SSH).
  3. Marcar "Use SSH authentication", sem usuário/senha.
  4. Depois de criar, clicar "Copy public key" e adicionar como deploy key no GitHub (Settings → Deploy keys, com Allow write access).
  5. "Synchronize now" — e conferir que o GitHub main passa a apontar para e7b47455.

⚠️ Recomendo branch filter com main (senão o mirror usa git push --mirror e força TODAS as refs, incluindo branches de trabalho).

**F1 (convergência) — CONCLUÍDO.** - PR Forgejo #128 mergeado: `e7b47455` ("merge(OPS75): convergência dos mains Forgejo + GitHub"). - Merge commit com pais = Forgejo main (`9ae34b68`) e GitHub main (`3f74b696`) — **ambos são ancestrais** → convergido de verdade: nenhum commit de nenhuma linhagem se perde, em qualquer direção de force-push do mirror. - Conflitos resolvidos: `migrations/index.ts` (5 migrations dos dois lados), `demands.ts` (C143 leitura + eixo C141), newsletter (S10/pixel), `importMap.js` (restaurado com handler S3 — classe OPS69), `CHANGELOG-AGENTS.md` (regenerado, 46 entradas). - Gates verdes: tsc/lint/format/knip/cycles/unit 2457/int 815/build; migrations aplicadas ao `teoq_test`. **Mirror Forgejo→GitHub:** agora é SEGURO criar (a convergência elimina o risco de force-push destruir história). Recriar pela UI: 1. Settings → Repository → Mirror Settings → Add Push Mirror. 2. Remote URL `git@github.com:fsolla/teqo.git` (SSH). 3. Marcar **"Use SSH authentication"**, sem usuário/senha. 4. Depois de criar, clicar **"Copy public key"** e adicionar como deploy key no GitHub (Settings → Deploy keys, com **Allow write access**). 5. "Synchronize now" — e conferir que o GitHub main passa a apontar para `e7b47455`. ⚠️ Recomendo **branch filter** com `main` (senão o mirror usa `git push --mirror` e força TODAS as refs, incluindo branches de trabalho).
Author
Owner

Resolução final (2026-08-21): GITHUB como fonte única — engenharia de dois repos encerrada.

O mirror Forgejo→GitHub foi removido (a direção estava invertida: GitHub principal = branches, main, PRs, CI via Actions). A convergência foi aplicada ao GitHub main:

  • PR GitHub #758 mergeado (squash) → c723d6ac, árvore 9d030639 = idêntica à convergência Forgejo e7b47455 (diff 0).
  • Traz para o GitHub main todo o conteúdo Forgejo-only: S10 (pixel Meta, migração 20260819_213947_..., campaignHomeTracking.ts), C144 (docs/plans/escopo-formularios-escrita-perfil.md, *Options.ts), variantes C141/S8/S9 já cobertas.
  • Gates do CI GitHub verdes (CI (PR) / checks); merge validado no Forgejo antes (tsc/lint/format/knip/cycles/unit 2457/int 815/build).
  • Worktree C142 atualizado para c723d6ac; branches de teste e temporárias limpas.

Estado final dos mains (mesmo conteúdo):

  • GitHub main: c723d6ac (árvore 9d030639)
  • Forgejo main: e7b47455 (árvore 9d030639)

Pendência (nova decisão): migrar o issue tracker do Forgejo para o GitHub (issues ativas, flips pós-merge, pnpm issue/agent:*, docs AGENTS/AGENT-OPS). O Forgejo deixa de ser canal ativo.

**Resolução final (2026-08-21): GITHUB como fonte única — engenharia de dois repos encerrada.** O mirror Forgejo→GitHub foi removido (a direção estava invertida: GitHub principal = branches, main, PRs, CI via Actions). A convergência foi aplicada ao GitHub main: - **PR GitHub #758** mergeado (squash) → **`c723d6ac`**, árvore `9d030639` = **idêntica** à convergência Forgejo `e7b47455` (diff 0). - Traz para o GitHub main todo o conteúdo Forgejo-only: **S10** (pixel Meta, migração `20260819_213947_...`, `campaignHomeTracking.ts`), **C144** (`docs/plans/escopo-formularios-escrita-perfil.md`, `*Options.ts`), variantes C141/S8/S9 já cobertas. - Gates do CI GitHub verdes (`CI (PR) / checks`); merge validado no Forgejo antes (tsc/lint/format/knip/cycles/unit 2457/int 815/build). - Worktree C142 atualizado para `c723d6ac`; branches de teste e temporárias limpas. **Estado final dos mains (mesmo conteúdo):** - GitHub main: `c723d6ac` (árvore `9d030639`) - Forgejo main: `e7b47455` (árvore `9d030639`) **Pendência (nova decisão):** migrar o issue tracker do Forgejo para o GitHub (issues ativas, flips pós-merge, `pnpm issue`/`agent:*`, docs AGENTS/AGENT-OPS). O Forgejo deixa de ser canal ativo.
Author
Owner

Tracker migrado para o GitHub — continue em #gh759 (github.com/fsolla/teqo/issues/759). Esta Issue Forgejo está fechada.

Tracker migrado para o GitHub — continue em #gh759 (github.com/fsolla/teqo/issues/759). Esta Issue Forgejo está fechada.
Sign in to join this conversation.
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.

Reference: fsolla/teqo#127
No description provided.