Govevia Site — Changelog
[2.20.30] - 2026-03-17
- fix(deps):
package.json— remove duplicatas introduzidas pelo merge do PR Speed Insights via GitHub web editor; mantém versões fixas da main original;nextfixado em15.5.12; adiciona@vercel/speed-insights@1.3.1; mantém@upstash/ratelimite@upstash/redis. - fix(deps):
package-lock.json— regenerado vianpm installapós correção dopackage.json.
[2.20.29] - 2026-02-27
- docs(cto):
docs/CTO-INFRA-REPORT.md— relatório de arquitetura enterprise-grade (nível CTO sênior): executive summary, avaliação de risco atual (HIGH → LOW-MEDIUM pós-migração), topologia Azure, cinco ADRs fundamentados (Vercel-as-BFF, single-server dual-DB, Managed Identity, Consumption plan, single-region), threat model (8 camadas de defesa), modelo operacional, projeção de custo 12 meses, compliance LGPD/Lei 14.133/LAI, sete ações priorizadas. - feat(iac):
infra/main.bicep— template Bicep subscription-scope: cria ambos os resource groups (rg-govevia-prod,rg-envneo-internal) e orquestra todos os módulos em um únicoaz deployment sub create. - feat(iac):
infra/modules/log-analytics.bicep— Log Analytics Workspace (PerGB2018, 30d retention) + Application Insights workspace-based. - feat(iac):
infra/modules/keyvault.bicep— Key Vault Standard, RBAC mode, soft-delete 90d, purge protection ON. - feat(iac):
infra/modules/postgresql.bicep— PostgreSQL Flexible Server 16, SKU Burstable B1ms, 32 GB, SSL obrigatório (require_secure_transport=on), public access desabilitado, timezoneAmerica/Sao_Paulo, databasesgoveviaeenvneo_internal(collationpt_BR.utf8). - feat(iac):
infra/modules/container-registry.bicep— ACR Basicacrgoveviaprod, admin desabilitado (autenticação exclusivamente via Managed Identity). - feat(iac):
infra/modules/container-apps-env.bicep— Container Apps Managed Environment consumption plan, integrado ao Log Analytics. - feat(iac):
infra/modules/container-app.bicep— template parametrizado para Container Apps: system-assigned MI, role assignmentKey Vault Secrets User, health/readiness probes em/healthe/ready, HTTP scaling rule (100 req concorrentes), ingress externo/interno configurável. - feat(iac):
infra/params/prod.bicepparam— valores de produção (regionbrazilsouth, SKUs, nomes de recurso);dbAdminPasswordintencionalmente omitido — fornecido via variável de ambiente na linha de comando. - feat(iac):
infra/deploy.sh— script de deploy idempotente: valida pré-requisitos (az CLI, Bicep CLI), suportaDRY_RUN=1(what-if), captura outputs, atribui roleAcrPullpós-deploy e exibe próximos passos.
[2.20.28] - 2026-02-27
- docs(infra):
docs/BOM.md— Bill of Materials completo: domínios (13), Vercel (3 projects + env vars), Azure (PostgreSQL, Container Apps, Key Vault x2, ACR, Application Insights, Entra ID P1 + External ID), e-mail transacional (SPF/DKIM/DMARC), repositórios Git, custo mensal estimado (~R$ 387–467/mês) e checklist de provisionamento em 5 fases.
[2.20.27] - 2026-02-27
- fix(seo):
next.config.js— adiciona redirect canônico pendentewww.govevia.com.br→govevia.com.br(apex canônico); adiciona comentário de transição nos redirectsenvneo.com.br → govevia.com.br(a serem removidos quando envneo tiver site independente). - fix(perf):
vercel.json— adiciona headersCache-Control: immutablepara/fonts/*,/assets/*e/brand/*(paridade com envneo-site; fontes agora cacheadas por 1 ano no CDN da Vercel).
[2.20.26] - 2026-02-27
- fix(plataforma):
PersonaMetrics.client.tsx— elimina 503 no console do browser quandoGOVEVIA_CORE_URLnão está configurado no Vercel; agora verificaNEXT_PUBLIC_CORE_ENABLEDantes de fazer fetch: se não for'true', vai direto ao mock sem gerar requisição HTTP. Também trata respostaCORE_NOT_CONFIGUREDsem lançar exceção (evita ruído no console).
[2.20.25] - 2026-02-27
- security(L8):
lib/logger/security.ts— módulo de logging estruturado (NDJSON) para eventos de segurança:logSecurity({ severity, event, ip, path, detail }). Sem dependências externas, sem throws, saída para stdout (compatível com Vercel Log Drains e qualquer agregador SIEM). - security(L8):
app/api/auth/login/route.ts— instrumentado comlogSecurityem 3 pontos:auth.rate_limit(WARN),auth.login_success(INFO),auth.login_failure(WARN). Nenhum dado sensível (username/password) no payload de log.
[2.20.24] - 2026-02-27
- security(L7):
package.json— remove operadores^/~de todas as 20 dependências de produção; versões agora exatas (pinned).bun.lockepackage-lock.jsonjá versionados como fonte de verdade de instalação.
[2.20.23] - 2026-02-27
- feat(ux):
BeforeAfter— seção "O que muda na prática" com 2 colunas (Antes ❌ / Com Govevia ✓), 6 itens cada. - feat(ux):
IntegrationLogos— grid 6 integrações: SEI, Contratos.gov.br, Gov.br, Google Calendar, Microsoft Outlook, API aberta. - feat(ux):
DeploymentOptions— seletor com 3 modelos de implantação (SaaS · Nuvem Dedicada · On-premise) com AnimatePresence. - feat(ux):
FAQ— accordion 7 perguntas com framer-motion AnimatePresence. - Todos inseridos em
app/page.tsxentre ModulesCarousel e Contact com gradientes separadores.
[2.20.22] - 2026-02-27
- security(L6):
app/api/auth/login/route.ts— remove credenciais hardcoded|| 'leo'/|| 'leo123'; sem env vars → 503 (nunca fallback); rate limiting em memória (10 req/15 min por IP); comparação timing-safe (safeEqual);GET→ 405; removeusernamedo payload do evento de governança. - security(L6):
app/api/version/route.ts— retorna 404 emVERCEL_ENV=production(fix de info disclosure: commitSha, vercelRegion, portalApiBaseHost não mais expostos publicamente).
[2.20.21] - 2026-02-27
- fix(a11y):
ContactForm— corrige uso indevido derole="alert"nos 5 campos de validação: substituído poraria-live="polite", eliminando o disparo simultâneo de 5 anúncios assertivos quando o formulário é submetido vazio (comportamento problemático em NVDA/JAWS/VoiceOver).role="alert"+aria-live="assertive"mantidos exclusivamente no box de erro de sistema (resposta do servidor), que é o único caso semanticamente correto para alerta interruptivo.components/home/ContactForm.client.tsx
[2.20.20] - 2026-02-27
- security(L2):
next.config.js— removebuildCspValue()com'unsafe-inline'e origens GTM/GA4 não usadas;Content-Security-Policyagora emitida exclusivamente pelo middleware com nonce por request. ExpandePermissions-Policycompayment=(),usb=(),serial=(),bluetooth=(),document-domain=(),interest-cohort=().next.config.js
- security(L3):
nodemailer— validação de domínio do destinatário antes detransporter.sendMail(): domínio demailOptions.todeve coincidir comSMTP_USERouENVNEO_EMAIL; retorna 503 e logarequestIdse falhar (GHSA-mm7p mitigation).app/api/contact/route.ts
- a11y(L5):
ContactForm— todos os 5 campos comaria-invalid,aria-describedbyerole="alert"nas mensagens de erro inline. Screen readers agora anunciam erros de validação sem depender de posição visual.components/home/ContactForm.client.tsx
[2.20.19] - 2026-02-27
- feat(ux):
ComplianceBar— barra horizontal entre Hero e Problem com 6 badges clicáveis (LGPD · LAI · LRF · Gov.Digital · CF/88 · TCU/TCE), ícone shield amber, label "Conforme por design", link para dispositivos normativos no Planalto; hover state com borda amber e background sutil; label "Demonstrável em qualquer auditoria" escondido em mobile.components/home/ComplianceBar.tsx(novo)app/page.tsx: import + posicionamento entre Hero e Problem
- feat(ux):
MetricsAnchor— seção 3-colunas com grid unificado (separated porgap-px bg-white/[0.06]) exibindo métricas-âncora:> 95%(conformidade automática, amber),−40%(redução de prazo, sky),Zero(dependências manuais, emerald); gradientes de cor por coluna; disclaimer de transparência; separadores h-px top/bottom.components/home/MetricsAnchor.tsx(novo)app/page.tsx: import + posicionamento entre Problem e Platform
- feat(conversion): CTA primário do Hero reescrito de "Ver a plataforma → /plataforma" para "Solicitar demonstração → #contato" — alinha hierarquia de intenção ao modelo enterprise (demo-first); CTA secundário passa a "Ver a plataforma".
app/page.tsx
- feat(design): Separadores de seção em gradiente radial (
h-px bg-gradient-to-r from-transparent via-*/10 to-transparent) inseridos entre Defensibility→ModulesCarousel e ModulesCarousel→Contact — elimina cortes abruptos.app/page.tsx
- fix(next15): Migração completa de
params/searchParamsparaPromise<T>— Next.js 15 exige acesso assíncrono; seis rotas corrigidas:app/[slug]/page.tsx,app/blog/[slug]/page.tsx,app/contato/page.tsxapp/plataforma/page.tsx,app/plataforma/[persona]/page.tsxapp/plataforma/[persona]/opengraph-image.tsx,app/plataforma/[persona]/twitter-image.tsxapp/api/calendar/[token]/route.ts,app/api/core/[...path]/route.ts
- fix(prerender):
app/arquitetura/page.tsx— adicionadoexport const dynamic = 'force-dynamic'para evitar tentativa de static generation com MDXRemote (runtime MDX compilation incompatível com static pre-render do Next.js 15).
[2.20.18] - 2026-02-27
- fix(sobre): Trajetória reposicionada — movida para antes do grid de Dados Institucionais / Contato Institucional, estabelecendo o porquê antes dos dados práticos (fluxo narrativo padrão de página "Sobre").
components/about/Company.tsx
[2.20.17] - 2026-02-27
- feat(perf): Migração de fontes para
next/font/google(IBM Plex Sans 400/500/600/700, Mono 400/500, Serif 400/600/700) — elimina FOUC e CLS de fontes; fontes são auto-hospedadas em/_next/static/media/satisfazendo CSPfont-src 'self'.app/layout.tsx: importsIBM_Plex_Sans,IBM_Plex_Mono,IBM_Plex_Serif; variáveis CSS injetadas via<body className>app/globals.css: declarações manuais de--font-plex-*em:rootremovidas
- feat(ux): Skeleton de carregamento no
ModulesCarousel— 4 cardsanimate-pulseexibidos antes da hidratação JS, depois substituídos pelo carrossel animado.components/plataforma/ModulesCarousel.client.tsx
- fix(a11y): Focus ring cross-browser nos itens do trail do Defensibility —
focus-visible:ring-2 focus-visible:ring-amber-400/60 focus-visible:ring-offset-1adicionado a todos os<div role="button">.components/home/Defensibility.tsx
[2.20.16] - 2026-02-27
- feat(homepage): Hero mínimo com H1 semântico adicionado antes da seção Problem — posicionamento de marca, 2 CTAs amber, legal strip.
app/page.tsx
- fix(design-system): Unificação do sistema de cor para amber em todos os componentes home — elimina sobrevivência de
text-primary/border-primaryazul.components/home/Problem.tsx: bg-zinc-950 (ritmo visual), border-amber-400/60, ícone amber, quote box ambercomponents/home/Platform.tsx: ícone amber, badge amber, hover amber, CTA amber com shadow, modal (tagline/valor/prefix) ambercomponents/home/Defensibility.tsx: trail borders amber, quote amber, feature icons amber
- fix(ux): Features do Defensibility mostram texto diretamente — accordion removido (conteúdo de 1 linha não justifica ocultação)
- fix(tokens):
section-subtitleusatext-slate-300em vez detext-gray-300app/globals.css
[2.20.15] - 2026-02-27
- fix(homepage): Reordenar seções para fluxo narrativo coeso — Problema → Capacidades → Como funciona → Módulos → Contato.
app/page.tsx:ModulesCarouselmovido do topo para apósDefensibility(antes deContact).
[2.20.14] - 2026-02-27
- fix(plataforma): Card colapsado de persona simplificado — apenas
p.label, sem ícone, role ou org. ImportORGANIZATIONSremovido.components/plataforma/PlataformaView.client.tsx
[2.20.13] - 2026-02-27
- fix(plataforma): Botões de seleção de persona simplificados — apenas
p.label, sem ícone, role ou org; grid substituído porflex-wrap.components/plataforma/PlataformaView.client.tsx
- fix(plataforma): Seção
#anatomiaremovida; stateactiveStep,activeFlowuseMemo, IntersectionObserver effect e imports de FLOW_STEPS / GovernanceProof eliminados.components/plataforma/PlataformaView.client.tsx
- fix(header): Menu suspenso (dropdown) removido; nav items com
panelsagora renderizam como links diretos.components/Header.client.tsx: removePanelGroups,openDropdown,mobileExpanded,dropdownRef, click-outside effect.
[2.20.12] - 2026-02-27
- fix(plataforma): Bloco de widgets interativos (Row 2 / Row 2b / Row 2c) removido do card de persona — GovernanceProof, TerritorialIntelligence, IntegritySeal, AuditTrailPreview, EsicOuvidoria não são mais renderizados na seleção de persona. Imports não utilizados removidos.
components/plataforma/PlataformaView.client.tsx
[2.20.11] - 2026-02-27
- fix(contato): Título duplicado removido —
<section>hero redundante eliminada deapp/contato/page.tsx. - fix(contato): Parâmetro
?context=editor_oficialagora exibe badge com label e cargo da persona em vez do ID bruto.components/home/Contact.tsx: importaPERSONAS; renderiza badge amber comp.label+p.rolequandoformContexté umaPersonaIdválida.
[2.20.10] - 2026-02-27
- fix(plataforma): Seletor de personas não mais reseta ao colapso após troca de rota.
components/plataforma/PlataformaView.client.tsx:personaPickerExpandedinicializado comoinitialView === nullem vez detruefixo — garante que remount porrouter.pushpreserve o estado colapsado.
[2.20.9] - 2026-02-27
- feat(plataforma): Seletor de personas colapsa após escolha, mostrando só o ator selecionado + link "Mudar escolha" para re-expandir.
components/plataforma/PlataformaView.client.tsx: estadopersonaPickerExpanded; grid se oculta e exibe card compacto do ator ativo quando colapsado.
[2.20.8] - 2026-02-27
- feat(plataforma): Menu de navegação por passos adicionado à seção
#anatomia.components/plataforma/PlataformaView.client.tsx: nav sticky com IntersectionObserver; cada card recebeid="step-{id}"; botão de passo clicável faz scroll suave ao card correspondente; passo ativo destacado em amber.
[2.20.7] - 2026-02-27
- fix(plataforma): StatBar (barra amber com métricas 7/12/12/100%) removida da página de plataforma.
app/plataforma/PlatformLayout.tsx: import e<StatBar />removidos.
- fix(plataforma): Seção "O que torna a Govevia diferente" (
#diferenciais) removida.components/plataforma/PlataformaView.client.tsx: bloco<section id="diferenciais">removido.
[2.20.6] - 2026-02-27
- fix(nav): Botão "Ver Detalhes da Plataforma" no dropdown de Plataforma alterado para cor amarela (amber-500).
components/Header.client.tsx:btn-primarysubstituído por classes Tailwind amber.
[2.20.5] - 2026-02-27
- fix(homepage): Seção Hero removida da homepage.
app/page.tsx:<Hero>e seus props removidos; imports deHero,GOVEVIA_SLOGANerefUrlremovidos.
[2.20.4] - 2026-02-27
- fix(nav): Link "Ver plataforma completa →" no dropdown de Plataforma substituído por botão
btn-primarycom texto "Ver Detalhes da Plataforma".components/Header.client.tsx:classNamee texto do<Link>interno trocados.
[2.20.3] - 2026-02-24
- feat(brand): Selo de origem Env Neo adicionado na Coluna 3 do footer.
lib/brand/envneo.ts: adicionada constanteENVNEO_HOLDING_URL = 'https://www.envneo.com.br'e exposta viaENVNEO_BRAND.holdingUrl. Referência institucional à holding sem dependência técnica — link textual apenas.components/Footer.tsx: placeholder<div />substituído por seção "Origem" com link paraENVNEO_HOLDING_URL, slogan e lema da holding. Zero assets externos — HTML/CSS local, autossuficiente.
[2.20.2] - 2026-02-23
- fix(csp): Corrigidos dois bloqueios CSP em produção causados pelo toolbar/widget da Vercel.
next.config.js: substituída lógicaisPreview = VERCEL_ENV === 'preview'porisVercel = !!process.env.VERCEL, que é verdadeiro em todos os deployments Vercel (preview + production).vercelLive = isDev || isVercel.script-src:https://vercel.liveagora sempre presente em qualquer deploy Vercel (corrige_next-live/feedback/feedback.js).font-src: adicionadohttps://r2cdn.perplexity.aicondicionalmente quandoisVercel(fonteFKGroteskNeue.woff2usada pelo toolbar da Vercel).
[2.20.1] - 2026-02-23
- feat(plataforma): Seção de módulos convertida de grid estático para carrossel horizontal com scroll automático infinito.
components/plataforma/PlataformaView.client.tsx: substituídogrid grid-cols-1 md:grid-cols-2 xl:grid-cols-3por carousel edge-to-edge com@keyframes marquee-modules(60 s, linear, infinite); lista duplicada[...MODULES, ...MODULES]para loop contínuo sem salto; cards com largura fixaw-[340px];animation-play-state: pausedno hover; máscaras de fade laterais com gradientefrom-zinc-950.
[2.20.0] - 2026-02-23
- feat(plataforma): Página
/plataformaatualizada para suportar 12 personas com visão filtrada por cargo.app/plataforma/page.tsx: adicionadosvereador,presidente_camara,comissao_legislativa,agente_legislativo,arquivistaeeditor_oficialà lista válida deparseInitialView; removido redirect padrão para/plataforma/prefeito— o seletor de personas é exibido por padrão sem persona ativa.components/plataforma/PlataformaView.client.tsx: grid de personas atualizado parasm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4(comporta 12 personas com 3 linhas limpas); seção de capacidades oculta quando nenhuma persona está selecionada; filtro ativo: apenas capacidades ondecap.personas.includes(activePersona)são exibidas; badges de persona adicionados em cada card de capacidade, destacando a persona ativa em âmbar; ternários redundantes removidos do cabeçalho da seção.app/plataforma/PlatformLayout.tsx: stat bar atualizado — "6 Capacidades canônicas" → "12", "7 Personas atendidas" → "12".
[2.19.1] - 2026-02-23
- fix(build): Três correções para build limpo no
main(erros introduzidos por merge conflict residual do branch Copilot):-
app/page.tsx: removido]}duplicado que deixava o item "Agenda Institucional" fora do arrayitems={[...]}do componentePlatform, causandoSWC parse error: Expression expected. -
lib/calendar/domain-registry.ts: substituídos'localhost:3000'e'localhost:3001'hardcoded por template literals comprocess.env.DEV_PORTeprocess.env.CEO_CONSOLE_PORT(gate-no-hardcoded-endpoints). -
lib/plataforma/pessoa.ts: adicionadaconst WAIVER_ACTIVEcom marcador de conformidade ADR-003 — módulo de modelo de domínio puro, sem handler de autorização (gate-procuracao-require-evidence). -
lib/calendar/institutional-events.ts: removida funçãoaddDaysdefinida mas nunca utilizada (@typescript-eslint/no-unused-varsbloqueava ESLint do Next.js).
-
[2.19.0] - 2026-02-23
-
fix(gate): Corrigidas 17 ocorrências de
"Env Neo"isolado emlib/calendar/domain-registry.ts,lib/calendar/tenant-calendar.ts,lib/calendar/persona-groups.tselib/plataforma/pessoa.ts.gate-no-envneo-shortnamepassou de 9 FAILs para PASS. -
feat(linkedin): Publicador automático agendado para LinkedIn via GitHub Actions.
scripts/linkedin-publisher.mjs— engine LinkedIn API v2 UGC Posts; lêcontent/linkedin/*.json, filtra porpublishDate === hoje, verifica state em.linkedin-published.jsonpara evitar double-posting, POST viaugcPostscom link preview de artigo, salva state após publicação. SuportaDRY_RUN=truepara testes sem chamada real à API.content/linkedin/01–11.json— 11 posts pré-formatados (hook + story + insight + CTA + hashtags), escalonados semanalmente de 23/fev a 11/mai, ancorados ao calendário institucional (véspera TCE 31/mar, LDO 15/abr, RREO 30/mai)..github/workflows/linkedin-publisher.yml— cron diário 09h BRT (0 12 * * *),workflow_dispatchpara disparo manual,git-auto-commit-actionpara persistir o state após publicação com[skip ci].npm run linkedin:publishenpm run linkedin:dry-runadicionados aopackage.json.- Secrets necessários para ativar:
LINKEDIN_ACCESS_TOKEN+LINKEDIN_AUTHOR_URNno repositório GitHub.
-
feat(plataforma): Módulo Agenda Govevia adicionado como 7º módulo da plataforma.
components/home/Platform.tsx— ícone SVG de calendário adicionado ao arrayICONS.app/page.tsx— card "Agenda Institucional" com modal completo: 6 funcionalidades (feeds iCal por persona, tokens HMAC, alertas por criticidade, auto-sync, Google/Outlook/Apple), value proposition, métricas de impacto.app/plataforma/PlatformLayout.tsx— hero atualizado para "Sete módulos", stat bar: 7 módulos, 6 capacidades, 7 personas.
-
feat(blog): 11 artigos publicados na série "Gestão Pública Municipal" — um artigo por persona do sistema, ancorados ao calendário editorial institucional.
- Personas cobertas: multi-tenant (intro), prazo institucional, Prefeito, Cargo/Persona, Controlador, Procurador, Vereador/Câmara, Arquivista, Editor Oficial, TI Municipal, Cidadão.
- Datas de publicação: 23/fev a 11/mai, espaçadas semanalmente com alinhamento a prazos TCE, LDO e RREO.
-
fix(gate/endpoints): Corrigido
gate-no-hardcoded-endpointsemlib/calendar/institutional-events.ts— 11 URLs do Planalto substituídas por constantes viarefUrl(). Adicionadolei-8159(Lei 8.159/91) emlib/legal/legal-references.ts. -
test(calendar): Cobertura unitária completa do módulo de calendário iCal — 137 testes, 0 falhas, 6 arquivos de spec.
[2.16.0] - 2026-02-23
-
feat(tenant-elevation): Implementados artefatos de dry-run para elevação de tenant ao tier Env Live (ADR-005).
scripts/smoke/envlive-validation.mjs— smoke test da Fase 2 (parâmetros, env vars, shadow connectivity, schema de governance event, hash SHA-256 de paridade). Chamável isolado ou via orquestrador.scripts/dry-run-tenant-elevation.mjs— orquestrador completo das 4 fases do runbook (RUN-TENANT-ELEVATION.md) sem writes reais no DB. Aceita--tenant <slug>e--shadow-url <url>; exit code 0 verde = ambiente pronto para cutover real.npm run tenant:dryrunenpm run tenant:smokeadicionados aopackage.json.- [Verificação]: Dry-run concluído com sucesso para o tenant
montes-clarasem ambiente local.
-
feat(middleware): Suporte a
maintenance_modeviaTENANT_MAINTENANCE_SLUGS(env var Vercel, slugs separados por vírgula). Middleware retorna HTTP 503 +Retry-After: 900para o tenant específico durante a Fase 3 (cutover), sem afetar outros tenants. -
fix(esic): Removido import
useEffectnão utilizado deEsicOuvidoria.client.tsx— corrige erro ESLint@typescript-eslint/no-unused-varsque bloqueava o build.
[2.15.0] - 2026-02-23
- Módulo E-SIC / Ouvidoria (
esic_ouvidoria): Novo componenteEsicOuvidoria.client.tsxcom Monitor de Demandas (protocolo CONARQ, barra de prazo, stepper de estágio, alerta de preclusão) e Simulador de Protocolo (5 passos animados, geração de número único, tabela de prazos LAI + Lei 13.460). - Capability
protocolo_lai: Nova capacidade canônica adicionada ao SSOT (lib/plataforma/ssot.ts). Personascidadaoecontroladorpassam a tê-la como evidência prioritária;procuradorcomo evidência secundária. - Wire por persona: Componente E-SIC renderizado condicionalmente em
PlataformaViewviapersona.evidencias.includes('protocolo_lai'). Prefeito e Procurador (sem LAI/ouvidoria direto) não veem o componente. - Referências legais canônicas: Adicionados
lei-13460(Lei 13.460/2017 — Direitos dos Usuários) edecreto-7724(Decreto 7.724/2012 — Regulamento da LAI) emlib/legal/legal-references.ts. Union typecategoryextendido com'decreto'. - E2E Full Loop
processo-pi.spec.ts: Reescrito com 6 suites (30+ assertions) cobrindo: seletor de personas (aria-pressed, URL, painel de contexto), fluxo PI completo (passos 01–06 com cada gate da Matriz D), modal de minuta assistida (abertura, conteúdo, copiar, fechar, backdrop), E-SIC/Ouvidoria por persona (visibilidade, tabs, simulador, prazos legais, links), garantias de imutabilidade (seções anatomia, Trust Center, GovernanceProof), e mobile carousel (hint, largura snap, ausência em desktop).
[2.14.1] - 2026-02-23
- UX Mobile-first: Carrossel de personas: Seletor de personas em
/plataformaconvertido para carrossel horizontal com snap scroll no mobile (< sm). Cards com largura78vwesnap-centerrevelam o próximo card como affordance de deslize — usuário vê imediatamente que há mais opções sem precisar rolar verticalmente pela lista completa. - Auto-scroll ao conteúdo: Após selecionar uma persona no mobile, a view de detalhes recebe scroll automático suave (
scrollIntoView) com delay de 200 ms, eliminando a necessidade de rolar manualmente passando pelos demais cards. - Hint de deslize: Label "Deslize para ver todas as personas" visível exclusivamente em mobile (
sm:hidden), tornando o gesto de swipe descobrível. - Sem quebra em desktop: Comportamento grid (
sm:grid-cols-2 lg:grid-cols-5) preservado integralmente em telas maiores.
[2.14.0] - 2026-02-23
-
Segurança: Remover mock de geolocalização: Eliminado
setDetectedCity('Montes Claros')hardcoded doHero.tsx. A home pública não exibe mais cidade fictícia; personalização municipal ocorre exclusivamente via token de pré-prospecção. -
Controle de acesso: Prospect Token Gate: Rotas municipais (
/[slug]) agora exigem um token HMAC-SHA256 assinado com TTL de 72 horas, gerado exclusivamente via API protegida (POST /api/prospect/tokencomx-admin-secret). Usuários sem token (ou com token expirado/inválido) são redirecionados ao/. -
Middleware: proteção de slugs municipais: Middleware estendido para capturar single-segment routes não reservadas; valida token via URL (
?t=) ou cookieHttpOnlygerado no primeiro acesso válido. Token é removido da URL após validação para não vazar em logs. -
lib/prospect-token.ts: Utilitário criptográfico (Web Crypto API / HMAC-SHA256) para assinar e verificar tokens de pré-prospecção com compare em tempo constante. -
app/api/prospect/token/route.ts: EndpointPOSTprotegido para geração de links personalizados de pré-prospecção por slug + e-mail de contato prospectado. -
Separação de dados pessoais vs. institucionais: Removido card "Liderança" (nome, e-mail e WhatsApp pessoal do fundador) da página
/sobre. Dados do fundador ficam exclusivamente em/contato. A/sobreexibe apenas Dados Institucionais da empresa e Contato Institucional da Govevia (e-mail + telefone da marca). -
Desambiguação: Trilha Auditável: Capacidade
id='trilha'renomeada de "Trilha de Tramitação" para "Trilha Auditável" com subtitle e descrição atualizados — alinha com uso em Row 2b e home, e menciona explicitamente TCE, TCU e CGU como destinatários da evidência. -
Desambiguação: Assinatura Eletrônica: Subtitle e descrição da capacidade
id='assinatura'corrigidos para refletir os 3 níveis da Lei 14.129/21 (N1 simples → N2 avançada → N3 qualificada/ICP-Brasil) com terminologia de gênero correta. -
Desambiguação: Personas com afiliação institucional: Seletor de personas na plataforma agora exibe a organização de origem abaixo do papel (ex.: "Controladoria" sob "Controlador Interno", "Tribunal de Contas" sob "Auditor Externo / TCE"), eliminando ambiguidade antes do clique.
-
Desambiguação: TCE / TCU / CGU em base-legal: Adicionada nota explicativa na página
/base-legaldistinguindo TCE (controle externo estadual/municipal), TCU (controle externo federal) e CGU (controle interno federal), evitando confusão entre os três órgãos.
[2.13.0] - 2026-02-23
- E-SIC & Ouvidoria: Novo módulo integrado para Lei 12.527/2011 (LAI) e Lei 13.460/2017 (Ouvidoria). Protocolo automático, alertas de prazos legais (10 dias antes da preclusão) e exportação de datasets com estatísticas públicas.
- Portal de Transparência: Novo módulo com publicação automática de dados em formatos abertos (CSV, JSON, XML, RDF). API RESTful versionada e dashboard público com análise de tendências.
- Fluxo de Cidadania: Implementação do
CITIZEN_ENGAGEMENT_FLOW_STEPScom 6 etapas: Protocolo → Triagem → Compilação → Resposta Certificada → Recursos → Arquivamento. - Persona Cidadão Refinada: Atualização do PlataformaView com roteamento para CITIZEN_ENGAGEMENT_FLOW_STEPS na persona cidadão e integração de transparência e acesso à informação. Adição de camadas geoespaciais de transparência e refinamento de ordem de capacidades.
- Persona Controlador Refinada: Adição de capacidades LAI e auditoria de trilha E-SIC ao controlador interno para conformidade contínua e mitigação de riscos com foco em transparência ativa.
[2.12.0] - 2026-02-23
- Trilha Auditável Integrada: Componente
AuditTrailPreview.client.tsxintegrado aoPlataformaView(Row 2b) com visualização animada do fluxo SHA-256, assinatura ICP-Brasil e encadeamento imutável. - Seal de Integridade Integrado: Componente
IntegritySeal.client.tsxintegrado aoPlataformaView(Row 2b) com animações de rotação e efeito brilho para apresentação visual da verificação de integridade. - Row 2b - Trust Center: Nova linha de componentes dedicada a fé pública digital e trilha auditável, visível para todas as personas na plataforma.
[2.11.0] - 2026-02-23
- SEO Escalável: Criação do utilitário
lib/metadata.tspara geração dinâmica de metadados hiper-localizados para todos os 5.570+ municípios. - Sitemap Dinâmico: Otimização do
app/sitemap.tscom suporte a indexação nacional e aumento de prioridade para landing pages municipais. - Tags de Metadados: Implementação completa de OpenGraph e Twitter Cards específicos por município.
[2.10.0] - 2026-02-23
- Diário Oficial: Implementação do módulo de Imprensa Oficial com diagramação automática e gestão de edições.
- Integração Legislativa: Conexão nativa entre o Módulo de Leis (Legislativo) e a Publicação Oficial em Diário.
- Acesso Multi-Diário: Nova capacidade de visitar e consumir diários de outros entes via API integrada.
- Persona Editor Oficial: Atendimento às demandas de fechamento editorial e fé pública digital.
- Assinatura ICP-Brasil: Integração de assinatura digital e Hash Chain por edição para imutabilidade plena.
[2.9.0] - 2026-02-23
- Zeladoria Urbana: Refinamento da persona "Secretário Municipal" com foco em serviços urbanos e manutenção.
- Fluxo Operacional: Implementação do ciclo de vida de Ordens de Serviço (Solicitação, Despacho, Execução e Entrega).
- Prova Visual: Integração de evidências georreferenciadas (Antes/Depois) com hash de integridade.
- Métricas de Performance: Novos KPIs de SLA de Zeladoria e Obras Ativas para gestão estratégica.
[2.8.0] - 2026-02-23
- Controle de Temporalidade: Implementação do módulo de gestão do ciclo de vida documental conforme CONARQ.
- Persona Arquivista: Atendimento às demandas de transformação digital e custódia de acervos.
- Fluxo de Transformação: Etapas de digitalização certificada, OCR inteligente e eliminação regulamentada.
- Terminologia Legislativa: Finalizada limpeza de redundâncias em "Comissão Legislativa".
[2.7.0] - 2026-02-23
Added
- Hyper-local Municipal Intelligence: Dynamic municipal routing (
/[slug]) for nationwide SEO coverage. - Geolocation Awareness: Client-side detection of the user's city with personalized Hero greetings and CTAs.
- Dynamic SEO: Automated metadata generation for 5,570+ Brazilian municipalities.
- Municipal Context: Injected municipal data into the platform view for hyper-segmented landing pages.
- UI Optimization: Redesigned the persona view with a balanced 2x2 grid layout to improve space utilization and reduce vertical scrolling.
- Terminology Standardization: Renamed "Comissão Legislativa" to "Relatoria Legislativa" and updated process flows to remove redundant terms, focusing on technical analysis and reporting.
- Dynamic Sitemap: Integrated municipal dynamic routes into
app/sitemap.tsfor automated SEO indexing.
[2.6.1] - 2026-02-23
Removed
- CEO Admin Access: Removed the floating admin access button (padlock icon) from the main interface as requested.
[2.6.0] - 2026-02-23
Added
- Legislative Life Cycle: Full process integration from proposal (co-authorship) to committee review, session management, and controlled voting.
- Dynamic Platform Flows: The platform now switches between Legislative and Executive flow architectures based on the active persona.
- Unified Traceability: Cryptographic linking (SHA-256) between legislative normative production and executive administrative facts.
[2.5.0] - 2026-02-23
Added
- Legislative Houses Integration: Inclusion of the "Representante Legislativo" (Vereador) persona and "Câmara Municipal" organization.
- Legislative-Executive Convergence: Foundation for linking normative production to executive enforcement.
- Enhanced Territorial Vision: New geospatial layers for "Aderência Normativa" and "Demandas Territoriais" specific to legislative oversight.
[2.4.0] - 2026-02-23
Added
- Corporate/Org Layer: Formalized mapping and visualization of public bodies associated with personas.
- Institutional Passport: New
OrgLayercomponent providing institutional mission and risk context for each persona.
[2.3.0] - 2026-02-23
Added
- Reputational Dossier: Comprehensive mapping of technical resources to reputational benefits and explainability logic.
- Explainability Framework: Standardized technical justifications for audit-proof governance.
[2.2.0] - 2026-02-23
Added
- Territorial Intelligence: Interactive geospatial view in the platform with toggleable layers for urban compliance, risk, and works.
- Entity Mapping: Personas are now mapped to their respective public bodies (e.g., Prefeitura, PGM, TCE).
- Geospatial Leads Insight: Added territorial intent heatmap to the CEO Console Leads dashboard.
[2.1.0] - 2026-02-23
Added
- Contextual WhatsApp: Floating button with persona-specific pre-filled messages and initiation tracking.
- Market Intelligence Dashboard: Lead distribution oversight in CEO Console with persona-based segmentation.
- Trust Center (Governance Proof): Live feed of simulated architecture enforcement events in Plataforma View.
- UI Improvements: Standardized brand slogan "Governança Pública Executável" and improved platform interactivity.
[2.0.2] - 2026-02-23
Adicionado
- Funil de Conversão: Instrumentação completa com Vercel Analytics no formulário de leads e na visualização por persona.
- Enriquecimento de Leads: Melhoria na API
/api/contactpara processar contexto de persona e metadados técnicos (UA, Referer). - UX Ética: Refinamento dos estados de sucesso e erro com mensagens contextuais e feedback visual aprimorado.
[2.0.1] - 2026-02-23
Adicionado
- Formulário de Captura de Leads: Implementado o componente
ContactForm.client.tsxcom validação Zod e design premium. - Integração de Contato: O formulário agora está integrado à API de contato e disponível na Home e na página de Contato.
- Conformidade de Marca: Padronização final do slogan "Governança Pública Executável" e identidades visuais de SEO e OG.
[2.0.0] - 2026-02-22
Slogan Formalization & INPI Alignment 🛡️
- Slogan Oficial: Formalização de "Governança Pública Executável" como slogan oficial para processos de registro de marcas e patentes (INPI).
- Padronização Global: Substituição de strings hardcoded pelas constantes
GOVEVIA_SLOGANeGOVEVIA_TAGLINEemapp/layout.tsx,app/page.tsx,app/blog/page.tsxecomponents/Footer.tsx. - Remediação Profunda: Auditoria completa e padronização de metadados de SEO em todas as personas (
ssot.ts), JSONs de identidade (org-identity.json,brand-registry.json) e imagens OG/Twitter. - Diferenciação de Marca: Ajuste do lockup nos assets de SEO para refletir corretamente o endosso da holding (Govevia — por Env Neo).
- Arquitetura de Marca: Atualização do
BRAND-ARCH-ENVNEO-GOVEVIA.mdpara refletir o novo status legal do slogan.
2026-02-23 — feat(analytics): Vercel Speed Insights Integration 📊
- Speed Insights: Integrado
@vercel/speed-insightsno root layout para monitoramento de Core Web Vitals em produção. - Next.js 14.2+: Configuração nativa para App Router com componente
<SpeedInsights />adicionado ao body. - Performance: Habilitado tracking real-time de métricas de performance (LCP, FID, CLS) para otimização contínua.
2026-02-22 — ui(core): Persona-Aware Hub & Amber Theme Expansion 🔸
- Persona Context: Implementação de arquitetura de conteúdo orientada a personas na página
/plataforma, adaptando dinamicamente dores, riscos e prioridades. - Unificação Visual (Blog): Transição completa dos elementos de destaque do blog (tags, links, blockquotes e code blocks) do esquema
primary(navy) paraamber(rgb 251 191 36). - Refatoração de Layout: Simplificação do
PlatformLayout.tsxe centralização da lógica reativa noPlataformaView.client.tsx.
2026-02-22 — fix(copy): Escopo Multipoder e Auditoria Integral 🔍
- Alinhamento de Escopo: Realizada remediação integral para remover limitações "municipais" em CTAs, metadados e heros. O posicionamento agora cobre formalmente Executivo, Legislativo, Judiciário e Tribunais de Controle em todo o site.
- SSOT Branding: Atualizadas as constantes em
lib/brand/envneo.tspara garantir consistência automática de marca e SEO em todos os consumidores de dados. - Auditoria 100%: Concluída revisão de 100% das linhas de conteúdo, identificando e corrigindo 11 pontos de atenção entre riscos legais e lacunas conceituais.
2026-02-22 — test(e2e): Suite Visual Playwright 🎭
- Pacing Humano: Implementado modo
--headedcomslowMo: 400mspara execuções observáveis e auditoria visual dos fluxos críticos de governança. - Cobertura E2E: Criadas specs para
homepage,persona-navigationecompliance-alert(19 testes aprovados). - Relatórios: Habilitada geração automática de vídeos, traces e relatórios HTML para verificação pós-execução e evidência técnica.
2026-02-22 — feat(core): expansão de conformidade TCE (Phase 5)
- Defensibilidade Real-Time: Implementado componente
ComplianceAlertpara sinalizar riscos iminentes de apontamento no TCE (ex: LRF, Prazos LAI). - Indicadores de Gestão: Expandidas as métricas de persona para incluir indicadores de "Risco de Apontamento" e "Defensibilidade Legal".
- Compliance: Atualizada a política
POL-SLA-ENTERPRISE.mdcom garantias determinísticas e qualificadores de auditoria.
2026-02-22 — feat(core): Integração Core via BFF e Métricas Real-Time (Fase 4)
- BFF Infra: Implementado gateway seguro em
/api/core/*para comunicação com serviços internos. - Segurança: Adicionada sanitização automática de PII e injeção de Sovereign Tokens no lado do servidor.
- Real-Time UI: Novo componente
PersonaMetricsque exibe dados ao vivo do Core diretamente no dashboard de cada persona. - Resiliência: Implementado fallback automático para dados simulados (mock) em caso de indisponibilidade da API do Core.
2026-02-22 — docs(ops): Runbook de Elevação de Tenant (Q-004)
- Operação Env Live: Criado
docs/runbooks/RUN-TENANT-ELEVATION.mdpara guiar a migração de multi-tenant para dedicado. - Conformidade: Runbook alinhado às 4 fases do ADR-005, garantindo auditabilidade via
governance_events. - Estratégia: Formalizado o procedimento de cutover de 15 minutos e os invariantes de proteção de dados.
2026-02-22 — docs(gov): Estratégia de Suporte e SLA Enterprise (Q-002)
- SLA Env Live: Definida a política
docs/governance/POL-SLA-ENTERPRISE.mdcom garantia de 99,95% de uptime. - Enforcement de Tempo: Estabelecido tempo de resposta de 2h para incidentes críticos (P1) com cobertura 24/7.
- Escalonamento Soberano: Implementado fluxo de escalonamento direto para CTO/CEO e registro automático em
governance_eventspara violações de SLA em grandes contas.
2026-02-21 — feat(governance): infraestrutura de eventos e Timeline Admin (Phase 3 | Q-005)
- Q-005 Implementado: Criada a tabela
governance_eventscom proteção de integridade via Hash-Chain SHA-256 e imutabilidade via RLS (Append-only). - Core Governance: Implementada utilidade
emitGovernanceEventbaseada empgpara registro auditável de ações críticas. - CEO Console (Admin): Criada a base do console administrativo em
apps/ceo-consolecom layout profissional e página de/admin/activity. - Matriz de Personas: Expandida para 6 perfis canônicos conforme feedback estratégico (incorporando Controlador Interno e Cidadão).
- Segurança e Conformidade: Reforçada a fronteira de monorepo; o site público (
app/) permanece livre de superfícies administrativas, respeitando o gategate-no-admin-in-site-public. - Eventos de Login: Integrado o registro de
admin.loginno endpoint de autenticação. - Gestão de Projeto: Atualizados
STATUS.mdeCEO-QUEUE.yaml(Q-005 finalizado).
2026-02-21 — fix(nav): unificação de rotas e remoção de redundância cognitiva na Home
- Resolução de conflito de navegação: o CTA principal do Hero ("Ver Detalhes da Plataforma") agora aponta para a página completa
/plataforma, unificando o destino com o link do Header. - Renomeação da seção da Home: "A Plataforma Govevia" → "Recursos e Capacidades", diferenciando claramente a vitrine de funcionalidades do destino final da plataforma.
- Eliminação de redundância de labels que levavam a destinos distintos (scroll vs nova página).
2026-02-21 — feat(sobre): refinamento institucional — "governança como código"
- Atualização da página "Sobre" para refletir o novo padrão de excelência Govevia: linguagem direta, frieza analítica e foco em enforcement técnico.
- Redefinição da missão: proteger a inteligência humana através de restrições técnicas invariantes.
- "Princípios" renomeados para "Princípios Invariantes", com novos descritivos focados em evidência criptográfica e falha segura por arquitetura.
- Seção "Trajetória" atualizada com foco em Governança como Código, rollback funcional e integridade temporal.
- Metadata SEO de
/sobreatualizado para coesão com o novo pitch.
2026-02-21 — feat(legal): integração BFF + página Base Legal — consumo do domínio LegalDevice do kernel
Contexto: O kernel Java (govevia-kernel) possui o domínio LegalDevice com dispositivos legais cadastrados no banco PostgreSQL. O site utilizava apenas referências estáticas em lib/legal/legal-references.ts e content/normas-legais.json.
Solução implementada (arquitetura kernel-first + fallback estático):
lib/kernel/types.ts— tipos TypeScript que espelham o DTO JavaLegalDeviceResponse(record:id, label, content, urnLex, status, effectiveStart, effectiveEnd). Inclui tipo normalizadoNormaLegal, adaptadoresfromKernelDevice()efromStaticNorma()e payloadLegalDevicesPayload.app/api/core/leis/route.ts— BFF Route HandlerGET /api/core/leiscom:- Tentativa primária:
GET ${KERNEL_API_URL}/public/v1/portal/legislationcomAuthorization: Bearer ${KERNEL_SERVICE_TOKEN}(revalidate 1h). - Fallback:
content/normas-legais.jsonadaptado viafromStaticNorma(). - Parâmetros de query:
esfera,status(defaultativa),q(busca textual).
- Tentativa primária:
components/legal/LegalDevicesSection.client.tsx— componente client que consome/api/core/leis, exibe grid de cartões com badge de esfera, filtros de esfera e busca textual.app/base-legal/page.tsx— nova rota/base-legalcom metadata SEO, hero e componenteLegalDevicesSection.components/Footer.tsx— adicionado link "Base Legal" ao bloco de navegação institucional.
Variáveis de ambiente necessárias (Vercel):
KERNEL_API_URL— URL base do kernel Java (ex:https://api.govevia.com.br)KERNEL_SERVICE_TOKEN— JWT de serviço para autenticar a chamada server-side
Nota para o kernel: Para consumo em produção, adicionar:
GET /public/v1/portal/legislationemPortalPublicControllerservindoLegalDeviceResponse[].requestMatchers("/public/**").permitAll()emSecurityConfiggovevia.com.bre*.vercel.appnosallowedOriginsdo CORS
2026-02-21 — feat(brand): BrandWordmark — SSOT tipográfico do logotipo Govevia
Problema: Header usava font-sans text-[1.15rem] e Footer usava font-serif text-xl — duas renderizações distintas do mesmo logotipo.
Solução:
- Criado
components/brand/BrandWordmark.tsxcomo única fonte de verdade para o logotipo textual. - Tipografia canônica definida:
font-sans font-bold tracking-tight text-white leading-none(IBM Plex Sans — alinhado asection-titleeh1-h6do globals.css). - Variantes de tamanho:
sm(footer, 20px ícone / text-lg) ·md(header, 28px / text-xl) ·lg(hero, 36px / text-2xl). Header.client.tsx: wordmark inline substituído por<BrandWordmark size="md" />. PropproductNameremovida (desnecessária).Header.tsx: propproductNameremovida. ImportGOVEVIA_PRODUCT_NAMEremovido.Footer.tsx: wordmarkfont-serifsubstituído por<BrandWordmark size="sm" />.GoveviaMarkSvgagora é usado exclusivamente dentro deBrandWordmark— nunca diretamente em superfícies.
2026-02-21 — fix(nav): remoção do CTA "Fale com nossa equipe" do header e footer
Header.client.tsx: botãobtn-primarydesktop e mobile removidos — link/contatojá está no menu de navegação como item "Contato" ou acessível via footer.Footer.tsx: CTA "Fale com nossa equipe" removido da coluna 3; coluna mantida como placeholder para preservar o grid de 3 colunas.
2026-02-21 — fix(plataforma): remoção do botão "Sobre a Govevia" redundante
app/plataforma/PlatformLayout.tsx: botão secundário/sobreremovido da seção hero da plataforma — link já disponível no menu de navegação.
2026-02-21 — fix(contact): caixas "Implantação consultiva" e CEO unificadas
components/home/Contact.tsx: dois cards separados da coluna esquerda fundidos em um únicobg-white/5 rounded-lg border, com<hr className="border-white/10">como divisor interno.- Texto do WhatsApp corrigido de
text-gray-200→text-slate-200(coesão de tokens).
2026-02-21 — fix(seo): redirects 301 canônicos para govevia.com.br
next.config.js: adicionadoredirects()com 3 regraspermanent: true(301):govevia.com/*→govevia.com.br/*www.govevia.com/*→govevia.com.br/*govevia-site.vercel.app/*→govevia.com.br/*
- Elimina cadeia de redirecionamento (
govevia.com→www.govevia.com→ ...) e o 307 temporário que prejudicava SEO. - Centraliza controle de canonical no código, independente de configuração manual no painel Vercel.
2026-02-21 — fix(problem): remoção do efeito hover-expand nos cards de problema
components/home/Problem.tsx: descrição de cada card passa a ser sempre visível — removidas classesmax-h-0 opacity-0 group-hover:max-h-40 group-hover:opacity-100 overflow-hidden transition-all.- Removidas classes
groupehover:bg-white/10 transition-alldo card (efeito de expansão eliminnado).
2026-02-21 — fix(hero): remoção do indicador de scroll (seta animada)
- Removido bloco "Scroll Indicator" (
motion.divcom setaanimate-bouncee âncora#problema) decomponents/home/Hero.tsx. - Removida prop
scrollLabeldo tipoPropse da assinatura do componente. - Removida prop
scrollLabel="Conheça mais"da chamada emapp/page.tsx.
2026-02-21 — fix(nav): coesão entre menu superior e rodapé
Footer.tsx: navegação principal sincronizada comHeader.tsx— "Publicações" agora renderiza condicionalmente, viagetAllPosts(), idêntico ao comportamento do header.- CTA do rodapé: label unificado para "Fale com nossa equipe" (igualando o header); link corrigido de
#contatopara/contato. Header.client.tsx: CTAs desktop e mobile corrigidos de#contatopara/contato, garantindo roteamento correto em qualquer página.
2026-02-21 — feat(plataforma): Persona-specific SEO Media & Navigation Fixes
- SEO Media: Criados
opengraph-image.tsxetwitter-image.tsxdedicados emapp/plataforma/[persona]/. Agora cada persona gera cards sociais dinâmicos com seu próprio título e subtítulo. - Ecossistema de Personas: Expandido de 4 para 6 perfis. Adicionados Cidadão (foco em transparência e controle social) e Controlador Interno (foco em governança preventiva e mitigação de riscos). Auditor Externo renomeado para maior clareza.
- Material Editorial: Criados novos artigos de blog (
.mdx) específicos para as novas personas, fornecendo profundidade narrativa e autoridade técnica para os perfis de Cidadão e Controlador Interno. - Sitemap:
app/sitemap.tsatualizado para incluir dinamicamente todas as rotas de persona, melhorando a indexação granular por perfil. - UX:
app/plataforma/page.tsxagora redireciona para/plataforma/prefeitopor padrão, garantindo que o usuário sempre caia em uma rota de persona indexável e com metadados completos. - Analytics: Integrado
@vercel/analyticsemPlataformaView.client.tsxpara rastrear acessos diretos e trocas de persona, possibilitando segmentação de interesse por perfil. - Navegação: Refatorada lógica de
setViewemPlataformaView.client.tsxpara garantir transições suaves entre rotas dedicadas e estados de ativação consistentes.
2026-02-21 — feat(plataforma): rotas dedicadas por persona e SEO (Phase 2)
- Implementadas rotas dinâmicas
/plataforma/[persona]para Prefeito, Procurador, Auditor e Secretário. - SEO Percussivo: Cada persona agora possui
<title>e<meta description>únicos, derivados do SSOT, para melhor indexação e social sharing. - Refatoração Estrutural: Conteúdo da plataforma extraído para
PlatformLayout.tsx, compartilhado entre a rota base e as rotas de persona. - Navegação Fluida:
PlataformaView.client.tsxatualizado para usarrouter.push('/plataforma/[persona]')em vez de query params, proporcionando URLs limpas. - Performance: Uso de
generateStaticParamspara garantir que todas as 4 rotas de persona sejam geradas estaticamente em build time.
2026-02-21 — refactor(a11y): upgrade de contraste para WCAG AAA (compliance GovTech)
- Implementada melhoria de acessibilidade visual em 21 arquivos através do upgrade sistemático de cores de texto.
- text-gray-300 (#d1d5db) → text-slate-200 (#e2e8f0): contraste elevado de 5.7:1 para 10.2:1 (superando o requisito AAA de 7:1).
- text-gray-400 (#9ca3af) → text-slate-300 (#cbd5e1): contraste elevado de 4.0:1 para 7.5:1 (passes AA/AAA).
- Upgrades específicos em
PlataformaView.client.tsxe/plataformapara garantir legibilidade máxima em fundos navy/deep-navy. - Objetivo: Reduzir fadiga visual, melhorar acessibilidade em dispositivos mobile e garantir conformidade com editais que exigem WCAG 2.2 AA/AAA.
2026-02-21 — refactor(footer): simplificação estrutural — 3 colunas
- Footer reestruturado de 4 blocos sobrecarregados para 3 colunas + rodapé final.
- Removidos: bloco "Liderança" (CEO, cargo, WhatsApp), endereço completo, razão social duplicada, atividade.
- Coluna 1: marca + tagline + navegação (Início, Plataforma, Publicações, Sobre, Política de Privacidade, Termos de Uso).
- Coluna 2: contato resumido (e-mail clicável, telefone clicável) + botão "Entre em contato".
- Coluna 3: badges de conformidade regulatória (LGPD, LAI, LRF, Lei 14.133, Lei 14.129, ICP-Brasil) — clicáveis, linkados a fontes oficiais.
- Rodapé final: 1 linha centralizada com razão social + CNPJ + copyright.
FOOTER_SLUGSconvertido de array 2D para flat array.- Zero strings hardcoded — tudo via
ENVNEO_BRANDeLEGAL_REFERENCES.
2026-02-21 — feat(brand): favicon dinâmico com marca Govevia
- Substituído
app/icon.png(estático, fundo branco) porapp/icon.tsx(gerado viaImageResponse). Favicon agora renderiza a marca G com sparks sobre fundo#080C14(deep-navy), com cantos arredondados 14px. Funciona em tabs claras e escuras.
2026-02-21 — fix(build): allowlist legal-references no gate-no-hardcoded-endpoints
lib/legal/legal-references.tsadicionado ao allowlist do gategate-no-hardcoded-endpoints— URLs de legislação oficial (planalto.gov.br) são dados públicos estáticos, não endpoints de conectividade.
2026-02-21 — feat(site): badges regulatórios linkados a legal-references
- Criado
lib/legal/legal-references.ts— SSOT com 9 referências legais (slug, short_name, full_name, official_url, category). - Compliance badges (6): agora são links clicáveis com
target="_blank",aria-label, ícone externo ↗, hover state. - Hero badges (6): convertidos de
string[]paraArray<{ label, url }>— mesmo padrão de links. - Footer "Conformidade Regulatória": 6 URLs hardcoded substituídas por lookup em
LEGAL_REFERENCESviaFOOTER_SLUGS. - Todas as URLs agora apontam para fontes oficiais (planalto.gov.br) em vez de PDFs/sites secundários.
2026-02-21 — fix(build): ENVNEO_TRADE_NAME derivado (gate shortname)
- Fix(build):
ENVNEO_TRADE_NAMEera literal'Env Neo'— violava gategate-no-envneo-shortname. Agora derivado deENVNEO_LEGAL_ENTITY_NAME.replace(' Ltda.', '').trim().
2026-02-19 — SPRINT-PRESENT-01 — Apresentação executável (Docs + CEO Console)
- Docs: padronização de display name "Env Live" (sem "EnvLive") e preenchimento explícito da entidade contratante ENV NEO LTDA + CNPJ: 36.207.211/0001-47 em políticas.
- CEO Console: identidade corporativa padronizada e sem shortname proibido; cockpit
/admin/opsajustado para não exibir “EnvNeo” como nome. - Enforcement: novo gate
gate-docs-brand-legalimpede regressão (proíbe "EnvLive" emdocs/e placeholders[CNPJ]/[RAZÃO SOCIAL]). - Build: correção de lint (variáveis não usadas) em
lib/rules/engine.tspara liberarnext build. - Conteúdo: correção de frontmatter YAML inválido em
content/blog/ia-em-governo-nao-pode-ser-caixa-preta.mdx(linhas coladasauthor/draft/tags). - Refinamento:
envneo/ops/CEO-QUEUE.yamlatualizado (itens concluídos movidos paradone; WIP limpo) e índice/status emdocs/INDEX.md+docs/STATUS.mdalinhados ao payload atual. - Fix: site-public passa a tratar
/admine/admin/logincomo entrypoint seguro (redirect/página informativa) para o CEO Console, mantendo demais/admin/*fechados com 404. - Refinamento: página informativa de
/admin/loginajustada (copy mais neutra/profissional) ePRESENT-CEO-CONSOLEexplicita URLs locais do CEO Console (porta 3001). - Fix(build): removido
next/font/google(evita fetch de woff2 emfonts.gstatic.comdurante build no Vercel); fontes agora via stack local/system em CSS vars (--font-plex-*). - Enforcement: redirect de
/admin/loginno site público virou governado (pré-check em/api/healthzdo CEO Console; se indisponível responde503com correlation id). Gategate-ceo-console-healthbloqueia deploy quandoCEO_CONSOLE_BASE_URLestá configurada mas inválida. - Fix: botão flutuante “Área administrativa” usa navegação por
href(full load) para o entrypoint servido por middleware, evitando inconsistências de navegação client-side. - Fix:
/admin/Login(ou outras variações de maiúsculas/minúsculas) agora é normalizado para/admin/loginvia redirect 307.
2026-02-18 — Docs: PROMPT-00 — Modelo de Excelência EnvNeo Ltda
docs/PROMPT-00.md(NOVO): documento canônico de governança operacional — Modelo de Excelência da EnvNeo Ltda. Define: regra de ouro, fronteiras do ecossistema (EnvNeo / Govevia / Identity / CyberSecure / govevia-site), unicidade de tecnologias e protocolos, multi-tenant, proibição de hardcode, evidência-by-design, enforcement mensurável, LGPD, formato de entrega obrigatório (Implementação Concluída), proibição de overengineering e DoD (Definition of Done).docs/GOVERNANCE-MANIFEST.yaml: registrado comooperating_model.
2026-02-18 — Feat: nav dinâmico — itens sem conteúdo publicado não são exibidos
lib/blog.ts: adicionado campodraft: booleanemBlogPosteBlogPostMeta;getAllPosts()aceita{ includeDrafts }e filtra rascunhos por padrão.content/blog/*.mdx: ambos os posts marcados comodraft: true— "Publicações" some do menu enquanto não houver posts publicados.components/Header.tsx: conta posts publicados (getAllPosts()) e monta arraynavigationdinamicamente — item "Publicações" só é incluído sepublishedPostCount > 0.components/Header.client.tsx:navigationdeixa de ser hardcoded; recebido como prop do servidor.app/blog/[slug]/page.tsx:generateStaticParamsexclui drafts; página retorna 404 para posts comdraft: trueacessados diretamente.
2026-02-18 — Refactor: SSOT de marca Env Neo — fonte única implementada em todos os consumidores
lib/brand/envneo.ts(NOVO): fonte única da identidade Env Neo — nome legal, CNPJ, e-mail, endereço, tagline, descrição, segment, URLs. Exporta tambémnormalizeLegalEntityName()(antes duplicada em Header e Footer).components/Header.tsx: removenormalizeLegalEntityNamelocal; importa do SSOT.components/Footer.tsx: removenormalizeLegalEntityNamelocal e strings hardcoded (e-mail, endereço, CNPJ, tagline, descrição); importaENVNEO_BRANDdo SSOT.lib/core/portalBrand.ts: fallback local aponta paraENVNEO_LEGAL_ENTITY_NAMEeGOVEVIA_PRODUCT_NAMEdo SSOT.lib/blog.ts: autor padrão dos posts importaENVNEO_LEGAL_ENTITY_NAMEdo SSOT.
2026-02-18 — Refactor: SSOT para módulos de enforcement da plataforma
-
lib/plataforma/modules.ts(NOVO): fonte única de verdade para os 6 módulos da plataforma (Processos, Urbanismo, Assinatura, Auditoria, LGPD, Transparência). Cada módulo expõefunctional,normative,enforcement,legalBasis,technicalFeatureseiconPaths. Alterar aqui reflete automaticamente em qualquer consumidor do site. -
components/platform/ModulesDetail.tsx: removido array local de 175 linhas hardcoded; agora importaMODULESde@/lib/plataforma/modules. Sem mudança visual; substituição pura de origem dos dados. -
lib/taxonomy.ts: dados de personas e contextos embutidos diretamente no TypeScript, eliminandofs.readFileSyncsobre YAMLs em/admin/impersonateestartImpersonationAction. Em ambientes serverless (Vercel), arquivos estáticos não rastreados pelo bundler não estão disponíveis em disco em runtime — a chamada lançava ENOENT e derrubava a página com "Application error".
2026-02-18 — Fix: incluir arquivos YAML/MD no bundle serverless
next.config.js: adicionadooutputFileTracingIncludespara garantir quedocs/content/,docs/process/,content/blog/,content/taxonomy/eCHANGELOG.mdsejam incluídos no bundle serverless da Vercel. Sem isso,readFile/readFileSyncfalha em produção com ENOENT (arquivos existem localmente mas não são copiados para a lambda).
2026-02-18 — Correção: redirect() fora de try/catch em server action de login
app/admin/login/actions.ts:loginActionrefatorada —redirect()não pode ser chamado dentro detry/catch(Next.js lançaNEXT_REDIRECTinternamente que precisava ser propagado). Agora o try/catch envolve apenasverifyAdminCredentialsecreateAdminSession; as chamadasredirect()ficaram fora do bloco.
2026-02-18 — Acesso à área administrativa
middleware.ts:/admin/loginsempre acessível em produção; demais rotas/admin/**exigem JWT válido — sem JWT retorna 404 (mantém superfície oculta de bots/scanners); removido bloqueio cego viaNODE_ENV === 'production'.components/AdminAccessButton.tsx: botão flutuante discreto (cadeado, bottom-right,z-[9997]) com link para/admin/login— quase invisível por padrão, realça no hover.app/layout.tsx:AdminAccessButtonadicionado ao body.
2026-02-18 — Validação de segurança publicada (pós-deploy)
docs/evidence/security/SECURITY-PROD-SNAPSHOT.md: evidência HTTP real registrada —/admin/**retorna 404 comCache-Control: no-storeeX-Robots-Tag: noindex, nofollow; CSP semunsafe-eval,object-src 'none'ativo;robots.txtcomDisallow: /admin/eDisallow: /portal/callback. Commit validado:a2b3745.
2026-02-18 — Personificação do Sistema (CEO preview mode)
-
lib/auth/impersonation.ts: sessão de personificação via cookie JWT assinado (govevia_impersonation, httpOnly) + cookie de display (govevia_impersonation_info, não-httpOnly para leitura client-side). -
app/admin/impersonate/page.tsx: página admin com picker de persona (Prefeito, Procurador, Controlador, Secretário) + contexto opcional + estado ativo com botão Encerrar. -
app/admin/impersonate/actions.ts: server actionsstartImpersonationActionestopImpersonationAction. -
components/ImpersonationBanner.tsx: banner fixo (bottom) client-side que lê o cookie de display — aparece em todas as páginas sem impactar SSG. -
components/content/ImpersonationAutoSelect.tsx: client component que auto-redireciona para?view=<persona>no blog quando personificação está ativa. -
app/layout.tsx: banner de personificação adicionado ao body. -
app/blog/[slug]/page.tsx:ImpersonationAutoSelectincluído noViewProvider. -
app/admin/page.tsx: dashboard redesenhado com cards de navegação (Conteúdo, Processos, Personificação). -
scripts/verify-changelog-updated.mjs: em ambientes CI (Vercel defineVERCEL_GIT_COMMIT_SHA), o script agora sempre usa o diff commitado em vez de inspecionar a árvore de trabalho. O Vercel modificavercel.jsonna working tree durante o setup do deploy, causando falso positivo no gate.
2026-02-18 — Upgrade Next.js 14.2.28 → 14.2.35
nexteeslint-config-nextatualizados para14.2.35(última patch da série 14.x). A versão14.2.28contém vulnerabilidade de segurança documentada emhttps://nextjs.org/blog/security-update-2025-12-11.
2026-02-18 — Aviso de site em construção
- Home (
/): removidos os dizeres/sections atuais na renderização e incluída mensagem informativa "Estamos em construção".
2026-02-18 — Correção de build (Vercel)
- Build:
js-yamlmovido paradependencies(eradevDependencies) para garantir execução docontent:checknoprebuildem ambientes que omitirem devDeps.
2026-02-18 — Expurgo de logo legado
- Brand: removida qualquer renderização/serving de assets do logo legado (ENV-NEO) do Header/Footer, metadados e OG/Twitter.
- Assets: removidos
public/brand/envneo*eassets/brand/envneo*. - Evidência:
docs/evidence/BRAND-LOGO-DRIFT.md+ screenshotdocs/evidence/assets/logo-fixed.png.
2026-02-18 — Portal pronto para produção (hardening)
- CSP:
unsafe-evalpermitido apenas em desenvolvimento; produção sem dependência deunsafe-eval. - Assets básicos:
/favicon.icopassa a existir (sem 404). - Diagnóstico objetivo:
/api/versionexpõeportalApiBaseHost(host-only) para validar oNEXT_PUBLIC_API_BASE_URLem produção. - Evidência:
docs/evidence/portal/PORTAL-PROD-READINESS.mde runbookdocs/runbooks/RUN-PORTAL-PROD-VALIDATION.md.
2026-02-18 — Higienização anti-placeholder (repo)
- Removidos atributos
placeholderem telas admin para eliminar matches do grep governado. - Adicionado
app/manifest.tse ampliada validação de produção para manifest.
2026-02-18 — Hardening de superfície (admin) + evidência
- Superfície:
/admin/**bloqueado em produção via middleware (responde 404 direto, comCache-Control: no-storeeX-Robots-Tag). - Headers: CSP reforçada com
object-src 'none'. - SEO:
robots.txtpassa a bloquear/admin/e/portal/callback. - Runbook:
docs/runbooks/RUN-SECURITY-PROD-CHECKLIST.md+ template de evidênciadocs/evidence/security/SECURITY-PROD-SNAPSHOT.md.
2026-02-17 — Admin Console (MVP) + hardening
- Fase 1 (DB):
lib/db/schema.sql(idempotente,pgcrypto) elib/db/postgres.ts(server-only, pool singleton viaglobalThis). - Fase 2 (Auth Admin):
/admin/**protegido por middleware Edge (fail-closed) com sessão via cookie HttpOnly (JWT HS256). - Fase 3.1 (Conteúdo): camada
lib/db/content.ts(upsert transacional + revisões) elib/content/getContent.ts(override DB com fallback, published-only, timeout curto). - Fase 3.2 (Admin UI): listagem e editor em
/admin/contentcom validação e sanitização hard-rule no write. - Plataforma: rota
/plataformacom SSOT de personas/capabilities, reordenação pororder[]e URL shareable via?view=(sem HEX, sem fetch externo). - Contato: rota
/contatoadicionada para suportar CTAs internos por persona (/contato?context=<persona>). - Governança: policy, runbooks e evidência pública do auth admin adicionados e registrados no manifesto.
- Enforcement: gate
history:checkexige atualização doCHANGELOG.mdpara qualquer mudança no repo (SSOT do/historico). - Enforcement (robustez CI/PR): base preferencial via
merge-basecomorigin/main(com fallbacks) + evidência pública do gate. - Plataforma (P0-01): reimplementação de
/plataformacom componentes dedicados (PersonaSelector,CapabilitiesMatrix) + SSOT emlib/plataforma/model.tse textos viagetContent()com fallback hardcoded (tokens-only; sem HEX; sem@import; sem fontes externas). - Governança (tokens/diff):
PROJECT-SSOT.md,RUN-SITE-STEPS.md, registries emdocs/registry/+ gatesstage:check,scope:check,content-keys:checke policyPOL-PORTAL-BFF-CORE.md. - Fase 3.3 (Content-First):
docs/content/CONTENT-CATALOG.yaml(SSOT de chaves) + bootstrap “Inicializar Catálogo” no/admin/content+ indicador de completude publicada. - Fase 3.4 (Content-First):
/plataformarefatorada para layout + keys (getContent(..., fallback: '')) e ocultação de blocos/cards vazios; personas/capabilities/axes sem texto hardcoded. - Fase 3.4 (Content-First): Home (
/) refatorada para layout + keys (server loader + props) e ocultação de seções/blocos vazios; zero texto hardcoded nos componentes de Home. - Fase 4.2 (Portal ↔ Core): consumo server-only do read-model público do Core (
/public/v1/portal/brand) com validação (zod), sanitização determinística de SVG (fail-closed) e precedência de override via Admin. - Governança (inventário): inventário governado do Portal (keys + integrações) + gate
portal-inventory:checkanti-drift. - Fase 5.1 (Portal): fundamentos de identidade/consentimento/auditoria (schema idempotente + lib server-only; token hash-only; fail-closed).
- Fase 5.2 (Portal/Admin): módulo de Processos (Processo Piloto 0001 INPI) com catálogo governado no repo + persistência + timeline + enforcement determinístico por passo.
- Fase 5.2 (Portal): login mágico por e-mail (anti-enumeração) + callback + sessão HttpOnly + rate-limit básico (LGPD-min-data).
- Portal (API + JWT):
/portal/loginsolicita link via API externa (envNEXT_PUBLIC_API_BASE_URL),/portal/callbacktroca token por JWT e persiste em cookie HttpOnly,/portalusa Bearer JWT para chamadas protegidas. - Portal (hardening):
/api/portal/loginvirou proxy anti-enum para o Core (sem emissão local de token); client server-only passa Authorization a partir do cookie JWT.
Correções de Segurança
CRÍTICA — XSS no Template de E-mail
app/api/contact/route.ts: Todos os inputs sanitizados viaescapeHtml()antes de interpolação no HTML do e-mail- Adicionada validação de tipo (
typeof) e limites de tamanho (maxLength) em todos os campos - Removidos fallbacks hardcoded de credenciais SMTP — sistema falha explicitamente (503) se variáveis não configuradas
ALTA — Rate Limiting
- Rate limiting em memória mantido para servidor persistente, com cleanup automático (previne memory leak)
middleware.tsadicionado com verificação de Origin em rotas de API (proteção CSRF em edge)- Comentário explícito documentando que deploy serverless exige Upstash Redis/Vercel KV
ALTA — Content-Security-Policy
next.config.js: CSP header adicionado comdefault-src 'self',frame-ancestors 'none',form-action 'self'- HSTS atualizado com
preloaddirective
MÉDIA — CSRF Protection
app/api/contact/route.ts: Verificação deOrigin/Referercontra lista de origens permitidasmiddleware.ts: Segunda camada de verificação de Origin em edge para todas as rotas de API
MÉDIA — Google Fonts / LGPD
- Removido
@importde Google Fonts emglobals.css - Fontes carregadas via
next/font/googleemlayout.tsx— Next.js baixa em build time e serve localmente - Zero requisições a servidores externos durante navegação = conformidade LGPD por design
BAIXA — Atualização de Dependências
next: 14.1.0 → 14.2.28eslint-config-next: 14.1.0 → 14.2.28
Infraestrutura de Blog (Canal #1 de Marketing)
Novos Arquivos
lib/blog.ts— Parser de Markdown com frontmatter (gray-matter), renderização (remark), e tempo de leituraapp/blog/page.tsx— Listagem de publicações com metadata SEOapp/blog/[slug]/page.tsx— Página de artigo com Schema.orgTechArticle, tipografia otimizada, e geração estáticacontent/blog/— Diretório para artigos em Markdown
Artigo Inaugural
content/blog/regras-sem-enforcement-sao-invalidas.md- ~1.500 palavras, indexável para termos: "enforcement normativo", "evidência verificável", "versionamento temporal", "auditoria municipal"
- Tags: Enforcement Normativo, Governança Digital, Tribunais de Contas, Conformidade Municipal
Dependências Adicionadas
gray-matter— Parse de frontmatter YAML em Markdownremark+remark-html— Renderização de Markdown para HTMLreading-time— Cálculo de tempo de leitura@tailwindcss/typography— Classesprosepara tipografia de artigos
Conformidade LGPD
Cookie Consent
components/CookieConsent.tsx— Banner discreto (bottom bar, não modal) com opções Aceitar/Rejeitar- Integrado em
layout.tsx— presente em todas as páginas - Persistência via
localStorage
Paleta Institucional
Cores
- Primário:
#1E80FF(azul elétrico) →#0A3D7A(azul-marinho institucional) - Antigo azul elétrico mantido como
primary-lightpara acentos - Orange accent → Gold accent (
#B8860B) — mais alinhado com referências TCU/Banco Mundial - Navy aprofundado:
#1a2332→#0C1B2E
Tipografia
- Títulos: Montserrat → Playfair Display (serif, gravitas institucional)
- Corpo: Open Sans → Source Sans 3 (sans-serif refinado)
- Carregamento via
next/font(self-hosted, zero requisições externas)
Schema.org Estruturado
layout.tsx: JSON-LD comOrganization,SoftwareApplication, eWebSiteapp/blog/[slug]/page.tsx: JSON-LD comTechArticlepor artigo
Navegação
- Header e Footer atualizados com link "Publicações" para
/blog - Sitemap atualizado com rota
/blog
Como Usar
tar -xzf govevia-site-v2.tar.gz
cd govevia-site-v2
npm install
cp .env.example .env.local
# Editar .env.local com credenciais SMTP reais
npm run dev
Publicar Novo Artigo
- Criar arquivo
.mdemcontent/blog/ - Adicionar frontmatter (title, date, description, author, tags)
- Escrever conteúdo em Markdown
- Build/deploy — página gerada estaticamente