Histórico de Atualizações

Este histórico é gerado a partir do CHANGELOG.md versionado no repositório.

Atualizado em (UTC): 2026-04-26T21:46:42.605Z
Ver versão do deploy (/api/version)

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; next fixado em 15.5.12; adiciona @vercel/speed-insights@1.3.1; mantém @upstash/ratelimit e @upstash/redis.
  • fix(deps): package-lock.json — regenerado via npm install após correção do package.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 único az 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, timezone America/Sao_Paulo, databases govevia e envneo_internal (collation pt_BR.utf8).
  • feat(iac): infra/modules/container-registry.bicep — ACR Basic acrgoveviaprod, 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 assignment Key Vault Secrets User, health/readiness probes em /health e /ready, HTTP scaling rule (100 req concorrentes), ingress externo/interno configurável.
  • feat(iac): infra/params/prod.bicepparam — valores de produção (region brazilsouth, SKUs, nomes de recurso); dbAdminPassword intencionalmente 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), suporta DRY_RUN=1 (what-if), captura outputs, atribui role AcrPull pó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 pendente www.govevia.com.brgovevia.com.br (apex canônico); adiciona comentário de transição nos redirects envneo.com.br → govevia.com.br (a serem removidos quando envneo tiver site independente).
  • fix(perf): vercel.json — adiciona headers Cache-Control: immutable para /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 quando GOVEVIA_CORE_URL não está configurado no Vercel; agora verifica NEXT_PUBLIC_CORE_ENABLED antes de fazer fetch: se não for 'true', vai direto ao mock sem gerar requisição HTTP. Também trata resposta CORE_NOT_CONFIGURED sem 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 com logSecurity em 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.lock e package-lock.json já 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.tsx entre 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; remove username do payload do evento de governança.
  • security(L6): app/api/version/route.ts — retorna 404 em VERCEL_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 de role="alert" nos 5 campos de validação: substituído por aria-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 — remove buildCspValue() com 'unsafe-inline' e origens GTM/GA4 não usadas; Content-Security-Policy agora emitida exclusivamente pelo middleware com nonce por request. Expande Permissions-Policy com payment=(), usb=(), serial=(), bluetooth=(), document-domain=(), interest-cohort=().
    • next.config.js
  • security(L3): nodemailer — validação de domínio do destinatário antes de transporter.sendMail(): domínio de mailOptions.to deve coincidir com SMTP_USER ou ENVNEO_EMAIL; retorna 503 e loga requestId se falhar (GHSA-mm7p mitigation).
    • app/api/contact/route.ts
  • a11y(L5): ContactForm — todos os 5 campos com aria-invalid, aria-describedby e role="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 por gap-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/searchParams para Promise<T> — Next.js 15 exige acesso assíncrono; seis rotas corrigidas:
    • app/[slug]/page.tsx, app/blog/[slug]/page.tsx, app/contato/page.tsx
    • app/plataforma/page.tsx, app/plataforma/[persona]/page.tsx
    • app/plataforma/[persona]/opengraph-image.tsx, app/plataforma/[persona]/twitter-image.tsx
    • app/api/calendar/[token]/route.ts, app/api/core/[...path]/route.ts
  • fix(prerender): app/arquitetura/page.tsx — adicionado export 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 CSP font-src 'self'.
    • app/layout.tsx: imports IBM_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 :root removidas
  • feat(ux): Skeleton de carregamento no ModulesCarousel — 4 cards animate-pulse exibidos 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-1 adicionado 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-primary azul.
    • components/home/Problem.tsx: bg-zinc-950 (ritmo visual), border-amber-400/60, ícone amber, quote box amber
    • components/home/Platform.tsx: ícone amber, badge amber, hover amber, CTA amber com shadow, modal (tagline/valor/prefix) amber
    • components/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-subtitle usa text-slate-300 em vez de text-gray-300
    • app/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: ModulesCarousel movido do topo para após Defensibility (antes de Contact).

