Commit graph

2105 commits

Author SHA1 Message Date
Francisco Solla
7a989855da fix(deploy): OPS99 — envs do next build fora do prefixo da cadeia (standalone)
O RUN do builder encadeia gerador de importMap e next build com '&&', mas
prefixos de shell (VAR=x cmd1 && cmd2) valem só para o primeiro comando.
Com o OPS99, NEXT_OUTPUT_STANDALONE=1 e NODE_OPTIONS ficaram presos no
gerador: o next build rodou sem output standalone e o stage runner falhou
no COPY de /app/.next/standalone (run 34701266297, pós-#953 — o #953 já
corrigiu o importmap sem react-server e o falso verde do stale run).

Cada comando passa a declarar seu próprio env, e o guard de invariantes do
Dockerfile em tests/unit/deployScript.unit.spec.ts ganha o pin do escopo
(flags no lado do next build). Inclui post-mortem e changelog.
2026-09-12 12:36:28 -03:00
Francisco Solla
52a2ef6dd1 fix(deploy): gera o importmap com a condition react-server e falha em stale run
OPS99 passou a rodar 'pnpm exec payload generate:importmap' no builder do
Dockerfile sem --conditions=react-server; o server-only resolve para o
módulo que lança e TODO build Docker falha — desde a OPS99 (27/08 19:05
UTC) nenhum deploy real aconteceu e a prod ficou no commit 4d6533c04.
Agora o builder chama 'pnpm generate:importmap' (o script dono das flags,
mesmo usado no predev).

O guard de stale run (main avançou durante o verify) fazia 'exit 0' e o
job reportava sucesso sem deployar (run 34675436246); agora falha com
fatal, sem falso verde.

