From beb5ac4b9a6767bad4134c2c10f6e2eb82cb3594 Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Thu, 20 Aug 2026 00:38:52 -0300 Subject: [PATCH] =?UTF-8?q?docs(OPS73):=20changelog=20+=20evid=C3=AAncia?= =?UTF-8?q?=20do=20deploy=20do=20fix=20do=20admin=20em=20prod=20(Closes=20?= =?UTF-8?q?#114)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/CHANGELOG-AGENTS.md | 2 ++ docs/changelog/2026-08-20-ops73.md | 1 + .../ops73-deploy-admin-prod-fixed-evidence.png | Bin 0 -> 13872 bytes docs/plans/ops73-deploy-admin-prod-impl.md | 2 +- src/app/(payload)/admin/importMap.js | 2 ++ 5 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/2026-08-20-ops73.md create mode 100644 docs/plans/ops73-deploy-admin-prod-fixed-evidence.png diff --git a/docs/CHANGELOG-AGENTS.md b/docs/CHANGELOG-AGENTS.md index 72f25eec..c4e1cbe7 100644 --- a/docs/CHANGELOG-AGENTS.md +++ b/docs/CHANGELOG-AGENTS.md @@ -4,6 +4,8 @@ Conteúdo movido do `AGENTS.md` em 2026-07-30 (fatiamento do paradigma de agente --- +**OPS73 — deploy do fix do admin em produção (2026-08-20):** o `/admin` do Payload (jorgesolla1313.com.br) voltou a renderizar o formulário de login em produção — o bug de "tela branca" que travava o CMS do time editorial/campanha está resolvido e verificado. O diagnóstico mostrou que a premissa do plano (fix nunca tinha chegado a prod) estava errada em dois pontos: (1) o deploy das 23:09 de 2026-08-19 (revision `8c734ba`) já continha o fix do importMap no histórico, mas o commit S9 (`8d2352c0`) regenerou o importMap **sem** as envs `S3_*`, removendo o handler `@payloadcms/storage-s3/client#S3ClientUploadHandler` e reintroduzindo `getFromImportMap: PayloadComponent not found` (admin em branco de novo); (2) o **main do GitHub havia divergido do Forgejo** (pós-cutover OPS71) — o GitHub tinha o fix + OPS71, mas não as features S8 ("Nossa história") e S9 (captura de novidades) que produção já rodava. A entrega (PR #751): re-home do S8+S9 no GitHub main (cherry-pick `8d2352c0`+`488dcf7d`), mantendo o handler no importMap (prova: `generate:importmap` com envs `S3_*` dummy → diff vazio vs main); deploy via `deploy.yml` no runner self-hosted do homeserver (`dba75ff8`), após 2 "stale run" por merges paralelos no verify; migração C143 (responsáveis de demandas, aditiva+backfill) aplicada. Verificação pós-deploy: revision `dba75ff8`, healthy, **log sem `getFromImportMap`**, `/admin` renderizando o login (2 inputs + botão, título "Login - Payload", 0 erros de console), home mantendo S8/S9. Evidência: `docs/plans/ops73-deploy-admin-prod-fixed-evidence.png`. Lições: regeneração do importMap sem envs `S3_*` re-órfão o handler (classe do guard OPS70/#87); divergência de plataformas pós-cutover (workspace homeserver ainda aponta Forgejo local; S10 pixel pendente de re-home). + **S11** — o feed do Instagram configurado **sem aparecer na home** fica diagnosticável: fim do fail-closed silencioso da S3. A assessoria vê, na mesma global onde preenche o token, o estado da sincronização (`instagramSyncStatus` jsonb hidden na `social-feed-settings`) e o **porquê** de os posts não aparecerem — o painel `InstagramSyncStatusPanel` (campo `ui` irmão do picker) mostra 5 estados fiéis ao rascunho aprovado (desativado / ainda não configurado / falha com motivo em linguagem de produto + "Tentar sincronizar de novo" / sincronizado · há X min · N posts / aguardando 1ª sync). A causa da ocorrência de produção (board vazio com token+ID preenchidos) é agora confirmável em 1 clique após o deploy. Engenharia: `loadInstagramFeed` passou a parsear o body de erro da Graph API e lançar `InstagramApiError` (`status` + `{message,type}`); `describeInstagramError` mapeia para copy pt-BR com a correção — OAuthException/expired → "token inválido/expirado ou emitido via Facebook Login — gere pelo Instagram Login" (o refresh endpoint da Graph API só renova tokens de Instagram Login), "Invalid user id" → "confira o ID da conta Business/Creator", 5xx → indisponível, `TypeError` → rede. Estado escrito por 3 caminhos: render da home (`getInstagramFeed`, dentro do `unstable_cache`, SQL direto sem hooks — padrão anti-`revalidateTag`-no-cache da S2), `afterChange` da global (sync **awaited** quando a credencial IG muda — `instagramCredentialsChanged(doc, previousDoc)`, gate que pula save de exclusões/YouTube; o sync é importado lazy no hook para o `payload.config.ts` não puxar o módulo do feed no load, que é o que todo spec int importa) e a rota `POST /api/social-feed/sync` (botão; `payload.auth` sessão admin exigindo `users` + `isSameOriginRequest` CSRF — allowlistada no spec de convenção de POST routes com razão, é auth de admin ≠ envelope `/campanha`). **Bug real descoberto e corrigido na entrega:** o `afterChange` roda DENTRO da transação do save (a row lock fica presa até os hooks retornarem), então escrever o status/snapshot via pool numa segunda conexão **deadlockava no lock da própria linha** (~80-230s por save, transações-zumbi segurando o lock). A correção roteia os persists do sync-hook pela **mesma transação** (`getPostgresTransactionDatabase` — o helper transacional da C6) com um `req` opcional no `syncInstagramFeed`; o render e a rota sem transação aberta seguem no pool. Diagnóstico reproduzido em `pg_stat_activity` (UPDATE `transactionid` Lock vs `idle in transaction`) e fix verificado (45ms vs 232s). Stub IG ganha estado `invalid-token` (400 OAuthException) para o e2e da cena de falha; runbook `docs/ops/instagram-feed-token-runbook.md` (o que o painel mostra, validação via curl `/me` e `refresh_access_token`, geração pelo Instagram Login, o que NÃO fazer). Migration `20260820_003426_add_instagram_sync_status` (ADD COLUMN jsonb nullable, não destrutiva). **/simplify (3 reviewers):** absorvi a correção P1 de diagnóstico — o mapeamento de ID exigia só "user" (regex frouxo) e mensagens reais de token OAuthException ("the **user** must be logged in", "user changed password") caíam na branch de ID, mostrando a razão errada; passei a exigir "user" E "id" juntos (`isInvalidUserIdMessage`) e adicionei o mapeamento de `AbortError` (timeout → "demorou demais"). Painel: gate passou a respeitar o master `enabled` (master off → "Instagram desativado", nunca "Sincronizado no board"), rótulo do botão no estado de primeira sync ("Tentar sincronizar" vs "de novo"), `outcome` transiente limpo ao editar credencial e `aria-live` nos boxes interativos. Testes: caminho transacional do `syncInstagramFeed` (persist na mesma transação) + fallback pool cobertos por unit; e2e do painel ganhou as cenas fail-500 e "desativado"; cleanup do stub global virou `afterEach`. Débitos registrados: #124 (janela de lock: fetch de rede no sync-hook segura a row lock até 10s, acoplando a home ao save) e #125 (polish P3 — tipo de persist duplicado, rota 200 vs 400, last-writer-wins stale, `5 posts` hardcoded). Verificação: unit 2463 + int 791 verdes; lint/format/tsc/cycles verdes; `pnpm build` ok; e2e local — smoke admin 5/5 (painel ok → falha token → retry → falha 500 → desativado → não configurado) + describe serial frontend 19/19. **C143** — demandas visíveis apenas para responsáveis explícitos + candidato/coordenador. Novo campo `campaignDemand.responsibles` (hasMany → `campaignUser`, staff elegível via `eligibleCampaignStaffWhere` com hook `beforeValidate` que descarta ids não-staff, fail-closed) e regra de leitura/atualização por membership: assessor só vê demandas onde é responsável (`{ responsibles: { contains } }`), candidato/coordenador/admin sempre, leader nunca — a regra substitui o escopo municipal de demandas em `src/utilities/access/demands.ts` e todas as superfícies (lista, URL, busca global, demandas de atividade, C90) herdam via `overrideAccess: false`; criação sem responsáveis fica visível só a unrestricted (fail-closed). Criador entra automaticamente como responsável no hook `enforceDemandWorkflow` (cobre form, wizard e rascunhos C90); migration `20260819_233503_add_campaign_demand_responsibles` adiciona `campaign_user_id` a `campaign_demand_rels` (FK cascade) e faz backfill de `created_by_id` → responsável para demandas pré-C143. UI: picker multi-select `DemandResponsibleMultiSelect` (chips com avatar, chip do criador rotulado "(criador)" e travado na criação, sugestões = assessores do município) na criação (`/demandas/nova` em 2 colunas + wizard "Registrar pedido" empilhado) e card de gestão `DemandResponsiblesCard` no detalhe (add/remove com save full-replace + advisory lock, rótulo "Visível para: Responsáveis · Candidato · Coordenador"); busca por `searchDemandResponsibleOptions` (query curta → assessores do município; senão → staff por nome). Testes: int reescritos para a regra nova (workflow/homeSearch) + 4 casos novos (membership, fail-closed sem responsáveis, gestão add/remove/self-removal, responsável fora da carteira, descarte de id não-staff); e2e novo `campaignDemandVisibility.e2e.spec.ts` (assessor do mesmo município não vê lista/URL; hand-off de acesso add/revoke pela UI); fixture e2e ganhou `createCampaignDemand`. Verificação: unit 2444 + int 795 verdes, e2e 5/5 local (visibility + wizard + demanda do municipalidades), lint/format/knip/cycles/tsc/build limpos; importMap regenerado com `S3_*` dummy (OPS69). Nota de deploy: conferir na primeira aplicação em prod `SELECT count(*) FROM campaign_demand_rels WHERE path='responsibles'` = nº de demandas com `created_by_id`. Plano de implementação: `docs/plans/demandas-responsaveis-impl.md`. diff --git a/docs/changelog/2026-08-20-ops73.md b/docs/changelog/2026-08-20-ops73.md new file mode 100644 index 00000000..33ae5218 --- /dev/null +++ b/docs/changelog/2026-08-20-ops73.md @@ -0,0 +1 @@ +**OPS73 — deploy do fix do admin em produção (2026-08-20):** o `/admin` do Payload (jorgesolla1313.com.br) voltou a renderizar o formulário de login em produção — o bug de "tela branca" que travava o CMS do time editorial/campanha está resolvido e verificado. Durante o diagnóstico descobriu-se que a premissa do plano ("produção nunca recebeu o fix OPS69") estava errada: o deploy das 23:09 de 2026-08-19 (revision `8c734ba`) já continha o fix do importMap **no histórico**, mas o commit S9 (`8d2352c0`, captura de novidades na home) tinha regenerado o importMap **sem** as envs `S3_*`, removendo o handler `@payloadcms/storage-s3/client#S3ClientUploadHandler` e reintroduzindo o erro `getFromImportMap: PayloadComponent not found in importMap` — o admin abria em branco de novo ("funcionou e no deploy seguinte parou"). Verificado também que o **main do GitHub havia divergido do Forgejo** (pós-cutover OPS71): o GitHub tinha o fix + OPS71, mas não as features S8 (seção "Nossa história") e S9 (captura de novidades) que produção já rodava — deployar o main como estava regrediria as duas. A entrega: PR #751 re-homou no GitHub main as features S8+S9 (cherry-pick dos commits aprovados no Forgejo `8d2352c0` + `488dcf7d`), mantendo o handler no importMap (prova: `generate:importmap` com envs `S3_*` dummy → diff vazio vs main); CI verde; aguardando o merge. Deploy pós-merge via o pipeline canônico do OPS71 (dispatch manual do `deploy.yml`: `verify` full → job `deploy` no runner self-hosted recém-instalado no homeserver — 2 tentativas "stale run" por merges paralelos no meio do verify, terceira aplicou `dba75ff8`); migração C143 (responsáveis de demandas, aditiva+backfill) aplicada. Verificação pós-deploy: container na revision `dba75ff8`, healthy, **log sem nenhum `getFromImportMap`**, `/admin` renderizando o formulário de login (2 inputs email/senha + botão Login, título "Login - Payload", 0 erros de console), e a home pública mantendo "Nossa história" (S8) e o form de novidades (S9). Evidência: `docs/plans/ops73-deploy-admin-prod-fixed-evidence.png`. Lições registradas: a regeneração do importMap sem envs `S3_*` re-órfão o handler (classe exata que o guard #87 deve impedir no CI); divergência de plataformas pós-cutover — workspace do homeserver ainda apontava para o Forgejo local (`localhost:3000`) e o S10 (pixel) segue pendente de re-home no GitHub. \ No newline at end of file diff --git a/docs/plans/ops73-deploy-admin-prod-fixed-evidence.png b/docs/plans/ops73-deploy-admin-prod-fixed-evidence.png new file mode 100644 index 0000000000000000000000000000000000000000..c23d92c0a5e6b362e368fba5eb886ec973f706de GIT binary patch literal 13872 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 Jylwg7{{ZLJ$%Fs^ literal 0 HcmV?d00001 diff --git a/docs/plans/ops73-deploy-admin-prod-impl.md b/docs/plans/ops73-deploy-admin-prod-impl.md index df114172..083d249e 100644 --- a/docs/plans/ops73-deploy-admin-prod-impl.md +++ b/docs/plans/ops73-deploy-admin-prod-impl.md @@ -1,6 +1,6 @@ # Impl: Admin do Payload segue em branco em produção — re-home S8/S9 no GitHub + fix importMap + deploy + verificação -Status: aprovado +Status: entregue (deploy `dba75ff8` em prod + verificação pós-deploy completa) Atualizado em: 2026-08-20 Issue: #114 Intenção: docs/plans/ops73-deploy-admin-prod.md diff --git a/src/app/(payload)/admin/importMap.js b/src/app/(payload)/admin/importMap.js index ed8c41ef..097d2c4e 100644 --- a/src/app/(payload)/admin/importMap.js +++ b/src/app/(payload)/admin/importMap.js @@ -36,6 +36,7 @@ import { ImportPreview as ImportPreview_cdf7e044479f899a31f804427d568b36 } from import { ImportSaveButton as ImportSaveButton_cdf7e044479f899a31f804427d568b36 } from '@payloadcms/plugin-import-export/rsc' import { InstagramSyncStatusPanel as InstagramSyncStatusPanel_90dd38ffecf41d93e389c788f98f48da } from '../../../components/admin/InstagramSyncStatusPanel' import { InstagramPostExclusionPicker as InstagramPostExclusionPicker_ba03418db242c21470543bbeb06827a0 } from '../../../components/admin/InstagramPostExclusionPicker' +import { S3ClientUploadHandler as S3ClientUploadHandler_f97aa6c64367fa259c5bc0567239ef24 } from '@payloadcms/storage-s3/client' import { ImportExportProvider as ImportExportProvider_cdf7e044479f899a31f804427d568b36 } from '@payloadcms/plugin-import-export/rsc' import { CollectionCards as CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 } from '@payloadcms/next/rsc' @@ -78,6 +79,7 @@ export const importMap = { "@payloadcms/plugin-import-export/rsc#ImportSaveButton": ImportSaveButton_cdf7e044479f899a31f804427d568b36, "./components/admin/InstagramSyncStatusPanel#InstagramSyncStatusPanel": InstagramSyncStatusPanel_90dd38ffecf41d93e389c788f98f48da, "./components/admin/InstagramPostExclusionPicker#InstagramPostExclusionPicker": InstagramPostExclusionPicker_ba03418db242c21470543bbeb06827a0, + "@payloadcms/storage-s3/client#S3ClientUploadHandler": S3ClientUploadHandler_f97aa6c64367fa259c5bc0567239ef24, "@payloadcms/plugin-import-export/rsc#ImportExportProvider": ImportExportProvider_cdf7e044479f899a31f804427d568b36, "@payloadcms/next/rsc#CollectionCards": CollectionCards_f9c02e79a4aed9a3924487c0cd4cafb1 }