[2.20.14] - 2026-02-27

  • fix(plataforma): Card colapsado de persona simplificado — apenas p.label, sem ícone, role ou org. Import ORGANIZATIONS removido.
    • 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 por flex-wrap.
    • components/plataforma/PlataformaView.client.tsx
  • fix(plataforma): Seção #anatomia removida; state activeStep, activeFlow useMemo, IntersectionObserver effect e imports de FLOW_STEPS / GovernanceProof eliminados.
    • components/plataforma/PlataformaView.client.tsx
  • fix(header): Menu suspenso (dropdown) removido; nav items com panels agora renderizam como links diretos.
    • components/Header.client.tsx: remove PanelGroups, 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 de app/contato/page.tsx.
  • fix(contato): Parâmetro ?context=editor_oficial agora exibe badge com label e cargo da persona em vez do ID bruto.
    • components/home/Contact.tsx: importa PERSONAS; renderiza badge amber com p.label + p.role quando formContext é uma PersonaId vá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: personaPickerExpanded inicializado como initialView === null em vez de true fixo — garante que remount por router.push preserve 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: estado personaPickerExpanded; 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 recebe id="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-primary substituí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 de Hero, GOVEVIA_SLOGAN e refUrl removidos.

[2.20.4] - 2026-02-27

  • fix(nav): Link "Ver plataforma completa →" no dropdown de Plataforma substituído por botão btn-primary com texto "Ver Detalhes da Plataforma".
    • components/Header.client.tsx: className e 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 constante ENVNEO_HOLDING_URL = 'https://www.envneo.com.br' e exposta via ENVNEO_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 para ENVNEO_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ógica isPreview = VERCEL_ENV === 'preview' por isVercel = !!process.env.VERCEL, que é verdadeiro em todos os deployments Vercel (preview + production). vercelLive = isDev || isVercel.
    • script-src: https://vercel.live agora sempre presente em qualquer deploy Vercel (corrige _next-live/feedback/feedback.js).
    • font-src: adicionado https://r2cdn.perplexity.ai condicionalmente quando isVercel (fonte FKGroteskNeue.woff2 usada 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ído grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 por 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 fixa w-[340px]; animation-play-state: paused no hover; máscaras de fade laterais com gradiente from-zinc-950.

[2.20.0] - 2026-02-23

  • feat(plataforma): Página /plataforma atualizada para suportar 12 personas com visão filtrada por cargo.
    • app/plataforma/page.tsx: adicionados vereador, presidente_camara, comissao_legislativa, agente_legislativo, arquivista e editor_oficial à lista válida de parseInitialView; 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 para sm: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 onde cap.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 array items={[...]} do componente Platform, causando SWC parse error: Expression expected.

    • lib/calendar/domain-registry.ts: substituídos 'localhost:3000' e 'localhost:3001' hardcoded por template literals com process.env.DEV_PORT e process.env.CEO_CONSOLE_PORT (gate-no-hardcoded-endpoints).

    • lib/plataforma/pessoa.ts: adicionada const WAIVER_ACTIVE com 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ção addDays definida mas nunca utilizada (@typescript-eslint/no-unused-vars bloqueava ESLint do Next.js).

[2.19.0] - 2026-02-23

  • fix(gate): Corrigidas 17 ocorrências de "Env Neo" isolado em lib/calendar/domain-registry.ts, lib/calendar/tenant-calendar.ts, lib/calendar/persona-groups.ts e lib/plataforma/pessoa.ts. gate-no-envneo-shortname passou 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 por publishDate === hoje, verifica state em .linkedin-published.json para evitar double-posting, POST via ugcPosts com link preview de artigo, salva state após publicação. Suporta DRY_RUN=true para 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_dispatch para disparo manual, git-auto-commit-action para persistir o state após publicação com [skip ci].
    • npm run linkedin:publish e npm run linkedin:dry-run adicionados ao package.json.
    • Secrets necessários para ativar: LINKEDIN_ACCESS_TOKEN + LINKEDIN_AUTHOR_URN no 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 array ICONS.
    • 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-endpoints em lib/calendar/institutional-events.ts — 11 URLs do Planalto substituídas por constantes via refUrl(). Adicionado lei-8159 (Lei 8.159/91) em lib/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:dryrun e npm run tenant:smoke adicionados ao package.json.
    • [Verificação]: Dry-run concluído com sucesso para o tenant montes-claras em ambiente local.
  • feat(middleware): Suporte a maintenance_mode via TENANT_MAINTENANCE_SLUGS (env var Vercel, slugs separados por vírgula). Middleware retorna HTTP 503 + Retry-After: 900 para o tenant específico durante a Fase 3 (cutover), sem afetar outros tenants.

  • fix(esic): Removido import useEffect não utilizado de EsicOuvidoria.client.tsx — corrige erro ESLint @typescript-eslint/no-unused-vars que bloqueava o build.

