teqo-backup/docs/changelog
Francisco Solla c723d6accf
merge(OPS75): convergência Forgejo→GitHub — GitHub como fonte única
* deploy: limpeza pós-deploy do build cache e tags locais antigas (INF3/F2)

O deploy compila no homeserver e acumulava build cache + tags locais
antigas no disco raiz (incidente 19/08: 45G de cache). Após o smoke:
docker builder prune -f + remoção das tags locais teqo-1313 exceto o
SHA em uso (best-effort, registry preserva o rollback).

* feat(S9): captura de novidades da campanha na home pública (form + CTA do hero)

Seção 'Receba as novidades da campanha' acima do rodapé: nome + WhatsApp
obrigatórios, e-mail/estado/cidade/comentário opcionais, toggle pré-selecionado
'Quero fazer parte do time' gravado como subscription.campaignLevel
(time|esporadico). CTA secundário do hero vira o atalho (#novidades, scroll
suave). Contact + Subscription em withPayloadTransaction com consentimento
novo fail-closed por chave estável 'campanha-novidades' — nada é gravado sem o
texto aprovado no admin. Migration 20260819_192605 (state de contact nullable
+ coluna campaign_level). Impl plan, changelog, int + e2e.

* plans(C141,C143,C142): permissões granulares por assessor + responsáveis de demanda + UI por perfil

* plans(C141,C143,C142): permissões granulares por assessor + responsáveis de demanda + UI por perfil

