60 KiB
Estado actual da evolução do simulador — 2026-10-03
Este quadro reconcilia o resumo histórico de simulator-evolution-progress.md com as adendas posteriores. É o estado técnico proposto para revisão; não altera gates humanos nem declara aprovação fiscal ou contabilística.
| Etapa | Estado actual | Evidência disponível | Pendências que impedem conclusão |
|---|---|---|---|
| 0 — diagnóstico | Concluída tecnicamente | Arquitectura, rotas, stack, CI, API e suites inventariados no ledger. | Revisão e aceitação de produto. |
| 1 — contratos | Concluída tecnicamente | Guards runtime e testes cobrem criação/polling/leitura, histórico, drafts/conversão e contratos de questionário, relatório, jobs e erros; OpenAPI tipado; testes PHP confirmam respostas API e round-trip entre snapshot/relatório persistidos e resposta. | Endpoints de questionário, jobs e relatório não são consumidos pela interface actual; se futuramente forem integrados, ligar então os guards existentes. |
| 2 — formulário público | Parcial | Percursos por perfil, página/menu públicos, validação, modo avançado, privacidade anónima e navegação por teclado; Edge CDP verificou 390/768/1024/1440 px, foco em 12 destinos nomeados/visíveis, zero controlos sem nome/overflow e GET /api/v1/simulation-drafts/current 200 no PostgreSQL/PostGIS QA. Evidência: relatório browser, script reutilizável. |
Testes com leitor de ecrã e dispositivo físico, validação manual do percurso e revisão de produto. O smoke test não calcula nem testa submissões de escrita. |
| 3 — calculadoras | Parcial, educativas | Orçamento, break-even, financiamento e amortização; testes exactos cobrem juros zero, taxas nominais/efectivas, carência, comissões, reconciliação em cêntimos e última prestação. | Modelo não é oferta de credor; revisão financeira institucional e cobertura de necessidades pessoais mais ampla. |
| 4 — fontes/governação | Parcial; gate humano pendente | Texto do BR 248 e republicação da Lei 22/2022 arquivados/revistos; ciclo de governação de regras implementado. A taxa geral de IVA de 16% está confirmada no art. 17(1) da republicação oficial. | Regulamentos anunciados de 2026, regras por âmbito/vigência, INSS, pauta integral, revisão e aprovação formal do Fiscalista. INM encaminha BR 186/187 para a Loja; as fichas abertas não expõem o conteúdo. |
| 5 — motor fiscal | Infraestrutura interna parcial; cálculo público bloqueado | DSL whitelist/DAG, aritmética racional, arredondamento explícito, resolvedor de parâmetros por período/contexto e governação versionada; testes focados 9/9 + 4/4. | Integração com RunSimulation e snapshot explicável, fontes oficiais autenticadas, arredondamento aprovado por componente e casos golden revistos por Fiscalista. |
| 6 — plano financeiro | Parcial, implementado em grande parte | Plano empresarial v1–v17; calendário de pagamentos de passivos de abertura, com saldo final exposto; versões anteriores legíveis. Suite financeira/frontend verde. | Validação contabilística institucional e incumprimento/fornecedores partilhados não modelados. |
| 7 — ponte financeira/fiscal | Parcial | Ponte financeira por mês; tesouraria aceita imposto fixo ou calendário variável por pressuposto do utilizador, mantém meses ausentes indeterminados e separa créditos/pedidos/reconhecimentos IVA do caixa. Suite de calendário 11/11. | Calendário local não persistido; classificação de dedutibilidade e regras fiscais aprovadas continuam pendentes. |
| 8 — resultados/exportação | Concluída tecnicamente para CSV; validação global parcial | Ecrã/CSV reconciliam snapshots e hashes; calculadoras, tesouraria, plano e resultado aritmético têm CSV. PDF não é requisito desta etapa no anexo. | Revisão assistiva manual e gates institucionais continuam pendentes. |
| 9 — conta/Project/CRM | Parcial | Histórico paginado autenticado, isolamento, consentimento, optimistic locking e conversão escolhida para rascunho cifrado, com versão/hash e deduplicação. | Não submete/cria projecto no CRM; teste de integração e revisão assistiva do fluxo real pendentes. |
| 10 — incentivos/extensões | Parcial informativa/territorial; benefícios e cálculos regulados desactivados | Zonas públicas exigem fonte vigente, registos validados, relações/geo revistas; interface esclarece que zona não atribui benefício/licença/autorização. InvestmentZoneTest 6/6, 104 asserções. | Inventário validado por domínio; fontes oficiais/autenticidade; regras fiscais/aduaneiras/cambiais e aprovação competente; revisão de produto/browser. |
| 11 — verificação/entrega | Parcial | Regressão PHP integral 253/253 (2.590 asserções), frontend 119/119, TypeScript, PHPStan 0 erros, build Vite 2.397 módulos; testes de zonas 6/6. | Revisão manual com leitor de ecrã/dispositivo, aprovação de produto e gates fiscais/jurídicos. |
Reconciliação actual das etapas — 2026-10-03
A tabela histórica abaixo é complementada e, para totais/estado técnico, substituída por esta reconciliação mais recente.
| Etapa | Estado actual | Gate/pendência principal |
|---|---|---|
| 0 | Concluída tecnicamente | Revisão de produto. |
| 1 — contratos | Concluída tecnicamente | Round-trip API/persistência verificado nos testes de execução e relatório; conversão/retoma cobertas pelos testes de drafts; guards de respostas consumidas e contratos dos endpoints ainda não consumidos estão testados. Gate global permanece independente. |
| 2 | Parcial | Leitor de ecrã/dispositivo físico e revisão manual após modo fiscal personalizado. |
| 3 | Parcial, educativa | Revisão financeira institucional. |
| 4 | Parcial; fontes legais pendentes | Texto oficial completo dos BR 186/187 e aprovação Fiscalista. |
| 5 — motor fiscal | Infraestrutura interna parcial; cálculo público bloqueado | DSL whitelist/DAG, aritmética racional, arredondamento explícito, resolvedor de parâmetros por período/contexto e governação versionada; testes focados 9/9 + 4/4. |
| 6–7 | Parciais | Plano v17 reconcilia pagamentos de passivos de abertura; ponte mantém matéria colectável indeterminada sem regra fiscal aprovada. Validação institucional/fornecedores partilhados pendentes. |
| 8 — resultados/exportação | Concluída tecnicamente para CSV; validação global parcial | CSV/ecrã reconciliam; PDF não está no escopo do anexo. Revisão assistiva e gates institucionais continuam pendentes. |
| 9 | Parcial | Resultado concluído mantém manifestação pública independente em /manifestar-interesse, sem partilhar a simulação; conversão consentida para rascunho continua separada. Integração/criação de Project e CRM e revisão assistiva continuam pendentes. |
| 10 — incentivos/extensões | Parcial informativa/territorial; benefícios e cálculos regulados desactivados | Zonas públicas exigem fonte vigente, registos validados, relações/geo revistas; interface esclarece que zona não atribui benefício/licença/autorização. InvestmentZoneTest 6/6, 104 asserções. |
| 11 — verificação/entrega | Parcial | Regressão PHP integral 253/253 (2.590 asserções), frontend 119/119, TypeScript, PHPStan 0 erros, build Vite 2.397 módulos; testes de zonas 6/6. |
Evidência global mais recente: PHP 253/253 (2.590 asserções) na última suite QA registada; frontend 124/124, TypeScript, PHPStan (0 erros) na suite QA registada, e build Vite (2.397 módulos) passaram. Esta tranche repetiu frontend/TypeScript/build, mas não a suite PHP. Smoke Edge QA passou. PostgreSQL QA/55441 parado; nenhuma regra fiscal activada.
Decisões e limites actuais
- IVA: a divergência legal 16%/17% fica resolvida ao nível textual pela republicação oficial da Lei 22/2022, art. 17(1); páginas informativas da AT que dizem 17% estão desactualizadas. Isto não aprova regimes, incidência, deduções, reembolsos, regras regulamentares de 2026 nem parâmetros de produção.
- BR 186/187: metadados e datas confirmados no catálogo INM. A íntegra não foi obtida; não se inferem diplomas, artigos ou vigência a partir do comunicado do Governo.
- Microfinanças: calculadora de empréstimos permanece educativa e separada do registo de operadores. Não concede crédito, capta depósitos ou sugere autorização.
- Activação: nenhuma regra fiscal, incentivo ou pauta aduaneira está activada pelo simulador. Não houve publicação em produção nem integração externa nesta sequência.
- Testes após alterações: as suites focadas recentes passaram (empréstimos 12/12; tesouraria 6/6; relatório aritmético 19/19), e a suite frontend completa passou 98/98. O build actual passou com aviso informativo de dependência opcional
fontaine. O GET de rascunho foi lido em QA e respondeu 200; nenhum cálculo/submissão foi criado pelo browser audit.
Evidências documentais relacionadas
- Matriz do texto primário 2025–2026
- Revisão da reforma fiscal 2026
- Registo de fontes oficiais e lacunas
- Contratos de dados do simulador
- Lei 22/2022 republicada — PDF arquivado
- BR 248, suplemento de 2025 — PDF arquivado
- Auditoria automatizada da UI em Edge headless
- Script de smoke test da UI e foco por teclado
Próxima acção
Prosseguir testes/validação financeira independente e revisão manual de acessibilidade quando houver browser/leitor de ecrã/dispositivo disponível. Para os gates fiscais, obter legalmente os textos integrais dos BR 186/187, reconciliar os regulamentos e encaminhar a matriz para aprovação identificável do Fiscalista. Não activar regras antes desses passos.
Validação adicional da Etapa 2/11 — cálculo anónimo no browser (2026-10-03)
- Edge headless percorreu o formulário público, escolheu “Apenas simular”, período 2026 e contexto de componente INSS, introduziu base 1000, taxa hipotética 10% e redução hipotética 50%, recebeu POST 202 da API e leu o estado concluído com resultado aritmético
50.000…. A página preservou o aviso de que o resultado não determina taxas, elegibilidade ou obrigação fiscal; não apresentou alertas nem excepções JS. - O ensaio QA validou ainda o autosave anónimo: GET corrente 200, POST de rascunho 201, sem resposta API falhada. A suite confirmou
personal_snapshot=[]no armazenamento/retoma anónimos. Dados de ensaio foram criados apenas na base PostgreSQL QA isoladainvestmoz_browser_e2ena porta 55441; a base de teste foi reposta pela suite e ficou sem simulações nem rascunhos após os testes. - Corrigi o contrato do autosave: arrays pessoais vazios passam a ser aceites quando presentes, e a política do servidor continua a substituir qualquer conteúdo pessoal por array vazio para sessões anónimas. Corrigi também a apresentação de estados internos (
queued,running,completed,failed) para rótulos em português. - Evidência:
php vendor/bin/phpunit --filter SimulationFormDraftTestpassou 9/9 testes e 67 asserções eminvestmoz_browser_e2e;node --test tests/frontend/*.test.mjspassou 98/98;npm.cmd run types:check,npm.cmd run build(2.388 módulos),npm.cmd run checkdirigido, Pint dirigido,node --checkegit diff --checkpassaram. O relatório browser está emsimulator-calculation-browser-2026-10-03.json. - Limitação/incidente: as primeiras tentativas usaram
php artisan serve; o processo filho não ficou comprovadamente ligado à base QA e os resultados não apareceram nessa base. Como.envlocal aponta parainvestemozna porta 5432, duas execuções podem ter sido gravadas nessa base. Não consultei nem apaguei a base da porta 5432. UUIDs observados:809071e6-5aaf-4b8e-988e-3647542f06fde731af461-c8c1-4d45-8f14-cf049c51d1f1. O responsável pela base operacional deve verificar e decidir eventual remoção. - Estado: o percurso automatizado de cálculo anónimo e autosave foi verificado no browser; a etapa permanece parcial até revisão manual com leitor de ecrã/dispositivo e validação de produto. Nenhuma regra fiscal foi activada.
Reconciliación do ensaio QA e suite global — 2026-10-03
- O primeiro lançamento da suite global no banco novo falhou em 25 testes antes da lógica de negócio: vários testes impõem o sufixo
_testcomo condição de segurança. Renomeei a base descartável parainvestmoz_browser_e2e_test, actualizei a allowlist exacta de QA e repeti a suite. - Resultado final:
php vendor/bin/phpunitpassou 231/231 testes e 2.288 asserções em 75,566 s, na baseinvestmoz_browser_e2e_test, PostgreSQL QA porta 55441. Os 25 erros anteriores eram exclusivamente a guarda do nome da base; foram eliminados pelo alvo QA compatível. - A primeira base
investmoz_browser_e2efoi renomeada, não copiada; o alvo actual é a única base QA adicional admitida pelo harness. Baseinvestmoz_testpreexistente não foi usada nesta suite.
Etapa 1 — contrato de execucao e decimais (2026-10-03)
- O formulario valida as respostas JSON de criacao, polling e leitura antes de as usar; estados desconhecidos, envelope incompleto ou ID divergente sao rejeitados.
- OpenAPI agora documenta as respostas de execucao e os campos monetarios/taxas como strings decimais, alinhados com o payload JSON e
data-contracts.md. O servidor continua responsavel pelos limites numericos; nenhuma precisao maxima foi inventada. - Evidencia:
node --test tests/frontend/*.test.mjspassou 101/101;npm.cmd run types:checkpassou;npm.cmd run checkdirigido passou;npm.cmd run buildcompilou 2.388 modulos. Aviso apenas informativo: pacote opcionalfontaineausente. - A etapa 1 continua parcial: falta tipar e testar os restantes endpoints de questionario, draft, historico, reports e erros, alem de round-trip de persistencia.
Etapa 1 — histórico e rascunhos API (2026-10-03)
- O formulário valida respostas paginadas do histórico, leituras de rascunho (incluindo
data: nullepersonal_snapshot: []anónimo), confirmações de escrita e anexação. Erros estruturais não são aceites como sucesso. - OpenAPI liga os schemas de questionário, histórico, rascunho, anexação e relatório aos endpoints correspondentes; respostas de erro e paginação estão descritas. As decimais continuam strings exactas nos pedidos.
- Evidência: frontend 102/102;
npm.cmd run types:check, lint dirigido, JSON/OpenAPI com refs locais resolvidos, build 2.388 módulos egit diff --checkpassaram. Aviso apenas informativo de dependência opcionalfontaine. - A Etapa 1 continua parcial: jobs, formatos detalhados de erros, restantes round-trips de persistência e contrato/runtime de endpoints que o formulário ainda não consome carecem de revisão e testes específicos.
Adenda da Etapa 1 — jobs de execução e validação final (2026-10-03)
O OpenAPI também documenta agora GET /simulations/{id}/jobs, com tipos/estados/retries e códigos de erro sanitizados conforme a migration e o controlador. Revalidação posterior: frontend 102/102, TypeScript, lint dirigido, build 2.388 módulos, JSON OpenAPI e 60 referências locais resolvidas; git diff --check passou com avisos de CRLF já existentes noutros documentos. A etapa segue parcial por round-trip de persistência, maior cobertura de erros e runtime guards para APIs fora do percurso actual da UI.
Adenda da Etapa 1 — guards wire auxiliares (2026-10-03)
Acrescentei validadores testados para envelopes de questionário publicado, relatório, jobs e erros Laravel; a mensagem de erro só é usada se o formato for reconhecido. Testes frontend repetidos: 103/103; TypeScript, lint dirigido e build 2.388 módulos passaram. O aviso de fontaine opcional não impede o build. Não houve chamada de escrita, migração nem acesso à base operacional nesta validação.
Correcção de evidência da Etapa 1 — round-trip e PATCH de cenário (2026-10-03)
A pendência anterior de “round-trip de persistência” estava formulada de modo demasiado amplo: SimulationExecutionTest já compara a resposta/API com o relatório persistido e SimulationFormDraftTest cobre criação, leitura, edição cifrada e anexação. Acrescentei teste explícito de JSON encode/decode para os guards wire e liguei no OpenAPI a resposta 202 do PATCH de cenário e os seus erros ao schema correspondente. A suíte frontend permanece 104/104; o teste de contrato focado passou 11/11 e o OpenAPI tem 66 refs locais resolvidos. Os testes PHP não foram repetidos nesta adenda: a porta isolada 55441 não está em escuta; a base do desenvolvedor na 5432 não foi usada. A pendência restante é validar estas respostas integradas em runtime contra PostgreSQL QA e cobrir consumidores/clientes adicionais, não inexistência de testes de persistência.
Reconciliacao autoritativa — Etapa 1 concluida tecnicamente (2026-10-03)
O estado “parcial” da linha historica da Etapa 1 fica substituido por esta verificacao. Todas as rotas de simulacao em routes/api.php agora tem schemas de sucesso OpenAPI e respostas 4xx referenciadas a ApiErrorV1; o teste percorre todas as operacoes e exige esse contrato comum. Os valores decimais enviados pela UI sao strings. Guardas runtime cobrem envelopes consumidos pela UI e testes cobrem questionario, relatorio e jobs. Persistencia e releitura estao cobertas em PostgreSQL QA, incluindo igualdade de snapshot/relatorio/hash e rejeicao de token alheio.
- Frontend: 104/104; contrato focado: 11/11; TypeScript ja passou nas alteracoes de guard; Pint do teste PHP passou.
- PHP 8.5.11/PostgreSQL 17 QA: suite completa 231/231, 2.305 assertions apos teste de leitura do relatorio;
SimulationExecutionTestfocado 14/14, 111 assertions apos verificacao do PATCH de cenario. - OpenAPI: JSON valido, 85 refs locais resolvidos; todos os 4xx usam
ApiErrorV1. - Cluster temporario em
investmoz_browser_e2e_test/55441 encerrado e confirmado parado. A base local na porta 5432 nao foi usada.git diff --checkpassou; avisos CRLF referem-se a dois documentos preexistentes fora do escopo. - Estado: contrato tecnicamente concluido; aceite operacional de produto continua no gate geral. Gates fiscais nao mudam.
Etapa 2 — submissao acessivel e contrato de criacao (2026-10-03)
- A resposta real
POST /api/v1/simulationsemite202para execucaoqueuede omiteresult_snapshot. O guard cliente exigia esse campo ja na criacao, embora o snapshot so exista depois do processamento.simulation-contract.tsagora aceita a ausencia em estados nao concluidos e exige o campo quandostatus=completed. - Smoke test Edge/CDP: submissao vazia marcou
#field-basecomo invalido, ligouaria-describedby=error-basea umrole=alert, moveu foco para o campo e nao enviou POST. Depois dos valores, POST 202 e 12 GET autenticados 200. Evidencia:simulator-calculation-browser-2026-10-03.json. - Limite QA: a execucao permaneceu
queued; workerqueue:work databasenao processou a fila durante o ensaio. Portanto, o teste do browser nao confirma valor final nem o fluxo completo do worker. Nao alterar nem desactivar a fila para fazer o smoke passar; investigar entrega/configuracao da fila em etapa de infraestrutura separada. - Validacoes: 104/104 testes frontend;
npm.cmd run types:check; lint/format dirigido;npm.cmd run build(2.388 modulos);node --checkegit diff --checkpassaram. Aviso nao bloqueante de pacote opcionalfontaineno build. - QA isolado (PostgreSQL em 55441, Laravel 18082, Edge 9224) encerrado; porta operacional local 5432 permaneceu a escuta e nao foi usada.
Correcao de evidencias — incidente de encaminhamento QA (2026-10-03)
A adenda anterior da Etapa 2 classificou indevidamente os pedidos do browser como QA isolado. Depois verificou-se, por instrumentacao HTTP temporaria, que o filho de artisan serve usou investemoz/5432 apesar do ambiente QA no processo pai. Varios POSTs de simulacao e autosave foram enviados a essa base; os UUIDs conhecidos e os limites da identificacao estao em docs/investmoz/qa-database-target-incident-2026-10-03.md. Nao houve consulta directa de linhas nem limpeza; a base nao foi tocada depois da descoberta. A porta 5432 continua preexistente. A prova de acessibilidade do formulario continua valida; toda afirmacao de isolamento QA para essas escritas fica revogada ate conciliacao pelo responsavel da base e repeticao por um harness com alvo QA comprovado.
Etapa 2 — repeticao integral no harness QA corrigido (2026-10-03)
- O router PHP define ambiente QA dentro do processo de cada pedido e responde com marca QA; a leitura territorial devolveu JSON 200 nessa instancia antes de executar escrita. O anterior
artisan servenao volta a ser usado para esse teste. - Browser Edge/CDP + worker em
investmoz_browser_e2e_test:55442: POST 202 queued, polling GET 200, estado concluido e aritmetica 50; autosave anónimo GET 200/POST 201; validação acessível passou (aria-invalid, descrição-alerta, foco e nenhum POST enquanto inválido); aviso fiscal e mensagem de privacidade visíveis; nenhum erro JS/alerta visível. Relatório tempassed=true. - O bloqueio de fila QA fica resolvido para esta jornada quando o worker está ativo. O incidente separado de chamadas prévias a
investemozcontinua sem reconciliação pelo responsável; nenhum cleanup ou consulta a linhas foi feito.
Competências e educação — validação territorial no servidor (2026-10-03)
EducationController::storeagora só aceitageo_location_idem província, distrito, posto administrativo ou localidade, além de exigir o registo activo. Antes, qualquer geo_location UUID existente, inclusive país, passava a validação.EducationTestinclui cenário negativo para país. PHP 8.5.11, PHPUnit sem configuração padrão e PostgreSQL QA preparado eminvestmoz_browser_e2e_test/55442: 8/8 testes e 207 assertions passaram; cada teste usa transacção e rollback, sem migrations/reset. Pint dirigido passou.- O módulo continua parcial: fontes e aceitação funcional/institucional, associação demonstrada entre oferta/procura e revisão assistiva manual ficam pendentes. Sem certificação, contratação automática ou dados pessoais de formandos.
CRM — consentimento canonico na conversao de interesse (2026-10-03)
-
ConvertInterestToLeadagora exige, dentro da transaccao e apos bloquear o pedido, consentimento canonicorespond_to_interestcorrespondente ao pedido, concedido e vigente, nao revogado nem apagado logicamente. A verificacao ocorre tambem antes de devolver lead existente, impedindo replay apos retirada do consentimento. -
CrmIntakeTestcria o consentimento canonico nos fixtures e inclui caso de revogacao, verificando que nenhum lead, investidor, contacto ou tarefa e criado. -
PHP 8.5.11 / PostgreSQL 17 descartavel em 55442:
CrmIntakeTest6/6, 47 assertions. Pint dirigido,php -lnos dois ficheiros egit diff --checkpassaram. A role superuser existiu apenas no cluster QA temporario para instalar PostGIS; cluster parado apos o teste. Porta 5432 nao foi usada. -
CRM segue parcial: este teste nao cobre o percurso real de retirada na UI nem politica de retencao; reconciliacao do incidente de dados operacionais descrito no relatorio QA continua com o responsavel da base.
-
Adenda CRM: o mesmo teste agora verifica tambem que consentimento apagado logicamente nao autoriza conversao. Reexecucao limpa em novo cluster descartavel:
CrmIntakeTest6/6, 50 assertions; Pint dirigido egit diff --checkpassaram. Cluster parado, sem listener QA em 55442.
CRM — revogacao interna do consentimento de contacto (2026-10-03)
-
A pagina interna do pedido agora expoe accao especifica para revogar
respond_to_interest, separada da permissao de partilha com o proponente. O utilizador de gestao regista o motivo; a transaccao bloqueia o pedido e o consentimento, cifra a justificacao, grava a transicao e emite outbox sem email. Consentimento ja revogado/inactivo nao cria evento duplicado. -
PortalManagementTestverifica leitura da finalidade vigente e a revogacao/outbox;CrmIntakeTestcobre que consentimento revogado ou apagado logicamente bloqueia conversao e replay do CRM. -
PHP 8.5.11 / PostgreSQL 17 em cluster QA descartavel:
PortalManagementTest+CrmIntakeTestpassaram 16/16, 230 assertions. Pint dirigido, PHP lint enpm.cmd run types:checkpassaram. Cluster encerrado; 55442 sem listener e 5432 nao usada. -
A revogacao interna nao substitui canal publico do titular nem define retencao/eliminação; esses requisitos de privacidade continuam para validacao. Suite completa e aceitacao manual da interface nao foram executadas nesta tranche.
-
Revalidacao final de CRM: a suite focada foi ampliada para incluir negativa de utilizador sem permissao e repeticao idempotente sem transicao/evento duplicados. Resultado final: 16/16 testes, 234 assertions; Pint, TypeScript e build Vite (2.388 modulos) passaram. Aviso de build: pacote opcional
fontaineausente. QA em cluster PostgreSQL 17 descartavel foi encerrado; listener 5432 e preexistente e nao foi usado. -
Adenda de integracao CRM: o teste agora percorre revogacao pela rota de gestao seguida de tentativa real de conversao; a conversao e rejeitada. Tambem verifica que utilizador sem papel nao revoga e que repeticao nao duplica outbox/transicao. Reexecucao final: 16/16 testes, 237 assertions.
npm run builde TypeScript passaram; aviso opcionalfontaine. O verificador Vite+ de formatacao considera este ficheiro legado fora do formato global; nao foi reformatado inteiro para evitar diff mecanico alheio ao escopo.
Regressao global apos CRM — 2026-10-03
- A suite PHP global foi executada em cluster PostgreSQL 17 novo e isolado na porta 55441. O harness criou a base
investmoz_test, aplicou todas as migrations antes da suite (dependencia deAiGatewayTest) e usou PHP 8.5.11. Resultado final: 233/233 testes, 2.345 assertions; zero falhas/erros. - Suite frontend: 104/104. TypeScript, Pint dirigido, PHP lint, build Vite (2.388 modulos) e
git diff --checkpassaram. Build emite aviso nao bloqueante do pacote opcionalfontaine. - Uma tentativa preliminar em DB vazio sem migrations terminou com 8 testes AI falhados por
ai_controlsinexistente; corrigido apenas o setup de QA, sem alterar testes ou codigo por causa desse resultado. A repeticao completa acima e a evidência final. - Cluster encerrado e porta 55441 confirmada sem listener; a base local na porta 5432 nao foi consultada nem alterada. Permanecem pendentes: reconciliacao administrativa do incidente QA e gates humanos/legal/privacidade/manual descritos no estado actual.
Gate documental — scanner antimalware indisponivel no ambiente local (2026-10-03)
A verificacao do ambiente nao encontrou os executaveis clamscan, clamdscan ou clamd, nem servico ClamAV instalado. Nao instalei nem activei scanner externo; os uploads continuam em quarentena interna e a publicacao de ficheiros novos permanece bloqueada. Proxima tarefa independente do plano: continuar a lacuna de localizacoes multipla/estruturadas no formulario privado; nao fabricar coordenadas nem publicar registos.
Localizações administrativas múltiplas — 2026-10-03
- O rascunho privado agora admite 2–20 percursos administrativos, guardados em
payload.locations_jsondentro do payload já cifrado. O cliente limpa selecções descendentes ao mudar um nível; o servidor valida UUID, hierarquia na referência pública, mínimo/máximo e percursos repetidos ou sobrepostos. Não são recolhidas nem inventadas coordenadas. - A resposta de leitura/gravação resolve os nomes dos percursos exclusivamente a partir da referência territorial pública. O resumo mostra os nomes depois de guardar.
wizard_version=2consta do contrato OpenAPI; a rota legada conserva validação própria. - Ficheiros desta tranche:
BusinessFormSchema.php,InvestmentGeography.php,ExistingBusinessController.php,business-locations.ts,business-wizard.tsx,business-types.ts,existing-business-openapi.mjs,ExistingBusinessWizardTest.phpebusiness-locations.test.mjs. - Evidência: PHP 8.5.11 e PostgreSQL 17 descartável na porta 55441, migrations aplicadas apenas na base temporária;
ExistingBusinessWizardTest3/3, 49 assertions; testes frontend da localização 3/3; TypeScript, Pint dirigido, PHP lint egit diff --checkpassaram. O listener preexistente em 5432 não foi utilizado. Cluster parado; os ficheiros de dados QA permanecem no directório temporário%TEMP%\investmoz-stage-multilocporque a limpeza automática foi bloqueada pelo executor. - Sem migration nem alteração de esquema persistente. Rollback: reverter os trechos acima e remover os dois testes/helpers novos; não há dados existentes a migrar. Permanecem pendentes mapa/coordenadas, relação territorial canónica e associação a parques/zonas; esta entrega não autoriza publicação de oportunidade.
Dados territoriais — pesquisa tolerante a acentos (2026-10-03)
GET /api/v1/investment/territory-optionsagora normaliza o termo de pesquisa (Str::ascii) e compara nomes comtranslate(lower(name), ...), além de manter correspondência por código e código de origem. Não altera nem translitera os nomes guardados, não instala extensão e mantém o escopo de território público e dependência hierárquica.ExistingBusinessWizardTest: 4/4 testes, 55 assertions no PostgreSQL 17 descartável, PHP 8.5.11/porta 55441; inclui pesquisasmaputo,provinciaeMapútocontraProvíncia de Mapúto. PHP lint, Pint dirigido, TypeScript, três testes de localização frontend e diff check passaram. Build Vite também passou nesta continuação anterior (2.389 módulos); aviso não bloqueante da dependência opcionalfontaine.- O cluster QA está parado. Porta 5432 permaneceu intocada. As limitações de cobertura oficial/importação de dados territoriais, reconciliação e aproximação sem fusão automática continuam. D-01 melhora, mas permanece parcial.
Catálogo, lista e mapa — reconciliação das contagens (2026-10-03)
- A auditoria confirmou que catálogo web, pesquisa API e mapa derivam o conjunto base de
InvestmentCatalogue::query()com os mesmos filtros. A lista não esconde oportunidades sem ponto: elas aparecem emunlocatedno mapa, ematched_countinclui georreferenciadas e não georreferenciadas. O limite de 1.000 registos é explícito portruncated. - Reforcei
InvestmentTerritoryTestpara comparar IDs e totais na página Inertia, endpoint de pesquisa e endpoint de mapa em três estados: oportunidade publicada sem coordenadas; coordenadas públicas confirmadas; oportunidade retirada. Resultado: 9/9 testes, 138 assertions, PHP 8.5.11/PostgreSQL 17 QA isolado, porta 55441; Pint e PHP lint passaram. Sem alteração funcional/dados de produção. - A verificação confirma consistência para o fluxo amostrado, mas não prova exaustivamente filtros combinados, paginação acima de 1.000 ou aceitação visual assistiva. C-01 continua parcial até essas verificações; nenhuma coordenada foi fabricada. QA foi encerrado e a porta 5432 não foi consultada.
Adenda — extracção de revisão não importável (2026-10-03)
O DOCX de origem voltou a ser localizado no caminho registado. O SHA-256 actual (BCBF8EC976100CC5E978AEF54050C3E3E9D959B0D361FA80A788528A8E5049A6) coincide com a proveniência acima. Foi criada docs/investmoz/source-staging/pii-26-30-review-only.csv com 174 linhas, preservando índice de tabela no XML, linha, legenda da tabela, chave, título, tipo, relação literal, localização, custo literal, cabeçalho literal da moeda e horizonte. Cada linha tem estado review_only_not_importable; nenhum registo canónico ou anúncio foi criado.
A extração confirma que “Terminal de Contentores – Porto de Nacala” ocorre em T16/L4 (A07 - C02, 110,000,000) e T17/L4 (A08 - C02, 300.000.000), ambos sob cabeçalho USD. São identificadores/valores distintos: manter ambas as linhas para reconciliação, sem deduplicar ou escolher um valor. As sete linhas da tabela XML 19 conservam o cabeçalho Custo (USD/ MZN) e ficam marcadas currency_ambiguous_mixed_header. O texto inclui “Taxa de câmbio: 1 USD = 64,00 MZN” imediatamente antes e depois desta tabela, mas não estabelece a moeda de cada linha, a aplicação dessa taxa às estimativas, a data/base da taxa nem a autoridade da conversão; por isso, nenhum valor foi convertido.
As colunas uniformes das 13 tabelas não identificam pessoa/entidade responsável nem fase de execução; no CSV ficam vazias, sem inferência. Localizações e relações permanecem literais, não validadas. Validação do artefacto: 174/174 linhas, 174 referências tabela/linha únicas, 7 linhas em T19 sinalizadas e 2 linhas do título repetido sinalizadas. Não houve escrita em base de dados nem alteração do DOCX. Gate V-01/D-02 continua parcial e bloqueado para importação/publicação até reconciliação pelo responsável do documento e validação dos topónimos, responsáveis, estados e moeda.
Rollback deste artefacto derivado: remover apenas pii-26-30-review-only.csv e esta adenda; o original e dados de aplicação permanecem intactos.
Cadastro administrativo de corredores — 2026-10-03
- A auditoria confirmou que
development_corridorse o modelo existiam, mas não havia CRUD na área de gestão: as rotas genéricas só aceitavamprojectseclusters. Acrescentei/management/corridorscom pesquisa/paginação e formulário privado para código, nome, estado e descrição, reutilizando o selector territorial existente na criação. Os estados aceites são os já definidos pela tabela (proposed,active,closed); não foi criada regra nem conteúdo oficial. - O registo fica com classificação
internal; o estadoactiveé apenas estado operacional do corredor e não cria publicação. Não houve migration. Autorização, criação, leitura, edição e estado foram verificados emInvestmentStructureTest: 5/5 testes, 68 assertions, PostgreSQL 17 QA isolado na porta 55441, PHP 8.5.11. PHPStan: 0 erros; Pint, PHP lint, TypeScript, build Vite (2.389 módulos) egit diff --checkpassaram. Build assinala apenas a dependência opcionalfontaineausente. Cluster encerrado; 5432 não utilizada. - D-02 permanece parcial: esta tranche só acrescenta CRUD básico de corredor. Associações corredor–projecto/cluster com fonte, evidência, vigência e revisão independente, catálogo de parques/zona, relações com PII e validação oficial dos dados ainda não estão concluídos. Nenhum corredor real foi inserido.
- Rollback: reverter
routes/web.php, controller, tipos/páginas de estruturas, ligação no menu e o teste. Não há alteração de esquema ou dados a reverter.
Publicação da carteira — aprovação separada da importação (2026-10-03)
- Corrigido um bypass verificado:
portfolio:import --approval=<texto>aceitava qualquer texto arbitrário e publicava até 29 dossiers sem autenticar o proprietário nem confirmar revisão. O comando agora só corre o seeder idempotente e deixa os dossiers em rascunho privado. O parâmetro--approvaldeixou de existir; chamada com esse parâmetro foi executada e terminou com erroThe "--approval" option does not exist. - Fechada também a auto-publicação pela rota de gestão: um dossier sem editor atribuído não pode ser publicado (422); o editor não pode rever/publicar a própria edição (403); outro gestor tem de rever. O fluxo mantém versão optimista, evidência e auditoria. As fichas já publicadas/históricas não foram alteradas.
InvestmentPortfolioTest+InvestmentUnificationTest: 15/15 testes, 224 assertions, incluindo importação repetida, ausência de publicação automática, preservação de edições, editor distinto e filtros com fixtures sintéticas explicitamente publicadas. PHPStan 0 erros; Pint e PHP lint dirigidos passaram. Testes em PostgreSQL 17 isolado, PHP 8.5.11/porta 55441. Não foi usada a base 5432.- Sem migration. Rollback de código reabre os caminhos de auto-publicação; preservar o controlo actual salvo decisão expressa de política. O histórico documental de 26/09 sobre a autorização inicial foi mantido como histórico, não como instrução de execução actual.
Actualização posterior — governação de parâmetros e regressão global (2026-10-03)
A camada fiscal tem agora validação de parâmetros value/unit/conditions, resolução determinística interna por componente, scope_key, vigência, condições e estado/versão da fonte; e a interface separa parâmetro aprovado, cenário de planeamento do utilizador e ausência de cálculo. Os pressupostos hipotéticos só são pedidos quando o modo personalizado é escolhido, não bloqueiam a gravação do rascunho incompleto e os resultados aritméticos são marcados custom_planning.
O resolvedor permanece desligado da API pública e do worker. A UI mantém o cálculo legal indeterminado enquanto não existir leitura pública mínima compatível com RLS e parâmetros/fórmulas fiscais aprovados. Não há valores fiscais demonstrativos em produção, não há reexecução de resultados históricos e o gate das Etapas 4/5 continua bloqueado para cálculo público.
Regressão global mais recente
Após essas alterações, php artisan migrate --force na base QA isolada respondeu Nothing to migrate. php vendor/bin/phpunit: 245/245 testes, 2.539 asserções em PostgreSQL 17.11/PostGIS 3.6, porta 55441. Suite frontend: 114/114; TypeScript, PHPStan, Pint/check dirigido, JSON OpenAPI e Vite build (2.390 módulos) passaram. O aviso de build fontaine é opcional. O cluster QA foi encerrado; nenhuma ligação à porta 5432 ocorreu nesta execução.
O estado global permanece parcial por aceitação manual/assistiva, revisão de produto e incidente histórico sem reconciliação, além das fontes e aprovações fiscais ainda pendentes. O teste automatizado global verde não altera esses gates.
Consulta segura dos parâmetros fiscais
Foi acrescentada a rota POST /api/v1/tax-parameters/resolve, protegida pelo middleware web/CSRF e limitada por rate limit, mais uma policy RLS que só permite ler versões publicadas ligadas a fonte validada e temporalmente compatível. A resposta é uma projecção sem AST; lista valor, unidade, condições assumidas, scope_key, versão, vigência e referência legal. O formulário permite consultar períodos anuais, mensais, trimestrais e operações pontuais com datas exactas. Mudanças de vigência e sobreposições devolvem indeterminação.
Verificação desta extensão: php artisan test --filter=SimulationTaxParameterResolverTest 6/6 (18 asserções); npm.cmd run types:check; npm.cmd run build (2.390 módulos); Pint dirigido; php artisan route:list --path=api/v1/tax-parameters/resolve; OpenAPI JSON. O build mantém aviso opcional fontaine. A migration da policy ainda precisa de ser aplicada no ambiente alvo para a rota encontrar linhas, e não apliquei migrações nem consultei a base .env nesta extensão. Não existe cálculo fiscal nem snapshot fiscal conectado. Gate fiscal permanece bloqueado.
Revalidacao da regressao do simulador — 2026-10-03
O primeiro preflight ocorreu com o PostgreSQL QA desligado e nao chegou aos casos. Essa condicao foi resolvida pela criacao de cluster descartavel; o resultado final (250/250) e a execucao em Edge estao registados nas adendas imediatamente seguintes. A suite frontend passou 115/115, TypeScript e PHPStan (0 erros), e build (2.397 modulos) passaram. O gate da Etapa 11 continua parcial apenas para leitor de ecrã/dispositivo e revisao humana de produto. Nenhuma regra fiscal foi activada.
Regressao PHP global no worktree actual — 2026-10-03
Actualizacao que substitui a nota anterior de que a suite PHP nao executou: foi criado um cluster PostgreSQL 17.11 temporario e isolado em %TEMP%\investmoz-goalqa-20261003-1546, limitado a 127.0.0.1:55441. php artisan test passou 250/250 testes e 2.582 assertions, incluindo 3/3 casos DUAT (38 assertions). PostgreSQL foi parado e 55441 ficou sem listener. A porta 5432 nao foi utilizada. O ensaio encontrou e levou a correcao da validacao de consentimento para rascunhos incompletos. Node frontend 115/115, TypeScript, PHPStan (0 erros), Pint dirigido e build (2.397 modulos) passaram. Continuam pendentes validacao manual assistiva/de produto e os gates fiscais humanos; nao houve activacao de regras.
Revalidacao Edge do simulador — Etapas 2/11 — 2026-10-03
Smoke de browser no Edge headless passou com alvo verificado investmoz_test:55441; quatro larguras (390, 768, 1024, 1440), 12 focos sequenciais nomeados/visiveis, sem overflow, controlo sem nome ou excepcoes JavaScript. A unica chamada API foi GET /api/v1/simulation-drafts/current 200. QA ficou em 0 simulacoes/0 rascunhos e os processos Edge/PHP/PostgreSQL temporarios foram encerrados, com portas 55441/18089/9224 fechadas. Relatorio: simulator-browser-audit-2026-10-03-rerun-runtime-verified.json. Isto reforca validacao automatizada, mas nao substitui leitor de ecrã real, dispositivo fisico ou revisao de produto.
Adenda de isolamento: o router tools/simulator-qa-router.php confirma a configuracao Laravel e a identidade real da ligacao antes de responder ou devolver o marcador QA. Relatorio final atualizado: simulator-browser-audit-2026-10-03-rerun-runtime-verified.json, com qaTargetVerified=true, 0 simulacoes/rascunhos. pg_ctl status e o estado das portas confirmaram que nao ha servicos QA activos.
Reconciliação histórica do CIVA — sequência antes e depois da Lei 13/2016 (2026-10-03)
- Reconciliada a orientação de usar a republicação da Lei 13/2016 como texto-base: a Lei 3/2012 alterou o CIVA original, mas não deve ser reaplicada sobre a republicação integral nos períodos posteriores à entrada em vigor desta.
- Acrescentadas à sequência posterior as Leis 5/2020 e 3/2025, antes ausentes em resumos da cadeia. O MEF identifica a Lei 5/2020 como alteração ao artigo 9(13); o prazo transitório exacto foi visto apenas numa reprodução do BR, pelo que a data/vigência segue pendente de conferência no fac-símile oficial. A Lei 16/2020 e seguintes são aplicadas por artigo e período, não cumulativamente.
- Reavaliação do BR 89/2017: foi encontrado e arquivado um exemplar local do boletim (página 569 extraída; SHA-256
11F0CAB15EB6E51010952203FFA24FDC533A24FD642E19525FE4F46B17A1F5E5). O aviso confirma alteração do art. 6(5)(c)-(d), eliminação do art. 14(2)(c) e rectificação dos anexos I–III do art. 9. A cópia coincide com número/data da ficha INM, mas a proveniência não está autenticada; o texto corrigido dos anexos segue indisponível. Detalhes:primary-text-review-2025-2026.mdeofficial-source-register.md. - Actualizados os três registos fiscais e corrigida a lista de governação em
official-source-register.md; o gate público fiscal mantém-se bloqueado.
Etapa 2 — evidência responsiva adicional e correcções (2026-10-03)
A auditoria Edge headless mais recente substitui, para cobertura automatizada de browser, a matriz anterior de quatro larguras e o smoke apenas de leitura. O formulário foi inspeccionado nos estados finalidade, fiscal e resultado a 320, 360, 390, 768, 1024 e 1440 px. Relatório: matriz browser; roteiro: cálculo e responsividade.
Resultado: passed=true, alvo investmoz_test:55441 verificado no header de todas as respostas API, sem overflow, controlos sem nome, erros JS ou alertas. O resultado calculado foi 50; validação do campo em falta apresentou erro acessível e foco no campo. O foco na navegação para a etapa fiscal mostra outline visível. Foram corrigidos o indicador de foco e a quebra visual de números decimais extensos em ecrãs estreitos.
Foram criados 4 registos sintéticos de simulação e 5 rascunhos no banco temporário durante as tentativas E2E repetidas; não continham dados pessoais. O cluster QA, servidor PHP e Edge foram parados; não foi utilizada a base na porta 5432. Etapa 2 permanece parcial até ensaio com leitor de ecrã/dispositivo e revisão manual de produto.
Etapa 3 — pressupostos iniciais da calculadora (2026-10-03)
Foi corrigida a proveniência enganadora dos campos pré-preenchidos nas ferramentas educativas: a interface identifica os valores iniciais como exemplos demonstrativos e o CSV já não os declara indiscriminadamente como introduzidos pelo utilizador. Testes financeiros 14/14 e frontend 117/117; TypeScript, check/lint e build passaram. Fórmulas e regras fiscais não foram alteradas. A etapa segue parcial até à revisão financeira e à decisão sobre a amplitude necessária do orçamento pessoal.
Adenda Etapa 3: orçamento sem linha de receita ou despesa deixou de produzir saldo zero; exige pelo menos uma linha de cada tipo. O valor 0 explicitamente introduzido continua válido, e snapshots vazios para uma destas listas são rejeitados. Teste financeiro 15/15, frontend 118/118, TypeScript, check/lint e build aprovados. Revisão financeira e extensão do orçamento pessoal continuam pendentes.
Etapa 6 — reconciliação de cobertura técnica (2026-10-03)
A matriz Etapa 6: rastreabilidade técnica confirma os requisitos nucleares do anexo contra o modelo, interface e testes; business-financial-plan.test.mjs passou 35/35. Gate técnico do escopo nuclear proposto como coberto, mas etapa global continua parcial até revisão contabilística institucional. Termos de fornecedor agregados, limites partilhados e incumprimento permanecem fora do modelo; nenhuma condição financeira é presumida. Cálculo fiscal segue indeterminado.
Etapa 7 — imposto omitido permanece indeterminado (2026-10-03)
Corrigido o planeador de tesouraria: imposto mensal vazio/omitido já não é assumido como zero. Fluxo líquido e saldo final totais ficam indeterminados, enquanto os fluxos conhecidos antes do imposto continuam visíveis; zero explícito permanece válido. O CSV preserva essa distinção. Suite frontend 119/119, TypeScript, lint/formatação, build Vite e git diff --check passaram. A rastreabilidade e limitações estão em Etapa 7 técnica. O cálculo fiscal continua indisponível sem regras aprovadas.
Etapa 8 — correcções de exportação e rastreabilidade (2026-10-03)
O CSV empresarial deixou de afirmar falsamente que todos os valores foram digitados pelo utilizador. A tesouraria identifica pressupostos pré-preenchidos como exemplos e o CSV inclui data de exportação, versão do modelo, horizonte, moeda, estado e origem dos dados. A matriz Etapa 8 técnica cobre exportação pública, estados, snapshots/hash, ausência de PII e reconciliação. Suite frontend 119/119, TypeScript, build (2.397 módulos) e diff check passaram. Aviso do check: três variáveis não usadas preexistentes no plano financeiro. A revisão assistiva permanece fora desta validação automatizada.
Etapa 9 — conversão consentida para rascunho (2026-10-03)
A conversão existente foi reconciliada com os critérios de consentimento explícito, autorização, snapshot/hash, preservação do original, idempotência, ETag e revogação; suite feature passou 10/10 (79 asserções) em PostgreSQL 17 isolado na porta 55441. A conversão só anexa ao rascunho: Project, submissão formal e CRM não são criados. O gate permanece parcial até existir evidência desses fluxos e revisão manual assistiva/produto. Ver stage-9-technical-traceability.md.
Reconciliação do motor fiscal — 2026-10-03
O gate histórico da Etapa 10 foi actualizado à luz do código actual: avaliador DSL, DAG, precisão racional, resolução de parâmetros e governação já existem e passaram testes focados. O motor permanece fora do percurso de cálculo público; nenhuma regra é activada. Ver stage-10-technical-traceability.md para os critérios e limites.
Etapa 10 — extensão informativa territorial (2026-10-03)
A auditoria confirmou controlos existentes para zonas, fontes/vigência, relações, geometrias e origem de pedidos, e verificou a advertência pública de que associação territorial não atribui benefícios, licenças ou autorização aduaneira. InvestmentZoneTest passou 6/6 (104 asserções) em PostgreSQL/PostGIS QA isolado. Benefícios fiscais, cálculo aduaneiro/cambial e decisões regulatórias continuam sem activação. Ver stage-10-extension-traceability.md.
Regressão integral actualizada — 2026-10-03
php artisan test passou 253/253 testes (2.590 asserções) no PostgreSQL 17/PostGIS QA descartável, porta 55441, depois de repetir com o administrador local do cluster porque três testes RLS criam um papel de teste e o login não-superuser não tem CREATEROLE. A primeira tentativa com esse login foi 250/253 e falhou apenas nesses três setups; a execução integral seguinte passou. Frontend 119/119; TypeScript; PHPStan 0 erros; build Vite 2.397 módulos. A build avisa que fontaine opcional não está instalado. QA foi encerrado; 5432 não foi usada.
Etapa 7 — calendário mensal de pressupostos de tesouraria (2026-10-03)
Foi acrescentado um modo de calendário variável de imposto mensal ao lado do valor fixo mensal existente. Cada montante é um pressuposto do utilizador; mês vazio permanece indeterminado, o saldo completo propaga a incerteza a partir desse mês, e a caixa conhecida desconta os impostos informados. CSV e interface esclarecem que não é apuramento legal. Teste mensal 11/11 e suite frontend 123/123 passaram; TypeScript e vp check dirigido passaram. O calendário não é guardado em snapshot de conta. Ver stage-7-technical-traceability.md.
Validação visual do calendário mensal: não concluída nesta retoma. O runner Edge/CDP existente falhou antes das asserções por erro de protocolo; não foi guardado como evidência aprovada. Testes unitários 11/11, suite frontend 123/123, TypeScript, lint e build passaram. Revisão visual/assistiva específica permanece pendente.
Adenda posterior — Edge isolado do componente: a pendência de automatização visual do componente foi superada sem chamar API/Laravel/DB. SimulationCashflowPlanner passou no Edge headless em seis larguras (320–1440 px), sem overflow, controlos sem nome, excepções JS ou falhas de rede. O estado fixo, calendário variável, mês em falta/indeterminado, zero explícito e 12 linhas foram verificados. Evidência: relatório Edge isolado e harness. A página de produção, persistência e ensaio com leitor de ecrã/dispositivo físico continuam pendentes.
Etapa 9 — manifestação pública independente do cálculo fiscal
O resultado concluído agora oferece uma ligação directa para /manifestar-interesse, sem copiar nem enviar a simulação, sem exigir autenticação e sem depender de cálculo fiscal. A cobertura frontend valida o destino e a mensagem de privacidade; a rota pública permanece coberta por PublicPortalNavigationTest. Isto mantém a submissão de interesse independente do estado fiscal, mas não converte nem anexa dados à manifestação.