[2.15.0] - 2026-02-23

  • Módulo E-SIC / Ouvidoria (esic_ouvidoria): Novo componente EsicOuvidoria.client.tsx com 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). Personas cidadao e controlador passam a tê-la como evidência prioritária; procurador como evidência secundária.
  • Wire por persona: Componente E-SIC renderizado condicionalmente em PlataformaView via persona.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) e decreto-7724 (Decreto 7.724/2012 — Regulamento da LAI) em lib/legal/legal-references.ts. Union type category extendido 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 /plataforma convertido para carrossel horizontal com snap scroll no mobile (< sm). Cards com largura 78vw e snap-center revelam 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 do Hero.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/token com x-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 cookie HttpOnly gerado 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: Endpoint POST protegido 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 /sobre exibe 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-legal distinguindo 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_STEPS com 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.tsx integrado ao PlataformaView (Row 2b) com visualização animada do fluxo SHA-256, assinatura ICP-Brasil e encadeamento imutável.
  • Seal de Integridade Integrado: Componente IntegritySeal.client.tsx integrado ao PlataformaView (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.ts para geração dinâmica de metadados hiper-localizados para todos os 5.570+ municípios.
  • Sitemap Dinâmico: Otimização do app/sitemap.ts com 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.ts for 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 OrgLayer component 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/contact para 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.tsx com 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_SLOGAN e GOVEVIA_TAGLINE em app/layout.tsx, app/page.tsx, app/blog/page.tsx e components/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.md para refletir o novo status legal do slogan.

2026-02-23 — feat(analytics): Vercel Speed Insights Integration 📊

  • Speed Insights: Integrado @vercel/speed-insights no 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) para amber (rgb 251 191 36).
  • Refatoração de Layout: Simplificação do PlatformLayout.tsx e centralização da lógica reativa no PlataformaView.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.ts para 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 --headed com slowMo: 400ms para execuções observáveis e auditoria visual dos fluxos críticos de governança.
  • Cobertura E2E: Criadas specs para homepage, persona-navigation e compliance-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 ComplianceAlert para 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.md com 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 PersonaMetrics que 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.md para 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.md com 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_events para 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_events com proteção de integridade via Hash-Chain SHA-256 e imutabilidade via RLS (Append-only).
  • Core Governance: Implementada utilidade emitGovernanceEvent baseada em pg para registro auditável de ações críticas.
  • CEO Console (Admin): Criada a base do console administrativo em apps/ceo-console com 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 gate gate-no-admin-in-site-public.
  • Eventos de Login: Integrado o registro de admin.login no endpoint de autenticação.
  • Gestão de Projeto: Atualizados STATUS.md e CEO-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 /sobre atualizado 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 Java LegalDeviceResponse (record: id, label, content, urnLex, status, effectiveStart, effectiveEnd). Inclui tipo normalizado NormaLegal, adaptadores fromKernelDevice() e fromStaticNorma() e payload LegalDevicesPayload.
  • app/api/core/leis/route.ts — BFF Route Handler GET /api/core/leis com:
    • Tentativa primária: GET ${KERNEL_API_URL}/public/v1/portal/legislation com Authorization: Bearer ${KERNEL_SERVICE_TOKEN} (revalidate 1h).
    • Fallback: content/normas-legais.json adaptado via fromStaticNorma().
    • Parâmetros de query: esfera, status (default ativa), q (busca textual).
  • 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-legal com metadata SEO, hero e componente LegalDevicesSection.
  • 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:

  1. GET /public/v1/portal/legislation em PortalPublicController servindo LegalDeviceResponse[]
  2. .requestMatchers("/public/**").permitAll() em SecurityConfig
  3. govevia.com.br e *.vercel.app nos allowedOrigins do 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.tsx como ú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 a section-title e h1-h6 do 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" />. Prop productName removida (desnecessária).
  • Header.tsx: prop productName removida. Import GOVEVIA_PRODUCT_NAME removido.
  • Footer.tsx: wordmark font-serif substituído por <BrandWordmark size="sm" />.
  • GoveviaMarkSvg agora é usado exclusivamente dentro de BrandWordmark — 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ão btn-primary desktop e mobile removidos — link /contato já 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 /sobre removido 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 único bg-white/5 rounded-lg border, com <hr className="border-white/10"> como divisor interno.
  • Texto do WhatsApp corrigido de text-gray-200text-slate-200 (coesão de tokens).

