Commit graph

2084 commits

Author SHA1 Message Date
Francisco Solla
a5154f1633 ops100: worktree model flags --glm (opencode-go/glm-5.3-flash) e --free (openrouter/openrouter/free) 2026-08-27 19:12:19 -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
Francisco Solla
101cd5d791 C146 (plano): corrigir guarda de mesma-origem do CSRF em /campanha atras do tunel
Related #913
2026-08-25 13:08:46 -03:00
Francisco Solla
4f5a5a838c docs(audit-pass6): format — prettier normalization of the three artifacts 2026-08-25 11:29:03 -03:00
Francisco Solla
5454ec42a0 docs(audit-pass6): ledger rows prettier-stable (emphasis chars in table code spans) 2026-08-25 11:29:03 -03:00
Francisco Solla
7611790b2d docs(audit-p6-m895): plan-issue intention must record literal decision data (miss #895) 2026-08-25 11:29:03 -03:00
Francisco Solla
cf9b30bfd6 fix(audit-p6-2): keep actor-options inline — exported options type tripped knip types gate 2026-08-25 11:29:03 -03:00
Francisco Solla
e562af76d8 feat(audit-p6-m909): deterministic disarm guard for /testing-audit (miss #909) 2026-08-25 11:29:03 -03:00
Francisco Solla
b7d0dba650 fix(audit-p6-2): perfil page uses requireCampaignPageActor; P3-I guard widened to getCampaignUser* variants 2026-08-25 11:29:03 -03:00
Francisco Solla
3fb1a141ba test(audit-p6-1): bypass ratchet — header comment no longer zeroes a file, P6-1 pins 2026-08-25 11:29:03 -03:00
Francisco Solla
de70ae7e1e docs(audit-pass6): -impl plans P6-1, P6-2, P6-M909, P6-M895 2026-08-25 11:29:03 -03:00
Francisco Solla
8a1aa20ce9 docs(audit-pass6): artefatos — seção Pass 6, ledger truth-up, plano de entrega 2026-08-25 11:29:03 -03:00
Francisco Solla
149cc3943a test(int): retry once — gate flaka sob contenção paralela de DB em high-core (C113/C115) 2026-08-25 08:52:07 -03:00
Francisco Solla
5742180268 docs(ops98): menções vivas (opt-out restrito audit/*), impl plan e changelog 2026-08-25 08:52:07 -03:00
Francisco Solla
8d4af384cf refactor(ops98): skill engineering-audit v2 — autônoma, sub-agentes, método verbatim em reference/ 2026-08-25 08:52:07 -03:00
Francisco Solla
b7ed186237 feat(ops98): veto audit/* no safety-net de auto-merge (PR único do audit fica sem automerge) 2026-08-25 08:52:07 -03:00
Francisco Solla
0cea0b7d8f fix(ops96): changelog append-only — desfecho vira entrada própria 2026-08-25 08:24:58 -03:00
Francisco Solla
a5c656dd92 docs(ops96): errata do desarme — skill corrige sequência (desarmar com CI pendente) + relatório registra o merge automático de #907 2026-08-25 08:24:58 -03:00
Francisco Solla
761da2f4e9 react-audit(família 1): 'use client' desnecessário em MunicipalityPriorityIndicator.tsx:1 2026-08-25 08:21:49 -03:00
Francisco Solla
c9d3ac76aa docs(OPS97): registro de débitos da triage no plano 2026-08-25 02:43:31 -03:00
Francisco Solla
d95f3f575b test(OPS97): parametro nao usado no fetchImpl do teste de convergencia 2026-08-25 02:43:31 -03:00
Francisco Solla
fca5a1c105 refactor(OPS97): fixes do /simplify — fail-closed em PR inexistente, errata do plano, token neutro na skill 2026-08-25 02:43:31 -03:00
Francisco Solla
eec6fd3d49 fix(OPS97): desarme do auto-merge via GraphQL disablePullRequestAutoMerge com laco verificado (licao do dogfood #905) 2026-08-25 02:43:31 -03:00