Files
Investidor-V2/docs/investmoz/simulations/current-status-2026-10-03.md
T
nala 1106509116
tests / ci (push) Canceled after 0s
vrsao 2
2026-10-08 14:02:01 +02:00

60 KiB
Raw Blame History

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

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 isolada investmoz_browser_e2e na 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 SimulationFormDraftTest passou 9/9 testes e 67 asserções em investmoz_browser_e2e; node --test tests/frontend/*.test.mjs passou 98/98; npm.cmd run types:check, npm.cmd run build (2.388 módulos), npm.cmd run check dirigido, Pint dirigido, node --check e git diff --check passaram. O relatório browser está em simulator-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 .env local aponta para investemoz na 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-3647542f06fd e 731af461-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 _test como condição de segurança. Renomeei a base descartável para investmoz_browser_e2e_test, actualizei a allowlist exacta de QA e repeti a suite.
  • Resultado final: php vendor/bin/phpunit passou 231/231 testes e 2.288 asserções em 75,566 s, na base investmoz_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_e2e foi renomeada, não copiada; o alvo actual é a única base QA adicional admitida pelo harness. Base investmoz_test preexistente 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.mjs passou 101/101; npm.cmd run types:check passou; npm.cmd run check dirigido passou; npm.cmd run build compilou 2.388 modulos. Aviso apenas informativo: pacote opcional fontaine ausente.
  • 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: null e personal_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 e git diff --check passaram. Aviso apenas informativo de dependência opcional fontaine.
  • 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; SimulationExecutionTest focado 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 --check passou; 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/simulations emite 202 para execucao queued e omite result_snapshot. O guard cliente exigia esse campo ja na criacao, embora o snapshot so exista depois do processamento. simulation-contract.ts agora aceita a ausencia em estados nao concluidos e exige o campo quando status=completed.
  • Smoke test Edge/CDP: submissao vazia marcou #field-base como invalido, ligou aria-describedby=error-base a um role=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; worker queue:work database nao 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 --check e git diff --check passaram. Aviso nao bloqueante de pacote opcional fontaine no 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 serve nao 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 tem passed=true.
  • O bloqueio de fila QA fica resolvido para esta jornada quando o worker está ativo. O incidente separado de chamadas prévias a investemoz continua 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::store agora só aceita geo_location_id em 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.
  • EducationTest inclui cenário negativo para país. PHP 8.5.11, PHPUnit sem configuração padrão e PostgreSQL QA preparado em investmoz_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)

  • ConvertInterestToLead agora exige, dentro da transaccao e apos bloquear o pedido, consentimento canonico respond_to_interest correspondente 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.

  • CrmIntakeTest cria 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: CrmIntakeTest 6/6, 47 assertions. Pint dirigido, php -l nos dois ficheiros e git diff --check passaram. 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: CrmIntakeTest 6/6, 50 assertions; Pint dirigido e git diff --check passaram. 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.

  • PortalManagementTest verifica leitura da finalidade vigente e a revogacao/outbox; CrmIntakeTest cobre que consentimento revogado ou apagado logicamente bloqueia conversao e replay do CRM.

  • PHP 8.5.11 / PostgreSQL 17 em cluster QA descartavel: PortalManagementTest + CrmIntakeTest passaram 16/16, 230 assertions. Pint dirigido, PHP lint e npm.cmd run types:check passaram. 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 fontaine ausente. 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 build e TypeScript passaram; aviso opcional fontaine. 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 de AiGatewayTest) 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 --check passaram. Build emite aviso nao bloqueante do pacote opcional fontaine.
  • Uma tentativa preliminar em DB vazio sem migrations terminou com 8 testes AI falhados por ai_controls inexistente; 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_json dentro 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=2 consta 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.php e business-locations.test.mjs.
  • Evidência: PHP 8.5.11 e PostgreSQL 17 descartável na porta 55441, migrations aplicadas apenas na base temporária; ExistingBusinessWizardTest 3/3, 49 assertions; testes frontend da localização 3/3; TypeScript, Pint dirigido, PHP lint e git diff --check passaram. 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-multiloc porque 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-options agora normaliza o termo de pesquisa (Str::ascii) e compara nomes com translate(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 pesquisas maputo, provincia e Mapúto contra Proví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 opcional fontaine.
  • 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 em unlocated no mapa, e matched_count inclui georreferenciadas e não georreferenciadas. O limite de 1.000 registos é explícito por truncated.
  • Reforcei InvestmentTerritoryTest para 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_corridors e o modelo existiam, mas não havia CRUD na área de gestão: as rotas genéricas só aceitavam projects e clusters. Acrescentei /management/corridors com 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 estado active é 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 em InvestmentStructureTest: 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) e git diff --check passaram. Build assinala apenas a dependência opcional fontaine ausente. 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 --approval deixou de existir; chamada com esse parâmetro foi executada e terminou com erro The "--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.md e official-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.