Testes: unit guarda a linha do Dockerfile (script canônico) e os dois
pontos do guard de stale; build standalone de main validado localmente.
2026-09-12 11:50:10 -03:00
Francisco Solla
60b4e71dc1 docs(S13): formata o impl plan (prettier) 2026-09-12 03:25:43 -03:00
Francisco Solla
b03cec7c7b refactor(S13): endurece o compositor após review
- font: espera a família primária (check falhava pela fallback do next/font)
- load de assets/fonte separado do redraw (sem flicker/live-region por tecla)
- pan/zoom com updates funcionais; photoSize memoizado
- foco volta ao tile do catálogo ao fechar (trigger da home desmonta)
- copy de privacidade centralizada; tile deriva dims/cor do modelo
- aria do input de arquivo sem colidir com o botão; +2 unit tests
2026-09-12 03:25:43 -03:00
Francisco Solla
681f3bb566 feat(S13): cards personalizados da campanha no site público
Home ganha a seção Faça parte com os três modelos e a rota /cards
concentra catálogo + compositor client-side (dialog desktop, bottom
drawer mobile): nome no slot medido do mestre com Brexter 700 e foto
full-bleed sob o overlay oficial (pan/zoom clampados), download PNG
sem conta e sem enviar nome/foto. Núcleo puro em src/lib/card* com
unit tests; e2e cobre home→deep-link, nome→PNG real, erro fail-closed,
foto e drawer mobile. Sem migration/PII.
2026-09-12 03:25:43 -03:00
Francisco Solla
f3c1ad69ea chore(ai): Sollinha no nome canônico deepseek-flash (B201) 2026-09-12 02:47:25 -03:00
Francisco Solla
087635d08b fix(agenda): modais usáveis no desktop — criação, sync e feed (C148) 2026-09-12 02:23:23 -03:00
Francisco Solla
ccc8d6eaf6 style(OPS101): prettier no impl plan 2026-09-12 02:17:37 -03:00
Francisco Solla
84de2c1aeb refactor(OPS101): fixes do /simplify — guard de pin robusto, docblock e triage de débitos 2026-09-12 02:17:37 -03:00
Francisco Solla
e4550384b1 fix(worktree): OPS101 — preset canônico deepseek-flash e commands sem pin de modelo (Closes #944) 2026-09-12 02:17:37 -03:00
Francisco Solla
eed5a59a31 style(postmortem): formata a tabela após registrar o CI verde 2026-09-12 02:17:13 -03:00
Francisco Solla
ff0f5ff1cf docs(postmortem): registra CI verde do PR #943 (run 34673571340) 2026-09-12 02:17:13 -03:00
Francisco Solla
aa85aa12b9 docs(postmortem): deploy verify B196 — fixture com data vencida (PR #943) 2026-09-12 02:17:13 -03:00
Francisco Solla
b4132b72c6 fix(e2e): B196 atividades deriva a data da fixture de hoje — desbloqueia deploy verify
A fixture B196 'chassis elsewhere' criava 5 atividades com startAt fixo em 2026-09-01. A aba default de /campanha/atividades (proximos) filtra status=confirmado e startAt >= now, então a partir de 02/09 a lista virou empty state, o scrollport perdeu overflow e a assert scrollHeight - clientHeight > 0 falhou nas 3 retries do verify do deploy de 2026-09-11 (run 34652323456), bloqueando o job de deploy.

Deriva o startAt de hoje (+7 dias, tempo civil da Bahia) como os specs de agenda já fazem, dá ao poll do scrollport o orçamento de 30s da classe de latência B196 documentada no arquivo, e adiciona guard ESLint (no-restricted-syntax escopado a tests/e2e) que bane ISO literal em propriedades start*/end*/date* de fixture — pinado em eslintConventions.unit.spec.ts.
2026-09-12 02:17:13 -03:00
Francisco Solla
8fefdb8cba plan(OPS101+B201): modelo canônico deepseek-flash (Related #944, #945) 2026-09-12 01:33:10 -03:00
Francisco Solla
581cb933a8 docs(plans): S13 — cards personalizados da campanha 2026-09-12 00:46:48 -03:00
Francisco Solla
3aad110e48 docs(postmortem): capas do Instagram e clamp das legendas (PR #940)
Post-mortem do bug-fix com as duas causas-raiz (host fbcdn fora do
allowlist + search:'' do pattern new URL), o pré-requisito do teste de
calendário, a verificação local e as prevenções baratas implementadas e
deferidas.
2026-09-11 18:09:03 -03:00
Francisco Solla
547d6d32bc test(agenda): fixa o relógio do overlay no mês do fixture
O calendário abre no mês corrente e os fixtures (e o startAt submetido)
são de agosto/2026: desde 01/09 o teste 'troca dia no calendário' não
encontra o dia 15 de agosto e derruba a suíte unit full — que é o que o
gate e o CI rodam hoje (o wrapper changed cai no full). Relógio fixo no
mês do fixture torna o teste determinístico.
2026-09-11 18:09:03 -03:00
Francisco Solla
8983abc3f5 fix(social-feed): capas do Instagram voltam a carregar e legendas longas não esticam o card
As mídias da Graph API passaram a vir de *.fbcdn.net
(instagram.<pop>.fna.fbcdn.net), host fora do images.remotePatterns — o
otimizador respondia 400 e toda capa do Instagram quebrava. O pattern em
new URL() também pina search:'' e rejeitaria as URLs assinadas mesmo com o
host certo; agora são objetos planos (cdninstagram + fbcdn).

O título do card ganha line-clamp-3 (subtítulo, line-clamp-2) para a
legenda do Instagram não esticar o bento.

Testes: guard unitário do allowlist com URLs assinadas reais casadas pelo
matcher do próprio Next + seam parser→allowlist; e2e com legenda longa no
stub e asserção de -webkit-line-clamp; manifest de e2e afetado passa a
mapear o board de conteúdos para o spec frontend.
2026-09-11 18:09:03 -03:00
Francisco Solla
e481819d15 C147: Format files with prettier 2026-08-27 19:46:05 -03:00
Francisco Solla
9b728b3338 C147: Add logging to diagnose Google Calendar sync issues in production
- Add logging to readGoogleServiceAccountCredentials for missing/malformed env
- Add logging to runCampaignCalendarSync when sync is skipped
- Add logging to ensureGoogleCalendarPushChannel for channel status/errors
- Add logging to runSyncPass for sync outcomes (only when changes occur)
- Add logging to error catch blocks for better error tracking
- Use payload.logger where available, console.warn for env-only context
- All logs use consistent [GoogleCalendarSync] prefix
- Logging is conditional to reduce noise in production
2026-08-27 19:46:05 -03:00
Francisco Solla
f3cbb4315d ops100: worktree model flags --glm (opencode-go/glm-5.3-flash) e --free (openrouter/openrouter/free) 2026-08-27 19:29:42 -03:00
Francisco Solla
9480f2a2d7 docs(plans): C147–C151 — sync Google Calendar, modais da agenda, OAuth, calendário principal, evento público 2026-08-27 18:20:37 -03:00
Francisco Solla
1a6bd61462
Merge pull request #930 from fsolla/fix/1
docs(pm): registra deploy verde + admin verificado em prod (read-only) + changelog do override sharp
2026-08-27 16:18:14 -03:00
Francisco Solla
c5aef80a12 docs(pm): registra deploy verde (4d6533c0, run 33074305879) + admin verificado em prod read-only + changelog do override sharp
Fecha o registro do post-mortem: PRs #926/#927/#929, deploy manual verde
(verify 19m + deploy 16m), /admin/login renderizando em produção com 0
erros de console na verificação read-only via browser — confirmação final
do humano pendente. Changelog do desbloqueio estrutural do deploy
(override sharp → binários via npm registry).
2026-08-27 16:15:14 -03:00
Francisco Solla
a5dc06ad80 chore: remove unused importMapContract.mjs (OPS99) 2026-08-27 16:05:36 -03:00
Francisco Solla
dd4f9d8b99 chore: format changelog entry 2026-08-27 16:05:36 -03:00
Francisco Solla
493f4ba997 feat(OPS99): generate importMap at build time with dummy S3_* envs
Generate the Payload importMap at build time (Dockerfile) and dev time
(predev hook) with dummy S3_* envs, eliminating the class of bugs where
the admin goes blank because the S3ClientUploadHandler entry is missing
(OPS69/OPS72/OPS73).

Changes:
- Dockerfile: add pnpm generate:importmap with dummy S3_* envs before next build
- scripts/predev-importmap.mjs: predev hook that generates importMap if missing or stale
- Delete scripts/check-importmap-s3.mjs (guard no longer needed)
- Delete tests/unit/importMapS3UploadHandler.unit.spec.ts (unit pin no longer needed)
- Remove check-importmap-s3.mjs step from CI workflows
- Add importMap.js to .gitignore (build artifact, not committed)
- Update AGENTS.md with new contract

Closes #928
2026-08-27 16:05:36 -03:00
Francisco Solla
4d6533c040 fix(deploy): override sharp@0.32.6 → 0.34.2 — instalação do deps sem download do libvips
O pnpm install da camada deps do Dockerfile falha no homeserver porque o
postinstall do sharp@0.32.6 (dependência do @imgly/background-removal-node,
usado só pelo script local resize-images) baixa o libvips de
objects.githubusercontent.com, que não conclui downloads a partir do
homeserver (3 deploys falhos: 'sharp: Installation error: Request timed
out'). O cache do BuildKit já não esconde o problema: o builder prune do
pós-deploy limpa a camada deps a cada deploy bem-sucedido.

O override força o sharp transitivo para 0.34.2 (versão direta do app):
a partir do 0.33 os binários vêm de pacotes do npm registry
(@img/sharp-libvips-*), que o homeserver alcança — o install deixa de
depender de github releases. Lockfile regenerado: sai sharp@0.32.6 e toda
a subárvore prebuild-install (tar-fs, simple-get, bare-*, ...); imgly passa
a resolver sharp 0.34.2 (symlink conferido). Smoke do script
resize-images (import + processamento webp) verde; format/lint/tsc/unit
pin/guard do importMap verdes.
2026-08-27 09:55:50 -03:00
Francisco Solla
81513d5b14 fix(deploy): reverte package.json para desbloquear o deploy — cache deps do BuildKit
O deploy de fea6c645 falhou 2x: a mudança do script generate:importmap
em package.json invalidou a cache da camada deps do Dockerfile no
homeserver, e o pnpm install re-rodou do zero — o postinstall do
sharp@0.32.6 (transitivo) estourou o timeout baixando o libvips de
objects.githubusercontent.com ('sharp: Installation error: Request
timed out'; o git fetch de github.com funciona — o release vai por
outro hostname da CDN). Produção intocada (falha pré compose swap).

Reverte package.json ao byte do estado cacheado (a9f0c61e) — o install
nem roda. Remove o wrapper generate-importmap.mjs (desligado vira dead
code); proteção do importMap fica com o guard CI+deploy + pin unit +
contrato. Hardening do deps documentado no post-mortem (retry do
install / libvips via apk / proxy), changelog do follow-up incluído.
2026-08-27 09:04:47 -03:00
Francisco Solla
fea6c64514 fix(admin): restaura S3ClientUploadHandler no importMap — admin em branco em prod (4ª recorrência da classe OPS69)
O importMap commitado perdeu a entrada do handler S3 no 1c865bd8
(regenerado sem as envs S3_*): com S3_* em prod, getFromImportMap
retorna undefined e a raiz do Payload não monta — tela branca, zero
erros de console, invisível no loop local (storage local em dev/test).

Fix da causa: regeneração com S3_* dummy (+2 linhas). Prevenção no
mesmo PR — o guard planejado no OPS69 (depends #77/#87) que nunca
existiu: pin unit, guard CI+deploy que regenera com envs dummy e falha
em divergência, wrapper do generate:importmap que injeta as envs, e
contrato compartilhado da chave. Post-mortem + changelog incluídos.
2026-08-26 20:27:22 -03:00
Francisco Solla
8dedf1028c feat(worktree): subcomando fix + skill /bug-fix (diagnóstico → fix → verificação → prevenção → post-mortem) 2026-08-26 16:16:18 -03:00
Francisco Solla
a9f0c61edf fix(campanha): restaura submitter no FormData do card de demanda (#921)
O dispatch manual do C139 montava new FormData(form) sem o submitter;
os botões de transição (name=status value=aprovada|rejeitada|…) nunca
viajavam e transitionDemandFormAction rejeitava toda decisão por status
vazio. submitterFrom (cast honesto nativeEvent as SubmitEvent) + segundo
arg do construtor nos handlers de transição e custo; C139 intacto.

Teste unit novo pina o glue FormData→status (SubmitEvent real, não
fireEvent.submit). E2e 'advisor opens a demand and decides it' verde
local (isolado e em runs de arquivo inteiro).
2026-08-25 21:48:30 -03:00
Francisco Solla
053d1e975c E2E-DEMAND-DECIDE (plano): desbloquear deploy — decisão de demanda parou de gravar (regressão pós-react-audit) 2026-08-25 19:31:30 -03:00
Francisco Solla
618e37ee66 fix(campanha): guarda CSRF mesma-origem proxy-aware atrás do túnel (#913) 2026-08-25 17:32:23 -03:00
Francisco Solla
0c3805e605 docs(testing-audit): estado final protegido (draft fail-closed) — CI green no SHA final 2026-08-25 17:09:43 -03:00
Francisco Solla
dd2735340c docs(testing-audit): estado final do PR #919 e log do desarme no relatório 2026-08-25 17:09:43 -03:00
Francisco Solla
5af65a2c84 docs(testing-audit): relatório da run 2 + entrada de changelog (movimentos, fix do metrics, recidiva #906) 2026-08-25 17:09:43 -03:00
Francisco Solla
ee4ba83535 fix(ops96-audit): parseVitestStdout tolera sufixo do pnpm em suite vermelha — retrato impresso mesmo com falha (contrato do metrics) 2026-08-25 17:09:43 -03:00
Francisco Solla
148a9dc542 test(ops96-audit): extrair helpers puros de identidade (telefone/schema/migração) do campaignAuth int→unit — RBAC intacto 2026-08-25 17:09:43 -03:00
Francisco Solla
2f15fbf4d0 test(ops96-audit): extrair pins puros do municipalityUpdateCreateSchema para unit — zod sem Local API 2026-08-25 17:09:43 -03:00
Francisco Solla
cfe8ff46e5 test(ops96-audit): mover contactPhoneNormalization int→unit — hook do Contact via stub, sem boot de Payload 2026-08-25 17:09:43 -03:00
Francisco Solla
71cdd57cf5 test(ops96-audit): mover payloadTransaction int→unit — stub puro de wrapper de transação, sem Payload/DB 2026-08-25 17:09:43 -03:00
Francisco Solla
8199e2ee24 docs(changelog): react-audit run 2026-08-25 — primeira varredura, 6 fixes, follow-ups #915/#916/#917 2026-08-25 13:40:32 -03:00
Francisco Solla
e9441e3ff8 react-audit(família 3): mirror props→state via effect no badge — CampaignNotificationBell.tsx:56 reaplicava prop stale sobre o setUnreadCount(0) do open; sync no render com guarda de open 2026-08-25 13:40:32 -03:00
Francisco Solla
7a450bc814 react-audit(famílias 1/6): sortable heads eram client sem interatividade — ContactSortableHead.tsx:1, PeopleSortableHead.tsx:1, LeadershipSortableHead.tsx:1, StateDeputySortableHead.tsx:1 importavam *ListUrl por valor; como server components os serializadores de URL ficam fora do bundle (B14) 2026-08-25 13:40:32 -03:00
Francisco Solla
52ffbcd254 react-audit(família 7): erro assíncrono do sync sem role=alert — GoogleCalendarSyncDialog.tsx:212,251 não anunciava falha de 'Sincronizar agora'/'Reativar' para leitores de tela 2026-08-25 13:40:32 -03:00
Francisco Solla
d2aa70f0c5 react-audit(família 5): Media.ts sem hooks de revalidação — getCachedDocumentById('media') (documentReads.ts:43) nunca invalidava em edição/deleção no admin; afterChange+afterDelete espelham Post/Petition 2026-08-25 13:40:32 -03:00
Francisco Solla
34c04d6966 react-audit(família 2): view model mínimo cruza o fio RSC — PetitionForm.tsx:29 deixa de receber o doc Petition inteiro (richText/consent/tracking ficam no server) 2026-08-25 13:40:32 -03:00
Francisco Solla
e273e9ecfa react-audit(família 4): C140 leftover — dispatch manual preserva texto digitado em erro de validação (ActivityUpdateForm.tsx:34, ActivityResultForm.tsx:60, DemandWorkflowCard.tsx:104, MunicipalityUpdateDeliberation.tsx:227) 2026-08-25 13:40:32 -03:00