2026-02-21 — fix(seo): redirects 301 canônicos para govevia.com.br

  • next.config.js: adicionado redirects() com 3 regras permanent: 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.comwww.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 classes max-h-0 opacity-0 group-hover:max-h-40 group-hover:opacity-100 overflow-hidden transition-all.
  • Removidas classes group e hover:bg-white/10 transition-all do card (efeito de expansão eliminnado).

2026-02-21 — fix(hero): remoção do indicador de scroll (seta animada)

  • Removido bloco "Scroll Indicator" (motion.div com seta animate-bounce e âncora #problema) de components/home/Hero.tsx.
  • Removida prop scrollLabel do tipo Props e da assinatura do componente.
  • Removida prop scrollLabel="Conheça mais" da chamada em app/page.tsx.

2026-02-21 — fix(nav): coesão entre menu superior e rodapé

  • Footer.tsx: navegação principal sincronizada com Header.tsx — "Publicações" agora renderiza condicionalmente, via getAllPosts(), idêntico ao comportamento do header.
  • CTA do rodapé: label unificado para "Fale com nossa equipe" (igualando o header); link corrigido de #contato para /contato.
  • Header.client.tsx: CTAs desktop e mobile corrigidos de #contato para /contato, garantindo roteamento correto em qualquer página.

2026-02-21 — feat(plataforma): Persona-specific SEO Media & Navigation Fixes

  • SEO Media: Criados opengraph-image.tsx e twitter-image.tsx dedicados em app/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.ts atualizado para incluir dinamicamente todas as rotas de persona, melhorando a indexação granular por perfil.
  • UX: app/plataforma/page.tsx agora redireciona para /plataforma/prefeito por padrão, garantindo que o usuário sempre caia em uma rota de persona indexável e com metadados completos.
  • Analytics: Integrado @vercel/analytics em PlataformaView.client.tsx para rastrear acessos diretos e trocas de persona, possibilitando segmentação de interesse por perfil.
  • Navegação: Refatorada lógica de setView em PlataformaView.client.tsx para 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.tsx atualizado para usar router.push('/plataforma/[persona]') em vez de query params, proporcionando URLs limpas.
  • Performance: Uso de generateStaticParams para 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.tsx e /plataforma para 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_SLUGS convertido de array 2D para flat array.
  • Zero strings hardcoded — tudo via ENVNEO_BRAND e LEGAL_REFERENCES.

2026-02-21 — feat(brand): favicon dinâmico com marca Govevia

  • Substituído app/icon.png (estático, fundo branco) por app/icon.tsx (gerado via ImageResponse). 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.ts adicionado ao allowlist do gate gate-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[] para Array<{ label, url }> — mesmo padrão de links.
  • Footer "Conformidade Regulatória": 6 URLs hardcoded substituídas por lookup em LEGAL_REFERENCES via FOOTER_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_NAME era literal 'Env Neo' — violava gate gate-no-envneo-shortname. Agora derivado de ENVNEO_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/ops ajustado para não exibir “EnvNeo” como nome.
  • Enforcement: novo gate gate-docs-brand-legal impede regressão (proíbe "EnvLive" em docs/ e placeholders [CNPJ]/[RAZÃO SOCIAL]).
  • Build: correção de lint (variáveis não usadas) em lib/rules/engine.ts para liberar next build.
  • Conteúdo: correção de frontmatter YAML inválido em content/blog/ia-em-governo-nao-pode-ser-caixa-preta.mdx (linhas coladas author/draft/tags).
  • Refinamento: envneo/ops/CEO-QUEUE.yaml atualizado (itens concluídos movidos para done; WIP limpo) e índice/status em docs/INDEX.md + docs/STATUS.md alinhados ao payload atual.
  • Fix: site-public passa a tratar /admin e /admin/login como entrypoint seguro (redirect/página informativa) para o CEO Console, mantendo demais /admin/* fechados com 404.
  • Refinamento: página informativa de /admin/login ajustada (copy mais neutra/profissional) e PRESENT-CEO-CONSOLE explicita URLs locais do CEO Console (porta 3001).
  • Fix(build): removido next/font/google (evita fetch de woff2 em fonts.gstatic.com durante build no Vercel); fontes agora via stack local/system em CSS vars (--font-plex-*).
  • Enforcement: redirect de /admin/login no site público virou governado (pré-check em /api/healthz do CEO Console; se indisponível responde 503 com correlation id). Gate gate-ceo-console-health bloqueia deploy quando CEO_CONSOLE_BASE_URL está 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/login via 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 como operating_model.

2026-02-18 — Feat: nav dinâmico — itens sem conteúdo publicado não são exibidos

  • lib/blog.ts: adicionado campo draft: boolean em BlogPost e BlogPostMeta; getAllPosts() aceita { includeDrafts } e filtra rascunhos por padrão.
  • content/blog/*.mdx: ambos os posts marcados como draft: true — "Publicações" some do menu enquanto não houver posts publicados.
  • components/Header.tsx: conta posts publicados (getAllPosts()) e monta array navigation dinamicamente — item "Publicações" só é incluído se publishedPostCount > 0.
  • components/Header.client.tsx: navigation deixa de ser hardcoded; recebido como prop do servidor.
  • app/blog/[slug]/page.tsx: generateStaticParams exclui drafts; página retorna 404 para posts com draft: true acessados 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ém normalizeLegalEntityName() (antes duplicada em Header e Footer).
  • components/Header.tsx: remove normalizeLegalEntityName local; importa do SSOT.
  • components/Footer.tsx: remove normalizeLegalEntityName local e strings hardcoded (e-mail, endereço, CNPJ, tagline, descrição); importa ENVNEO_BRAND do SSOT.
  • lib/core/portalBrand.ts: fallback local aponta para ENVNEO_LEGAL_ENTITY_NAME e GOVEVIA_PRODUCT_NAME do SSOT.
  • lib/blog.ts: autor padrão dos posts importa ENVNEO_LEGAL_ENTITY_NAME do 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õe functional, normative, enforcement, legalBasis, technicalFeatures e iconPaths. Alterar aqui reflete automaticamente em qualquer consumidor do site.

  • components/platform/ModulesDetail.tsx: removido array local de 175 linhas hardcoded; agora importa MODULES de @/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, eliminando fs.readFileSync sobre YAMLs em /admin/impersonate e startImpersonationAction. 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: adicionado outputFileTracingIncludes para garantir que docs/content/, docs/process/, content/blog/, content/taxonomy/ e CHANGELOG.md sejam incluídos no bundle serverless da Vercel. Sem isso, readFile/readFileSync falha 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: loginAction refatorada — redirect() não pode ser chamado dentro de try/catch (Next.js lança NEXT_REDIRECT internamente que precisava ser propagado). Agora o try/catch envolve apenas verifyAdminCredentials e createAdminSession; as chamadas redirect() ficaram fora do bloco.

2026-02-18 — Acesso à área administrativa

  • middleware.ts: /admin/login sempre 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 via NODE_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: AdminAccessButton adicionado 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 com Cache-Control: no-store e X-Robots-Tag: noindex, nofollow; CSP sem unsafe-eval, object-src 'none' ativo; robots.txt com Disallow: /admin/ e Disallow: /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 actions startImpersonationAction e stopImpersonationAction.

  • 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: ImpersonationAutoSelect incluído no ViewProvider.

  • 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 define VERCEL_GIT_COMMIT_SHA), o script agora sempre usa o diff commitado em vez de inspecionar a árvore de trabalho. O Vercel modifica vercel.json na working tree durante o setup do deploy, causando falso positivo no gate.

2026-02-18 — Upgrade Next.js 14.2.28 → 14.2.35

  • next e eslint-config-next atualizados para 14.2.35 (última patch da série 14.x). A versão 14.2.28 contém vulnerabilidade de segurança documentada em https://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-yaml movido para dependencies (era devDependencies) para garantir execução do content:check no prebuild em 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* e assets/brand/envneo*.
  • Evidência: docs/evidence/BRAND-LOGO-DRIFT.md + screenshot docs/evidence/assets/logo-fixed.png.

2026-02-18 — Portal pronto para produção (hardening)

  • CSP: unsafe-eval permitido apenas em desenvolvimento; produção sem dependência de unsafe-eval.
  • Assets básicos: /favicon.ico passa a existir (sem 404).
  • Diagnóstico objetivo: /api/version expõe portalApiBaseHost (host-only) para validar o NEXT_PUBLIC_API_BASE_URL em produção.
  • Evidência: docs/evidence/portal/PORTAL-PROD-READINESS.md e runbook docs/runbooks/RUN-PORTAL-PROD-VALIDATION.md.

2026-02-18 — Higienização anti-placeholder (repo)

  • Removidos atributos placeholder em telas admin para eliminar matches do grep governado.
  • Adicionado app/manifest.ts e 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, com Cache-Control: no-store e X-Robots-Tag).
  • Headers: CSP reforçada com object-src 'none'.
  • SEO: robots.txt passa a bloquear /admin/ e /portal/callback.
  • Runbook: docs/runbooks/RUN-SECURITY-PROD-CHECKLIST.md + template de evidência docs/evidence/security/SECURITY-PROD-SNAPSHOT.md.

2026-02-17 — Admin Console (MVP) + hardening

  • Fase 1 (DB): lib/db/schema.sql (idempotente, pgcrypto) e lib/db/postgres.ts (server-only, pool singleton via globalThis).
  • 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) e lib/content/getContent.ts (override DB com fallback, published-only, timeout curto).
  • Fase 3.2 (Admin UI): listagem e editor em /admin/content com validação e sanitização hard-rule no write.
  • Plataforma: rota /plataforma com SSOT de personas/capabilities, reordenação por order[] e URL shareable via ?view= (sem HEX, sem fetch externo).
  • Contato: rota /contato adicionada 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:check exige atualização do CHANGELOG.md para qualquer mudança no repo (SSOT do /historico).
  • Enforcement (robustez CI/PR): base preferencial via merge-base com origin/main (com fallbacks) + evidência pública do gate.
  • Plataforma (P0-01): reimplementação de /plataforma com componentes dedicados (PersonaSelector, CapabilitiesMatrix) + SSOT em lib/plataforma/model.ts e textos via getContent() com fallback hardcoded (tokens-only; sem HEX; sem @import; sem fontes externas).
  • Governança (tokens/diff): PROJECT-SSOT.md, RUN-SITE-STEPS.md, registries em docs/registry/ + gates stage:check, scope:check, content-keys:check e policy POL-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): /plataforma refatorada 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:check anti-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/login solicita link via API externa (env NEXT_PUBLIC_API_BASE_URL), /portal/callback troca token por JWT e persiste em cookie HttpOnly, /portal usa Bearer JWT para chamadas protegidas.
  • Portal (hardening): /api/portal/login virou 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 via escapeHtml() 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.ts adicionado 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 com default-src 'self', frame-ancestors 'none', form-action 'self'
  • HSTS atualizado com preload directive

MÉDIA — CSRF Protection

  • app/api/contact/route.ts: Verificação de Origin/Referer contra lista de origens permitidas
  • middleware.ts: Segunda camada de verificação de Origin em edge para todas as rotas de API

MÉDIA — Google Fonts / LGPD

  • Removido @import de Google Fonts em globals.css
  • Fontes carregadas via next/font/google em layout.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.28
  • eslint-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 leitura
  • app/blog/page.tsx — Listagem de publicações com metadata SEO
  • app/blog/[slug]/page.tsx — Página de artigo com Schema.org TechArticle, tipografia otimizada, e geração estática
  • content/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 Markdown
  • remark + remark-html — Renderização de Markdown para HTML
  • reading-time — Cálculo de tempo de leitura
  • @tailwindcss/typography — Classes prose para 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-light para 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 com Organization, SoftwareApplication, e WebSite
  • app/blog/[slug]/page.tsx: JSON-LD com TechArticle por 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

  1. Criar arquivo .md em content/blog/
  2. Adicionar frontmatter (title, date, description, author, tags)
  3. Escrever conteúdo em Markdown
  4. Build/deploy — página gerada estaticamente