Commit graph

1216 commits

Author SHA1 Message Date
Francisco Solla
38aeb1a48c feat(worktree): subcomando fix + skill /bug-fix (diagnóstico → fix → verificação → prevenção → post-mortem) 2026-08-26 12:35:14 -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
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
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
e562af76d8 feat(audit-p6-m909): deterministic disarm guard for /testing-audit (miss #909) 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
5742180268 docs(ops98): menções vivas (opt-out restrito audit/*), impl plan e changelog 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
c9d3ac76aa docs(OPS97): registro de débitos da triage no plano 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
Francisco Solla
3cfbfeac0e changelog: OPS97 2026-08-25 02:43:31 -03:00
Francisco Solla
e1c4931d54 skill(OPS97): react-audit — ciclo fechado sweep→plan→implement→PR único sem auto-merge 2026-08-25 02:43:31 -03:00
Francisco Solla
41c94b2bdc docs(ops96): relatório da primeira auditoria noturna + changelog 2026-08-25 02:42:40 -03:00
Francisco Solla
c2f0c44d15 test(ops96-audit): mover 4 specs puros de int para unit (relationship, schemaPrimitives, assertTestDatabase, petition-page-layout) 2026-08-25 02:42:40 -03:00
Francisco Solla
6777aa86f8 docs(plans): OPS98 — engineering-audit v2 (autônoma, sub-agentes, PR único) 2026-08-25 00:23:13 -03:00
Francisco Solla
1b82dc45af docs: plano de intenção OPS97 — skill /react-audit 2026-08-25 00:17:58 -03:00
Francisco Solla
24ad75d8d6 plan(OPS96): PR final da noite vira ready (sem automerge) com CI green e mergeable 2026-08-25 00:14:22 -03:00
Francisco Solla
019cd456cc feat: S9+ (#771) — integridade de consentimento e alinhamento das ações públicas
- Consent.beforeDelete bloqueia delete com referências (APIError 409 composto
  por coleção), fim do 23502 cru no admin (contagens com overrideAccess).
- submitWhatsapp/submitPetitionSignature delegam o ciclo de transação ao dono
  withPayloadTransaction (rollback no commit-falho, AggregateError, after-commit),
  preservando os contratos { ok: true } / { ok: true, signatureNumber }.
- contactStateSchema exportado + contactCitySchema/contactCityFieldSchema
  consolidados; as 4 fichas usam os exports únicos (fim das cópias inline do
  predicate value in CitiesByState). withMutableConsentFixture purga consent
  via raw SQL para bypassar o hook no harness de teste.

Co-Authored-By: opencode <noreply@opencode.ai>
2026-08-25 00:13:47 -03:00
Francisco Solla
428b0e359a plan(OPS96): skill /testing-audit — auditoria autônoma da suíte de testes (intenção) 2026-08-25 00:07:37 -03:00
Francisco Solla
7259193060 S2-FOLLOWUP (#775) — validate do itemId YouTube deixa de ser código morto
O validate de itemId em social-feed-settings lia data.platform (doc inteiro,
sempre undefined) e nunca validava ID de vídeo em produção. Agora lê
siblingData.platform via helper validateExcludedItemId. Stub YouTube ganha
ids de 11 chars e o spec acompanha, destravando o e2e do describe
'Campaign home content section'. Sem migration.
2026-08-24 23:46:57 -03:00
Francisco Solla
d840975eae style: prettier no plano e changelog da C115-F1 2026-08-24 23:34:56 -03:00
Francisco Solla
a658a1025f fix(campaign): C115-F1 — snapshot de eventos do motor Google Calendar com compare-and-swap (Closes #694)
- recordLastSeenSnapshot: update condicional (id + updatedAt) em vez de
  last-writer-wins; miss descarta a visão contaminada (never-throw)
- token CAS capturado no topo de runSyncPass: mesmo doc alimenta as
  decisões D2-D4 e o guard da escrita (fecha a janela basis-vs-token)
- teste int de corrida determinístico (promise gates): passada obsoleta
  não ressuscita remoção permanente (RED confirmado antes do guard)
- convenção de hermeticidade da janela documentada no header da spec
2026-08-24 23:34:56 -03:00
Francisco Solla
d679708c06 fix(worktree): OPS95 — corrige mapa de modelos e remove --variant do launch do TUI (Closes #876) 2026-08-24 23:04:39 -03:00
Francisco Solla
d48914858a fix(campaignInvite): C121 — unifica chave de lock da redenção com contact-ficha (Closes #885) 2026-08-24 22:51:15 -03:00
Francisco Solla
ba77347616 fix(campaign): D13 — align supporter_import_batch.actor_id schema drift (Closes #643)
Make actor_id nullable to match its ON DELETE set null FK; set SupporterImportBatch.actor required:false so config agrees with schema. Keep the deleteCampaignUserImportBatches hook + hand-deletes as explicit cleanup (no schema cascade, per webauthn precedent). Adds int coverage for account-delete with an orphan batch.
2026-08-24 22:39:03 -03:00
Francisco Solla
6d962ffd9c fix(campaign): C114-LOCK — hooks do sync do Google Calendar seguram row lock por I/O de rede (Closes #870)
Os afterChange/afterDelete de activity e googleCalendarSync rodavam a reconciliacao completa dentro da transacao do save, segurando row lock + pool por todo o I/O do Google (15s por hop, N RTTs -> 45-75s). Corrige com deadline proprio do hook (GOOGLE_CALENDAR_SYNC_HOOK_TIMEOUT_MS=5s) via AbortSignal.timeout combinado com per-hop 15s no cliente (AbortSignal.any) — manual/webhook mantem 15s sem transacao como fallback confiavel. Fail-closed preservado (abort vira paused). Pin unit hook < per-hop + int hook <=7s com fetch lento.
2026-08-24 22:25:23 -03:00
Francisco Solla
2af8acff7e test(OPS46-S3): torna steal do allocator determinístico com SELECT do índice alvo (Closes #790)
Consulta o index do claim crashado e dirige o cursor compartilhado até
ele (bound catalogSize) em vez do loop probabilístico catalogSize*3 —
elimina o flake sob carga paralela. Branch null quando outra spec já
roubou antes do SELECT e fallback claimCount==0 para race durante o
drive, invariante claimCount(crashed)==0 preservado.
2026-08-24 22:22:42 -03:00
Francisco Solla
30dac18872 refactor(tests): B194 — extract shared SSE mock helper and migrate legacy chat specs to v7
Extract sollinhaChatStreamBody + mockSollinhaChat into campaignE2EFixtures.ts
(canonical v7 wire format), reuse across all 6 chat e2e specs and migrate the
two legacy specs (transcribe, openingChips) from the format that fails the v7
client schema. Closes #556
2026-08-24 22:22:08 -03:00
Francisco Solla
f8ead7c4b7 chore(e2e): #811 fechada como satisfeita por #767 — shadow de adminHeaders já unificado
Registra o fechamento da #811: o login REST não-serializado do usuário
compartilhado em frontend.e2e.spec.ts foi eliminado pelo commit d0161f6d
(Closes #767), que unificou todos os logins no helper adminHeaders travado
por advisory lock. Nenhuma mudança de código; apenas changelog + impl plan.
2026-08-24 22:03:29 -03:00
Francisco Solla
fcefcac4e6 style: prettier format dos docs da entrega C120 2026-08-24 19:03:29 -03:00
Francisco Solla
6c582bbb3f fix(contact): C120 — serializa o append de telefone no reuso com lock de ficha (Closes #663) 2026-08-24 19:03:29 -03:00
Francisco Solla
2393847c9b style(docs): prettier no plano e2e-flake-cast-rotativa-pos-ops83 2026-08-24 18:42:03 -03:00
Francisco Solla
d0161f6d69 test(e2e): unificar logins do usuário de teste no helper adminHeaders com advisory lock (Closes #767) 2026-08-24 18:42:03 -03:00
Francisco Solla
a180721e11 feat(campaign): C144 — forms de escrita com options de município write-scoped (Closes #769) 2026-08-24 18:37:59 -03:00
Francisco Solla
339508a7c1 test(e2e): B195-F1 — gate S: no spec do wizard Registrar pedido (cópia de stream duplica o form sob carga) 2026-08-24 18:37:33 -03:00
Francisco Solla
1423cf1758 test: scope C113 live feed to claimed municipality (E2E-FLAKE-C113) 2026-08-24 18:23:47 -03:00
Francisco Solla
078ca65949 review(B155+): simplify — useCallback nos shims, constantes no padrão dos irmãos, copy B36 preservada no caminho de erro, impl plan alinhado
- useMemo(() => fn, []) → useCallback (idiom do codebase; shim sem props no de municípios, saveErrorMessage no de state-deputies).
- ENDPOINT/GENERIC_ERROR → STATE_DEPUTIES_ENDPOINT / MUNICIPALITIES_ENDPOINT + SAVE_ERROR_MESSAGE (espelho de MunicipalityListAdvisorsControl).
- Prop opcional saveErrorMessage no wrapper de state-deputies: o call site B36 (fromStateDeputy) volta a falar em 'lideranças' no caminho de erro, como a form action removida.
- impl plan: LeadershipListStateDeputiesResponse (não ToggleResponse), useCallback, saveErrorMessage.
2026-08-24 18:14:56 -03:00
Francisco Solla
0bb8a96485 feat(campanha): B155+ — migrar quick-edits de célula de lideranças para rota JSON (célula → rota)
F2: POST /campanha/liderancas/state-deputies substitui
setLeadershipStateDeputyMembershipFormAction (chips de /campanha/liderancas B31
e /campanha/dobradinhas B36 — mesma action record).
F3: POST /campanha/liderancas/municipalities substitui
setLeadershipMunicipalitiesFormAction (B34).
Wrappers 'use client' LeadershipStateDeputiesColumnCell /
LeadershipMunicipalitiesColumnCell mantêm o contrato (state, formData) das
shared cells (intocadas); rotas reusam os schemas exportados + allowlists
floor/cap/scope; revalidate herdado das actions record (contrato B34/B31).
F1 (sinal de municípios) não existe mais: C87 o substituiu por form
multi-campo, que por regra B155 permanece em server action — registrado
como já resolvido no plano de intenção.
Guards: whitelist sharedSheetHostConventions (+2 wrappers), prewarm e2e
(+2 rotas), B34 aponta para a rota nova. Sem migration/UI (Impeccable A).

Closes #368
2026-08-24 18:14:56 -03:00
Francisco Solla
244de83cc1 style(plan): format docs/plans/worktree-flags-modelo-correcao.md 2026-08-24 18:07:01 -03:00