* feat(S8): seção 'Nossa história' na home — vídeo da trajetória embutido do YouTube (Closes #91)

* docs(S8): resolução do conflito com S9 (história → newsletter) + nota do guard e2e dev-only

* feat(S10): pixel do Meta na página pública de campanha (campo admin em SiteSettings + PageView na home + Lead no sucesso da captura)

Campo tracking.facebookPixelId no global SiteSettings (mesma validação/normalização do precedente Petition, regra centralizada em facebookPixel.ts); home (grupo (home)) injeta o base code + PageView quando o ID está configurado (fail-closed) e o CampaignNewsletterForm dispara exatamente um Lead no sucesso do S9. Migration 20260819_213947_add_site_settings_facebook_pixel_id. Closes #94

* refactor(S10): simplify pass — Lead wiring unit-tested e raças de estado compartilhado do e2e resolvidas

e2e: stub hermético de connect.facebook.net no guard compartilhado (specs paralelos renderizam a home com o pixel); advisory lock no Postgres serializando o login do usuário de teste (Payload perde sessão em login concorrente read-modify-write — classe documentada no webauthn); seedTestUser vira create-if-missing (sem janela de usuário ausente nem reset de senha); Lead do form protegido do catch de erro (tracking nunca falha uma captura commitada); descrição do campo compartilhada; unidade nova campaignNewsletterLead cobre exatamente um Lead no sucesso.

* feat(C141): perfis de permissão por assessor — Visão × Edição configuráveis, enforcement fail-closed (Closes #105)

* chore(C141): regenera changelog agregado após rebase com S10

* plans(C144): options write-scoped para formulários de escrita pós-C141

---------

Co-authored-by: Francisco Solla <admin@solla.dev>
2026-08-21 01:41:18 -03:00
..
2026-08-13-ops44.md OPS44: changelog por entrega + guards de docs + merge por rebase 2026-08-13 17:55:22 +00:00
2026-08-15-img-resize.md feat(site): publica home da campanha Jorge Solla 1313 2026-08-16 00:49:24 -03:00
2026-08-16-campaign-home-responsive.md feat(site): hero da campanha responsivo aos boards do Penpot 2026-08-16 20:33:00 -03:00
2026-08-16-ops50.md OPS50: ajusta changelog ao formato prettier 2026-08-16 23:34:28 -03:00
2026-08-17-ops51.md ops(OPS51): migra o banco de produção do Neon para o Postgres do homeserver (teqo_1313) 2026-08-17 22:41:18 +00:00
2026-08-17-ops53.md ops(OPS53): etapa de deploy no CI para o homeserver (teqo-1313) 2026-08-18 00:50:41 +00:00
2026-08-17-pub5.md feat(PUB5): slogan 'Mais saúde mais futuro' no hero e rodapé 2026-08-18 01:31:28 +00:00
2026-08-18-ops52-media-guard.md ops(OPS52-media-guard): reconcile do media:recover exige MEDIA_RECOVER_CONFIRM=1 (guard de intenção explícita) 2026-08-18 12:45:32 -03:00
2026-08-18-ops52-media.md feat(OPS52-media): recupera os objetos de media de produção do WordPress para o bucket (pnpm media:recover) 2026-08-18 08:20:45 -03:00
2026-08-18-ops52.md ops(OPS52): migra a media de produção do Vercel Blob para o Garage S3 2026-08-17 22:36:34 -03:00
2026-08-18-ops54.md ops(OPS54): allowlist onlyBuiltDependencies migra para pnpm-workspace.yaml — fim do warning do pnpm 10 sobre o campo pnpm ignorado 2026-08-18 09:06:37 -03:00
2026-08-18-ops56.md fix(ops OPS56): forgejo-pr-automerge — veredito de merge por re-read do PR (falso positivo 'já mergeado' com PR aberto) 2026-08-18 14:28:54 +00:00
2026-08-18-ops57.md fix(ops OPS57): simplify — veto de draft vale em conversão mid-run; CLI valida base main; docs sem mecanismo fantasma 2026-08-18 15:24:21 +00:00
2026-08-18-ops58.md ops(OPS58): seed de posts com dry-run e taxonomy atualizada — sync de prod com runbook 2026-08-18 12:15:05 -03:00
2026-08-18-ops59.md ops(OPS59): pre-push sem e2e — e2e roda uma vez, no CI (gate local fica com os outros testes) 2026-08-18 17:56:41 +00:00
2026-08-18-ops60.md chore(OPS60): guard SEED_MEDIA_CONFIRM para escrita no bucket via db:seed:posts 2026-08-18 20:11:54 +00:00
2026-08-18-ops61.md fix(OPS61): merge do safety net com FORGEJO_API_TOKEN — 409 PushRejected do hook pre-receive 2026-08-18 18:07:55 -03:00
2026-08-18-ops62.md fix(OPS62): services por nome na rede do job — Forgejo 9 não expande expressões em ports 2026-08-18 23:26:13 +00:00
2026-08-18-ops63.md ops(OPS63): docs-guards no pre-push — changelog append-only, agregado e marcadores de conflito no gate:ci 2026-08-18 21:35:24 +00:00
2026-08-18-ops64.md fix(OPS64): pin do waitForChecks contra rollup mentiroso + docs — OPS62 eliminou o secundário estruturalmente 2026-08-19 12:11:41 -03:00
2026-08-18-ops65.md ops(OPS65): CI do main em janela de 30 min (gate .dockerignore fail-open) + matar agent-pool 2026-08-18 21:08:12 -03:00
2026-08-18-s1.md fix(S1): revert revalidate=300 — trava o bust por tag no Next 15.4 prod 2026-08-18 05:07:26 +00:00
2026-08-18-s2.md feat(S2): seção de conteúdos da home de campanha inclui os vídeos do YouTube 2026-08-18 15:23:50 -03:00
2026-08-18-s3.md feat(S3): seção de conteúdos da home de campanha inclui os posts do Instagram 2026-08-18 20:29:50 -03:00
2026-08-18-s5.md feat(S5): banda visual própria para a seção 'Acompanhe de perto' na home 2026-08-18 13:35:53 -03:00
2026-08-18-s6-followup.md fix(S6-FOLLOWUP): test:e2e:affected rodava a suíte completa — --no-deps desliga o closure de deps dos projects em runs filtrados 2026-08-18 19:09:12 -03:00
2026-08-18-s6.md feat(S6): home de campanha sem carrossel no desktop — grade estática em ≥1024px, mobile preservado 2026-08-18 19:32:50 +00:00
2026-08-19-c141.md feat(C141): perfis de permissão por assessor — Visão × Edição configuráveis, enforcement fail-closed (Closes #105) 2026-08-20 14:25:01 -03:00
2026-08-19-c143.md feat(C143): demandas visíveis apenas para responsáveis explícitos + candidato/coordenador 2026-08-19 23:55:07 -03:00
2026-08-19-ops62-followup.md fix(OPS62-followup): âncora de relógio no fixture do municipalitiesWithoutUpdateTool — elimina o flake de ordenação por raiz 2026-08-19 13:07:30 -03:00
2026-08-19-ops66.md ops(OPS66): deploy — migrate antes do build do runner (deadlock de migrations em caminho estático) 2026-08-19 10:06:00 -03:00
2026-08-19-ops67.md ops(OPS67): retry com backoff nos fetchs do forgejo-api 2026-08-19 13:28:37 +00:00
2026-08-19-ops68.md docs(OPS68): reescreve docs canônicos da era GitHub/Vercel para Forgejo/homeserver 2026-08-19 13:33:05 +00:00
2026-08-19-ops69.md ops(OPS69): regenera importMap com o S3ClientUploadHandler (admin abria em branco em prod) 2026-08-19 12:45:22 -03:00
2026-08-19-ops71-fase2.md feat(OPS71): Fase 2 — remover arquivos do fluxo Forgejo (workflows/scripts/specs) pós-validação do GitHub Actions 2026-08-20 00:20:10 +00:00
2026-08-19-ops71.md feat(OPS71): CI/PR/deploy no GitHub Actions — tracker de Issues permanece no Forgejo (Closes #97) 2026-08-19 19:17:19 -03:00
2026-08-19-ops72.md fix(OPS72): referência do guard do importMap (OPS70/#87, não #77) 2026-08-20 02:12:39 +00:00
2026-08-19-s4.md style: prettier nos docs do S4 (changelog + plans) 2026-08-19 12:50:26 -03:00
2026-08-19-s7.md chore(S7): entrada no changelog agregado (OPS44) 2026-08-19 19:39:09 +00:00
2026-08-19-s8.md feat(S8): seção 'Nossa história' na home — vídeo da trajetória embutido do YouTube (Closes #91) 2026-08-20 02:19:58 +00:00
2026-08-19-s9.md feat(S9): captura de novidades da campanha na home pública (form + CTA do hero) 2026-08-20 02:19:58 +00:00
2026-08-19-s10.md merge(OPS75): convergência Forgejo→GitHub — GitHub como fonte única 2026-08-21 01:41:18 -03:00
2026-08-19-s11.md feat(S11): feed do Instagram configurado não aparece na home — painel de status da sincronização no admin 2026-08-20 00:54:58 -03:00
2026-08-20-ops71-flip.md fix(OPS71-FLIP): flip pós-merge silencioso no GitHub — PAT no arm do auto-merge, dispatch de recuperação, close da Issue, retry 410 2026-08-19 22:45:29 -03:00
2026-08-20-ops71-infra.md docs(OPS71-INFRA): runner do GitHub instalado no homeserver — runbook + changelog (Issue #113) 2026-08-20 00:58:40 +00:00
2026-08-20-ops73.md docs(OPS73-FOLLOWUP): plano de débitos pós-OPS73 — re-home S10 + origin homeserver + race seedUser 2026-08-20 02:12:08 -03:00