Commit graph

1693 commits

Author SHA1 Message Date
Francisco Solla
896fbb8d57
Merge pull request #715 from fsolla/plans/plan-issue-42
plans(OPS44): redesenhar fluxo de registros/compartilhados para menos conflitos
2026-08-12 14:15:08 -03:00
Francisco Solla
508350fcf1 chore(plan-issue): formata o rascunho do OPS44 (prettier) 2026-08-12 14:12:52 -03:00
Francisco Solla
057eebfbb1 plans(OPS44): redesenhar fluxo de registros/compartilhados para menos conflitos (Related #713) 2026-08-12 14:12:52 -03:00
Francisco Solla
d74d6e1253
Merge pull request #708 from fsolla/C131-pessoas-salvador-como-opcao-no-dropdown-de-municipios-a
C131: 'Salvador' como opção agregada no dropdown de municípios
2026-08-12 14:10:27 -03:00
Francisco Solla
7e05dc925d feat(C131): Salvador como opção agregada no dropdown de municípios das células de capacidade
O dropdown de adição de municípios (pessoas ×3, assessores, lideranças,
dobradinhas) oferece 'Salvador — Todas as zonas' como primeiro hit da busca:
um toque adiciona as 19 ZEs num lote, via máquina existente do RelationChipCell
(delta otimista, cap/floor, undo, colapso 'Salvador (19)' B178, exact-match C116).

- searchMunicipalityPortfolio ganha kind 'city' (NORMALIZED_ZONE_CITIES,
  derivado do catálogo) com gate de escopo por contagem: o agregado só aparece
  quando a cidade inteira está no escopo addableIds do ator — a label 'Todas as
  zonas' nunca mente para assessor com carteira parcial.
- hitDescription ganha o branch 'Todas as zonas'; sem migration/access/schema.
- Testes: unit busca pura (19 ids, soma, escopo parcial, tudo atribuído,
  posição), cell render, e2e em campaignPeople (agregado → chip → 19 zonas no
  DB).
2026-08-12 14:02:34 -03:00
Francisco Solla
a6d5a2695c
Merge pull request #727 from fsolla/ci-remove-migration-lock
chore(ci): remove o migration-lock — deadlock de CI com PRs de schema paralelos
2026-08-12 13:58:35 -03:00
Francisco Solla
38f6d74483
Merge pull request #615 from fsolla/OPS30-hardening-e2e-em-dev-prewarm-da-rota-editar-login-resi
chore(OPS30): hardening e2e em dev — prewarm completo, login resiliente a compile-frio, fechamento do P4-L
2026-08-12 13:44:23 -03:00
Francisco Solla
4626a2ea06 chore(ci): remove o migration-lock — deadlock de CI com PRs de schema paralelos (checks passa a ser o único required)
O check falhava quando >1 PR aberto tocava src/migrations/ + payload-types.ts,
deadlockando AMBOS os PRs (9 de 13 runs de CI falhos desde 11/08). A validação
real da cadeia de migrations já roda em todo PR e na main: pnpm migrate +
test:int (incl. campaignMigrationReconciliation). Pool mantém a serialização
de spawn de issues needs:migration via countOpenSchemaPrs.
2026-08-12 13:42:05 -03:00
Francisco Solla
1326d54413 style(OPS30): prettier no changelog pós-rebase 2026-08-12 13:34:42 -03:00
Francisco Solla
39e6e9405c style(OPS30): prettier — formatação do login retry no fixture 2026-08-12 13:34:42 -03:00
Francisco Solla
48088d8162 refactor(OPS30): fixes do /simplify — pessoas no prewarm, login com sub-budgets, retry da demanda via existência, B24 no helper do arquivo
Review 3× read-only (0 P1):
- setup: /campanha/pessoas faltava (campaignPeople); log do 1º hit
  quando o retry salva; comentário do budget ancorado no medido.
- login: sub-budgets 15+5+30 (antes 30+5+30 estourava o test timeout
  e credencial errada morria de timeout genérico); retry bifurca pela
  URL real (dashboard/fora do login/re-submit) — re-submit cego
  contra página que saiu do login falhava com fill na dashboard.
- :713: retry cego criaria duplicata que o UNIQUE do slug refuta —
  o retry consulta por título e navega ao detail quando o 1º POST
  criou mas o redirect se perdeu.
- B24: locator reusa visibleMunicipalityButton (escapeRegExp +
  fronteira de nome, 23/435 com prefixo) e ensureWideMunicipalityList
  re-rodado pós-reload (padrão do irmão dobradinhas).
- :1063: waitForResponse com timeout 5s para o toPass decidir.

Re-prova: campaignMunicipalities 22/22 (arquivo atual, B193+OPS29 do
main) ×3 consecutivos em dev a 2 workers (load 5-17).
2026-08-12 13:34:42 -03:00
Francisco Solla
02beea808b chore(OPS30): hardening e2e em dev — prewarm completo, login resiliente a compile-frio, fechamento do P4-L
- setup.e2e.spec.ts: prewarm GET 13→26 rotas (rota /editar, alvos de
  redirect, wizards, PWA artifacts, rotas do chat Sollinha) + POST
  ganhou next-steps, home-search, ai-chat, ai-transcribe; prewarmGet
  com retry-único (abort do compile aborta a conexão do próprio
  prewarm); budget explícito 420s no lugar do test.slow().
- campaignE2EFixtures.ts: campaign.login com retry-único do submit
  (re-fill+re-click com grace-wait do destino exato) — submit abortado
  pelo full-page reload do compile frio nunca navega.
- campaignMunicipalities.e2e.spec.ts: refactor mínimo por evidência —
  B24 (estágio largo B158 + toggle do trigger pós-reload), :713 (retry
  do server action de criação), :1063 (seed parity via db:seed:minimal
  — achado do OPS28 — + retry do suggest).
- P4-L fechado com evidência: campaignLeaderships ×3 dev + ×1
  E2E_PROD=1 (TECH-DEBT row 59 + TESTING.md caveat).
- Aceite: campaignMunicipalities 17/17 ×3 consecutivos em dev a 2
  workers (load 5-18).

Sem migration/access/Consent/UI.
2026-08-12 13:34:42 -03:00
Francisco Solla
ac405ea2ec
Merge pull request #709 from fsolla/C129-pessoas-nome-de-legenda-da-dobradinha-campo-display-dis
C129: nome de legenda da dobradinha — campo + display discreto sob o nome
2026-08-12 13:10:04 -03:00
Francisco Solla
3593d84b30 refactor(C129): simplify — CampaignNameSubline compartilhado (a11y sr-label), guard legenda==nome, sem plumb morto, spec mais forte 2026-08-12 12:52:35 -03:00
Francisco Solla
d7acb5aa48 feat(C129): nome de legenda da dobradinha — campo ballotName + display discreto sob o nome (Closes #696) 2026-08-12 12:52:35 -03:00
Francisco Solla
8fbf2c6018
Merge pull request #701 from fsolla/C115-google-calendar-edicao-pela-agenda-pessoal-volta-para-t
C115 — Google Calendar: edição pela agenda pessoal volta para Teqo (bidirecional)
2026-08-12 12:42:27 -03:00
Francisco Solla
1bad0d96c7 fix(C115): e2e do FAB do espelho assere o FAB, não o título mobile (C101 troca por rótulo do período — flake sob carga) 2026-08-12 12:22:06 -03:00
Francisco Solla
9d330f48e4 merge(C115): rebase em main (C126 activityWhere, C124 tasks, C122 e2e estados, OPS40/41) — spec portado para runSync escopado 2026-08-11 22:48:14 -03:00
Francisco Solla
1fb62039d8 style(C115): format pós-rebase no CHANGELOG 2026-08-11 22:42:36 -03:00
Francisco Solla
6a83dbcc25 docs(C115): débito pós-review — corrida do snapshot + hermeticidade int (#694) 2026-08-11 22:42:05 -03:00
Francisco Solla
2f247d40a6 fix(C115): revisão /simplify — relógio com baseline de espelho, reopen sem re-cancelamento, hardening do webhook
- lastMirroredChangeAt (activity, migration): clock rule compara contra a
  última mudança espelhada, não updatedAt (task toggle não silencia edição
  pendente do Google)
- snapshot exclui ids que o motor deletou (removedEventIds separado do
  remoteEventIds): reopen pós-cancelamento não vira re-cancelamento fantasma
- cancelamento do Google respeita o relógio: cancel mais novo cancela; Teqo
  mais novo (reopen) limpa o trashed e recria
- escrita reversa sem req.user: autoria do registro correta + sem gate 403
  do deputado; hook de sync pula a própria escrita reversa (sem passada aninhada)
- canal: segredo rotaciona por criação; novo canal persistido antes do stop
  do antigo; identity fields read:false; create admin-only; leitura prefere
  linha configurada; pre-filter do webhook antes do bootstrap do Payload
- testes: all-day ida-e-volta, task-toggle, reopen, slug congelado, e2e dos
  caminhos 200, render tests do dialog/feed; asserções herméticas a
  atividades ambiente dos arquivos irmãos (DB compartilhado)
2026-08-11 22:42:05 -03:00
Francisco Solla
7629a505e0 feat(C115): edição pelo Google Calendar volta para o Teqo (motor bidirecional + webhook push)
- runSyncPass bidirecional: regra do relógio decide direção (Google mais novo
  aplica título/horário; Teqo re-asserta), cancelamento via showDeleted +
  snapshot lastSeenEventIds, registro no updates feed
- webhook público /campanha/agenda/google-webhook/[secret] fail-closed
  (secret + X-Goog headers constant-time), canal lazy sem cron (ensure em
  toda passada, renovação com id novo + stop do antigo)
- migration hand-written (campos de canal/snapshot em googleCalendarSync);
  mutationKind dedicado libera título via Google sem quebrar slug canônico
- UI: seção 'Edições pelo Google' no dialog + autor 'Google Calendar' no feed
- testes: unit (reverse mapping, validação webhook), int (motor bidirecional
  com stub, 10 cenários), e2e (webhook 404 fail-closed)
2026-08-11 22:38:53 -03:00
Francisco Solla
e43c71b2fd
Merge pull request #693 from fsolla/C126-c126-int-specs-do-espelho-google-c114-flakeam-em-parale
fix(C126): isola o escopo do espelho Google nos int specs (fim do flake paralelo)
2026-08-12 00:50:39 +00:00
Francisco Solla
c69990a3f0 fix(C126): isola o escopo do espelho Google nos int specs (fim do flake paralelo) 2026-08-11 21:33:07 -03:00
Francisco Solla
c08be6c46a
Merge pull request #707 from fsolla/C125-c125-pessoas-pos-c117-ux-descoberta-de-ordenacao-no-mob
C125: Pessoas pós-C117 UX — descoberta de ordenação no mobile e facet de ausência completo
2026-08-12 00:04:50 +00:00
Francisco Solla
6d41517a05
Merge pull request #705 from fsolla/C122-c114-follow-up-cobertura-de-testes-dos-estados-do-espel
C122 — cobertura de testes dos estados do espelho Google (componente + e2e + action)
2026-08-11 23:49:39 +00:00
Francisco Solla
e3ffb9d8a7
Merge pull request #706 from fsolla/plans/plan-issue-39
docs(plans): B200 — Municípios mobile: encaixes dos cards (densidade, labels, avatares)
2026-08-11 23:42:01 +00:00
Francisco Solla
d004a2b0eb chore(plan-issue): formata o rascunho UI do B200 (prettier) 2026-08-11 20:39:45 -03:00
Francisco Solla
4ad644d8ca
Merge pull request #702 from fsolla/B199-sollinha-fechar-o-drawer-durante-streaming-pode-reabri-
fix(B199): fechar o drawer mid-stream persiste open:false imediato — reload não ressuscita
2026-08-11 23:37:59 +00:00
Francisco Solla
0bc8226d01
Merge pull request #703 from fsolla/OPS41-agents-md-em-main-com-marcadores-de-conflito-commitado
fix(OPS41): resolve marcadores de conflito commitados no AGENTS.md + guardrail anti-reincidência
2026-08-11 23:37:31 +00:00
Francisco Solla
7fabb72df8 feat(C125): facet de ausência completo (qualquer_ausencia) e descoberta de ordenação no mobile
- PEOPLE_ABSENCES ganha o 4º valor qualquer_ausencia ("Qualquer ausência"),
  a união exata das três ausências em UM chip — o 3º clique dos específicos
  deixa de colapsar o facet (3 de 4 membros) e o parse absorve o guarda-chuva
  sobre os específicos, sem tocar no B18 genérico de capacity/status
- peopleListSortPrimaryOptions: seeds do grupo Ordenação viram as 7 direções
  primárias com emptyQueryVisible, então o mobile descobre as 7 chaves ao
  tocar no bar (e "ordenar" não corta aliada/assessorado/base no cap 8)
- CampaignListOmnibox reabre o popover no mousedown: clicar num input já
  focado (logo após commitar busca com Enter) não disparava focus, deixando
  a descoberta morta no mobile até digitar
- tests: contrato de URL (absorção + não-colapso), predicado + AND, novo spec
  de omnibox, e2e do 3º clique e da descoberta mobile (390×844)
2026-08-11 20:34:51 -03:00
Francisco Solla
980f66983a docs(plans): B200 — Municípios mobile: encaixes dos cards (densidade, labels, avatares) 2026-08-11 20:34:13 -03:00
Francisco Solla
d6dfdf70ed fix(OPS41): resolve marcadores de conflito commitados no AGENTS.md + guardrail anti-reincidência (#689)
O commit OPS33 (f0f5b73f) entrou com o arquivo já conflitado na região do
bullet 'Per-worktree environments' (<<<<<<< HEAD indentado + lado HEAD
pré-OPS33 com artefato '- # ' + fechamento corrompido '> > > > > > >'; o
======= foi removido no próprio commit) e o OPS37 herdou o estado.

Resolução perda zero validada por diff: manter o lado superset (OPS28 +
OPS31 + OPS33 — claim determinístico, --issue N, prompt citado) e
descartar o lado HEAD; -3 linhas no total; scan de todos os trackeados
confirmou AGENTS.md como único arquivo afetado.

Guardrail: describe 'no conflict markers in committed files' em
codebaseConventions.unit.spec.ts — varre git ls-files e falha em
<<<<<<< / >>>>>>> (tolerante a indentação) e na forma corrompida
^\s*(> ){7}; validado negativo contra o estado sujo (AGENTS.md:37, 40).
2026-08-11 20:23:50 -03:00
Francisco Solla
3ac5dbe0bd
Merge pull request #692 from fsolla/OPS40-worktree-dev-port-do-env-local-nao-e-honrado-pelo-next
fix(OPS40): pnpm dev honra o PORT do .env.local (next dev -p via scripts/dev.mjs)
2026-08-11 23:16:26 +00:00
Francisco Solla
5940c4c61e fix(OPS40): pnpm dev honra o PORT do .env.local — next dev -p via scripts/dev.mjs (Closes #682)
next dev resolve a porta antes de @next/env carregar env-files (commander
.env('PORT') no bin/next), então o PORT=3100+slot do provisionador de
worktree era ignorado e todo dev server subia em 3000. pnpm dev/devsafe
passam por scripts/dev.mjs: preflight do guard-dev-db inline, env com a
mesma precedência (real > .env.local > .env, override:false) e porta como
flag CLI -p (resolveDevPort/nextDevArgs em scripts/lib/cli.mjs,
unit-testados). Sem PORT → nenhum -p → default 3000 + allowRetry intactos.
2026-08-11 20:04:07 -03:00
Francisco Solla
1ed585a084
Merge pull request #700 from fsolla/plans/plan-issue-38
docs(plans): C128–C132 — ajustes de Pessoas (capacidades, legenda, tabela, Salvador, criação rápida)
2026-08-11 22:59:53 +00:00
Francisco Solla
1a71e5d021 docs(plans): C128–C132 — ajustes de Pessoas (capacidades, legenda, tabela, Salvador, criação rápida) 2026-08-11 19:54:13 -03:00
Francisco Solla
d3c747299b test(C122): cobertura dos estados do espelho Google — unit do chrome, e2e dos 4 estados + FAB, int da action de desativar 2026-08-11 19:47:43 -03:00
Francisco Solla
9b8680b00e
Merge pull request #690 from fsolla/work/5
chore(plan-issue): rascunho UI/UX do gate vira HTML+Tailwind commitado no repo (ad-hoc)
2026-08-11 22:46:22 +00:00
Francisco Solla
c7c9556ff3 test(C122): cobertura dos estados do espelho Google — unit do chrome, e2e dos 4 estados + FAB, int da action de desativar 2026-08-11 19:43:19 -03:00
Francisco Solla
54205fb093 fix(B199): fechar o drawer mid-stream persiste open:false imediato — reload não ressuscita (Closes #672) 2026-08-11 19:41:48 -03:00
Francisco Solla
631635ee89 chore(plan-issue): rascunho UI/UX do gate vira HTML+Tailwind commitado no repo (ad-hoc) 2026-08-11 19:14:21 -03:00
Francisco Solla
b604157fc7
Merge pull request #685 from fsolla/OPS39-prewarm-e2e-dev-adicionar-campanha-home-search-post-e-
OPS39 — Prewarm e2e: home-search POST e mudar-tendencia GET no setup spec
2026-08-11 20:14:51 +00:00
Francisco Solla
4cf10c9ff3
Merge pull request #684 from fsolla/C118-pessoas-pagina-de-detalhe-da-pessoa-secoes-montadas-pel
C118 — Pessoas — página de detalhe da pessoa (seções montadas pelas capacidades)
2026-08-11 19:45:09 +00:00
Francisco Solla
4043573152 fix(C118): fecha describe do e2e campaignPeople (merge com C117) e formata changelog 2026-08-11 16:32:49 -03:00
Francisco Solla
c0ffc22026 feat(C118): página de detalhe da pessoa — seções montadas pelas capacidades (Closes #657) 2026-08-11 16:32:21 -03:00
Francisco Solla
e68e4f6eda
Merge pull request #687 from fsolla/C124-atividades-tarefa-so-com-texto-responsavel-e-concluida-
feat(C124): tarefa de atividade só com texto, responsável e concluída (sem prazo)
2026-08-11 19:25:33 +00:00
Francisco Solla
94c89a57a1 feat(C124): tarefa de atividade só com texto, responsável e concluída (sem prazo) 2026-08-11 16:05:07 -03:00
Francisco Solla
15461d7abf
Merge pull request #679 from fsolla/B197+-assessores-menu-do-picker-de-colunas-derivado-da-mesma
B197+: picker de colunas de assessores derivado da mesma fonte do AdvisorsTable
2026-08-11 18:53:09 +00:00
Francisco Solla
93e57a6ed7
Merge pull request #674 from fsolla/C117-pessoas-ordenacao-header-omnibox-e-filtros-de-ausencia-
C117 — Pessoas: ordenação (header + omnibox) e filtros de ausência
2026-08-11 18:51:16 +00:00