From 880e12890c41fd66ba447ea55a6277e030b1d647 Mon Sep 17 00:00:00 2001 From: nala Date: Wed, 11 Nov 2026 14:20:23 +0200 Subject: [PATCH 01/10] Record mining and energy reference delivery installed in f2767818 --- .../unification/traceability-and-manual.md | 10 ++++++++++ docs/investmoz/v2/auditoria-portal/backlog.md | 10 ++++++++++ .../v2/auditoria-portal/matriz-requisitos.csv | 14 +++++++------- .../auditoria-portal/visao-consolidada-modulos.md | 10 ++++++++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 2896453d..8a9706c3 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -1,3 +1,13 @@ +## 11/11/2026 — Mineração e Energia instaladas em f2767818 + +Entrega autorizada de542ac2ff instalada na revisão `f27678187669d18ec063a01473dc8788c713448d`. A revisão inclui a correcção técnica dos hashes e dos geradores para usar os mesmos bytesJSON emWindows eGit/Linux,detectada antes de alterar a instalação;conteúdo,interface e âmbito preservados. Os sete casos nativos/166asserções voltaram a passar sobre os bytes canónicos. Pacote original preservado;pacote canónico com aplicação/reversão exactas. Recibo `outputs/sector-resource-20261111/installation.json`,conferido em2026-11-11T12:19:59.901666+00:00. + +**Disponível:** `/sectores/mineracao` —11grupos/10áreas de cadeia de valor/6projectos de referência; `/sectores/energia-especifica` —7segmentos/11áreas/10projectos/24fontes ligadas. Localização e grupo/segmento → área → dossier novo ou existente → gravação/recuperação → evidência paraSWOT. As duas referências coexistem no mesmo dossier sem substituir escolhas. Estados,períodos,divergências e locais por definir preservados;sem criar direitos,coordenadas,ofertas ou projectos reais. + +**Instalação conferida:** backup consistente e restauro isolado190tabelas;369ficheiros restaurados e conferidos porhash;22ficheiros da entrega idênticos aoGit;revisão e nove entradasHTTP200,incluindo as duas páginas sectoriais. Configuração intacta,zero migrações/importações. Nove tabelas protegidas com totais/checksums idênticos ao backup,incluindo instituições/versões/interesses,dossiers,simulações,educação,oportunidades e sectores;270instituições publicadas preservadas. + +**Saldo:** implementação e instalação deste recorte encerradas;conferência visual permanece pendente. Ofertas concretas,implantação mais precisa e dados adicionais dependem do respectivo investimento,não se presumem das referências. Restantes módulos e resíduos fiscaisL1–L7,L8,L9–L16 mantêm o saldo anterior;portal integralmente concluído não declarado. + ## Energia — consulta e preparação no mesmo dossier (QA,11/11/2026) 1. Abra **Sectores de investimento → Energia** (`/sectores/energia-especifica`). Seleccione localização e segmento energético,ou pesquise uma actividade. diff --git a/docs/investmoz/v2/auditoria-portal/backlog.md b/docs/investmoz/v2/auditoria-portal/backlog.md index dfd81ecc..5ea9ad13 100644 --- a/docs/investmoz/v2/auditoria-portal/backlog.md +++ b/docs/investmoz/v2/auditoria-portal/backlog.md @@ -1,3 +1,13 @@ +## 11/11/2026 — Mineração e Energia instaladas em f2767818 + +Entrega autorizada de542ac2ff instalada na revisão `f27678187669d18ec063a01473dc8788c713448d`. A revisão inclui a correcção técnica dos hashes e dos geradores para usar os mesmos bytesJSON emWindows eGit/Linux,detectada antes de alterar a instalação;conteúdo,interface e âmbito preservados. Os sete casos nativos/166asserções voltaram a passar sobre os bytes canónicos. Pacote original preservado;pacote canónico com aplicação/reversão exactas. Recibo `outputs/sector-resource-20261111/installation.json`,conferido em2026-11-11T12:19:59.901666+00:00. + +**Disponível:** `/sectores/mineracao` —11grupos/10áreas de cadeia de valor/6projectos de referência; `/sectores/energia-especifica` —7segmentos/11áreas/10projectos/24fontes ligadas. Localização e grupo/segmento → área → dossier novo ou existente → gravação/recuperação → evidência paraSWOT. As duas referências coexistem no mesmo dossier sem substituir escolhas. Estados,períodos,divergências e locais por definir preservados;sem criar direitos,coordenadas,ofertas ou projectos reais. + +**Instalação conferida:** backup consistente e restauro isolado190tabelas;369ficheiros restaurados e conferidos porhash;22ficheiros da entrega idênticos aoGit;revisão e nove entradasHTTP200,incluindo as duas páginas sectoriais. Configuração intacta,zero migrações/importações. Nove tabelas protegidas com totais/checksums idênticos ao backup,incluindo instituições/versões/interesses,dossiers,simulações,educação,oportunidades e sectores;270instituições publicadas preservadas. + +**Saldo:** implementação e instalação deste recorte encerradas;conferência visual permanece pendente. Ofertas concretas,implantação mais precisa e dados adicionais dependem do respectivo investimento,não se presumem das referências. Restantes módulos e resíduos fiscaisL1–L7,L8,L9–L16 mantêm o saldo anterior;portal integralmente concluído não declarado. + ## 11/11/2026 — Energia incorporada pelo mesmo percurso de Mineração, em QA **Implementação:** o sector existente `/sectores/energia-especifica` passa a apresentar o documento fornecido com7segmentos,11áreas de cadeia de valor,10projectos de referência,4riscos e24fontes com as ligações originais. Gás/upstream/construção/midstream/industrialização/mercado final,redes/hídrica,solar/baterias/eólica,hidrogénio,biocombustíveis e parques verdes mantêm o seu contexto. As três centrais solares aparecem uma vez cada,com capacidade,promotores,financiamento e estado referidos. Metoro conserva56milhõesUSD e47,3milhõesEUR,atribuídos às fontes,sem conversão ou escolha silenciosa. Previsão,operação,desenvolvimento,estudo e proposta não são tratados como estados equivalentes. diff --git a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv index ee10d9bd..55f567f4 100644 --- a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv +++ b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv @@ -32,13 +32,13 @@ RF-CLU-001,"Administrar clusters, subclusters, cadeias de valor, taxonomias e ve [Executável 312965f2c653] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. [Homologação 312965f2c653 executada] Autorização Tempo; 30 fichas privadas/30 locais/31 suportes/11 relações/2 originais e 2 definições internas, 233 caminhos conferidos. Dados anteriores/permissões preservados; zero publicação/migrations/geometrias/P7. Saldo delimitado de execução concluído. Dossier legítimo, oito lacunas e questões de autenticação/visual separadas. RECIBO-EXECUCAO-312965.json.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,," | QA01: prova positiva delimitada de atividade/cadeia e operações do lote concluída, conservando as aceitações anteriores e a semântica privada/confirmada/pública. | ATIVO01: instalação/importação/publicação autenticadas, scan, repetição idempotente, recuperação pública do ramo A/01/011/0112/01120 e preservação operacional concluídos. Provas funcionais QA aceites reutilizadas, sem repetição."," | QA01: divergência documental 600/579 e edição normativa abertas; cadeia editorial; publicação canónica com pré-condições sintéticas; save legado transacional; sem volume ou recuperação de payload legado cifrado; reversão parcial com sete fontes funcionais. Sem decisão ativa presumida. | ATIVO01: não encerra CAE integral ou divergência 600/579/edição normativa; cadeia exclusivamente editorial. Nenhuma classificação ou relação de investimento real alterada/divulgada. Limites QA anteriores e reversão parcial compatível mantidos; editor UUID ativo de /negocios continua não demonstrado e não bloqueante. Parques, duplicados e regulação Fintech separados.","0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-002,"Relacionar o cluster com projectos, oportunidades, actores e territórios.",upgrade v4 SHA f0b9815…; p. 513; requirements-audit.csv,oportunidades,/api/v1/business-opportunities; /api/v1/business-opportunities/{slug}; /investidor/terra-duat; /investidor/terra-duat/novo; /investidor/terra-duat/{id}; /investidor/terra-duat/{id}/actualizacoes; /investidor/terra-duat/{id}/documentos; /investidor/terra-duat/{id}/documentos/{attachment}; /investidor/terra-duat/{id}/editar; /investidor/terra-duat/{id}/imprimir; /investidor/terra-duat/{id}/solicitar-apoio; /management/opportunities,"OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","[INSTALADO-APIEX-SWOT-CONCURSOS-20261110] 1c75a30a na homologação,21hashes Git/HTTPS conferidos,configuração preservada,zero migrations/importações. | Histórico anterior preservado: [APIEX-SWOT-20261110] Homologação7476dc34 instalada; preparação APIEX e SWOT no dossier existente implementadas em QA, não instaladas. | Histórico anterior preservado: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Reconciliar contrato/cláusula e provas por categoria; completar apenas falha/variante executável identificada. Response normativo não é completo. Critério individual original preservado; cobertura atual ainda não individualizada.,"030000→040000 já instalados; contratos/resources existentes, sessão/MFA, ClamD e worker para ficheiros; gates das seis categorias ON. Variantes modulares/offers continuam separadas. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-002: As relações com projectos, negócios, empresas âncora, PME, fornecedores, compradores, financiadores, reguladores e instituições indicam papel, prioridade, período e estado, sem duplicar os registos de origem e com navegação nos dois sentidos.",P1,RF-CLU-002: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-002,1,"[{""id"":""RF-CLU-002"",""pedido"":""Relacionar o cluster com projectos, oportunidades, actores e territórios."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 513; requirements-audit.csv""],""aceitacao"":""As relações com projectos, negócios, empresas âncora, PME, fornecedores, compradores, financiadores, reguladores e instituições indicam papel, prioridade, período e estado, sem duplicar os registos de origem e com navegação nos dois sentidos."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""oportunidades""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.opportunities: 6 registos; public.opportunity_images: tabela ausente; public.opportunity_documents: tabela ausente; public.opportunity_location_drafts: tabela ausente,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Relações tipadas de uma oportunidade com cluster, projeto e território recuperadas; múltiplos atores empresariais não cadastrados nem inventados. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Associação tipada com cluster e recuperação do mesmo anúncio demonstradas; múltiplos atores e navegação bidirecional integral não foram demonstrados neste recorte. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral.","[INSTALADO-APIEX-SWOT-CONCURSOS-20261110] Recortes APIEX/SWOT descritos já instalados; resta visual. Concursos activo em grupo próprio no menu comum,sem mudar dados/publicações. Âmbitos normativos não mapeados e demais critérios originais permanecem. | Histórico anterior preservado: [APIEX-SWOT-20261110] Competitividade pública aprovada reutilizada na SWOT contextual privada; versões consultadas conservadas e alteração/retirada sinaliza revisão sem apagar conclusões. Não declara todas as cláusulas de clusters satisfeitas. Restam instalação deste delta e visual; períodos/regimes não mapeados continuam indeterminados. Recepção electrónica APIEX não é requisito actual nem bloqueio. Restantes critérios originais mantidos. | Histórico anterior preservado: Reconciliar contrato/cláusula e provas por categoria; completar apenas falha/variante executável identificada. Response normativo não é completo. Critério individual original preservado; cobertura atual ainda não individualizada. | Disponibilização DOC01 executada. Limitação operacional concreta: Editor no ativo: não demonstrado nesta conferência. O utilizador informou não ter acesso à conta de Promotora interna Aurora Chachuaio. A sessão efetiva Osmane Nala, conta 2, recebeu 403 em GET /minhas-oportunidades/create; não existe elevação operacional ativa. Os papéis Promotor/Validador dessa conta permanecem atribuídos; as funções de autorização v1 conferem exatamente com a versão anterior à entrega. Existem seis oportunidades legadas e nenhuma do workflow de promotor no ativo. A mensagem 403 genérica não expõe o motivo; o diagnóstico fica registado, sem alterar permissões, credenciais ou acrescentar uma correção fora do pacote autorizado. Mantêm-se as provas funcionais QA aceites do editor.; limites do critério integral: Relações tipadas de uma oportunidade com cluster, projeto e território recuperadas; múltiplos atores empresariais não cadastrados nem inventados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Recorte QA concluído; disponibilização deste incremento exige decisão específica. Associação tipada com cluster e recuperação do mesmo anúncio demonstradas; múltiplos atores e navegação bidirecional integral não foram demonstrados neste recorte. As quatro outras lacunas conservam o seu estado; provas aceites não se repetem. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Recuperação UUID no ativo não observada: conta 2 sem anúncio próprio; dois rascunhos pertencem a outro titular. Não criar dados nem alargar acesso para preencher esta limitação. Cadeia sem caso positivo, sem ensaio volumétrico e limite do payload sintético da reversão mantêm-se. Outras quatro lacunas inalteradas.","OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources","030000→040000 já instalados; contratos/resources existentes, sessão/MFA, ClamD e worker para ficheiros; gates das seis categorias ON. Variantes modulares/offers continuam separadas.","Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas.",Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: oportunidades. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito.","[INSTALADO-APIEX-SWOT-CONCURSOS-20261110] outputs/apiex-swot-concursos-delivery-20261110/{backup,restore,files-restore,verification,delivery}.json;backup/restauro190tabelas e369ficheiros. Provas QA reutilizadas. | Histórico anterior preservado: [APIEX-SWOT-20261110] outputs/investment-preparation-20261110/verification.json e artefactos sintéticos; seis casos API/211asserções,16frontend dirigidos, tipos/análise/lint. outputs/entrega-apiex-swot-20261110.zip, base7476dc34, sem migrations. Manual e saldo no início dos registos existentes. | Histórico anterior preservado: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json",oportunidades,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada, | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/OpportunityManagement.php; app/Services/OpportunityResources.php; resources/js/pages/management/opportunity-draft.tsx — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"OpportunityManagementTest, OpportunityResourcesTest, OpportunityOriginReviewTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, -RF-CLU-003,Representar a cadeia de valor e identificar lacunas de investimento.,"upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","28/10/2026: base comparativa privada carregada e código servido6d147693;435observações distintas em Gurué,237repetições fora da contagem;serviço aplicado com perfil existente,anónimo401. Conferência visual pendente. Disponibilidade histórica preservada: 28/10/2026: consulta/comparação pelas listas apenas em QA; activo mantém569a1cd7, uso ainda não demonstrado. Registo anterior preservado: Percurso proactivo instalado em9fda6d6e,incluindo56c0c6a7;análises/pilotos reais permanecem privados,sem publicação automática. | Histórico preservado: 27/10 identidade proactivaQA 3439f350,sem instalação ou análise económica real;L8 14360748 preservada. | Histórico preservado: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação. | 28/10/2026:destino569a1cd7/teste_investidor;consumidor proactivo com evidência/oferta manual,sem consulta destas listas identificada. Não extrapolar cadastros/contagens para ausência de mercado ou perda noutros ambientes. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293.","Caso CB-METROLOGIA-20261027: ficha401→dossier894343c7-c33d-452e-a6a5-b6675f77ee23; cinco evidências recuperadas e relatório; consulta anónima recusada. Provas técnicas1afab4a2 reutilizadas. | Histórico preservado: 14API/139asserções;7relatório;UI Laravel login/MFA,criar/guardar/recuperar/editar,divulgar sóQA,anónimo,dossier,recarregar/retomar;tipos/build. | Histórico preservado: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.","28/10/2026: instalado6d147693;delta técnico conferido;conferência visual autenticada pendente;requisito amplo continua parcial. Histórico anterior preservado: 28/10/2026: integração da oferta demonstrada em QA/Gurué, ainda sem instalação; cobertura nacional parcial. Estado anterior do restante requisito preservado: Uso das listas como base comparativa: não demonstrado — conferência28/10/2026;percurso proactivo entregue e provas anteriores preservados. | Estado anterior preservado: Parcial — primeiro caso com fontes reais aplicado em QA; necessidade comercial ainda hipótese, não publicado. | Histórico preservado: Parcial — primeiro percurso proactivo editorial demonstrado emQA;demais cláusulas originais conservadas. | Histórico preservado: Sem evidência suficiente | Registo da linha entregue (continuacao): Parcial — primeiro caso com fontes reais aplicado em QA; necessidade comercial ainda hipótese, não publicado. | Histórico preservado: Parcial — primeiro percurso proactivo editorial demonstrado emQA;demais cláusulas originais conservadas. | Histórico preservado: Sem evidência suficiente","28/10/2026: instalação/carregamento concluídos;restam conferência visual autenticada e pendências nacionais/comerciais delimitadas.361464observações não são empresas únicas;147165repetições não inflam contagens/comparações. Lacuna histórica preservada: 28/10/2026: ligado o catálogo interno à comparação e ao mesmo dossier em QA. Restam instalação, correspondência territorial/classificação completa, reconciliação das identidades e confirmação comercial actual; ausência de registos é informação insuficiente. Pendência anterior conservada no seu âmbito: Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. | 28/10/2026: não demonstrados carregamento/classificação e consumidor destas listas para oferta→comparação→necessidade→oportunidade. Descrição manual de oferta ou entrega do percurso não encerram esse uso.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-003: O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção.",P2,RF-CLU-003: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-003,1,"[{""id"":""RF-CLU-003"",""pedido"":""Representar a cadeia de valor e identificar lacunas de investimento."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv""],""aceitacao"":""O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"Interface autónoma entregue no âmbito demonstrado. Songo pendente de respostas externas;Gurué mantém hipótese agrícola. Instalação não confirma procura,contrato ou sustentabilidade. | Histórico preservado: 27/10: autonomia pela interface demonstrada com perfil QA autorizado: resposta anexada/recuperada,ideia revista e mesmo dossier actualizado sem publicação. Songo/Gurué intactos;sem sessão de formação real presumida. | Histórico preservado: 27/10: Songo pronto para prospecção,privado e pendente de respostas;ficha da equipa disponível. Novo piloto Gurué402/contexto1:apoio à colheita e qualidade do chá como hipótese,sem procura ou viabilidade confirmadas. | Histórico preservado: Caso regional401v3:Vulcan,EDM eNacalaLogistics são prospectos adicionais;ligação accionistaVulcan/Nacala preservada;projecto futuro fora da base. O responsável confirmou ausência de dados comerciais;sustentabilidade não demonstrada. | Histórico preservado: Cahora Bassa: actividade HCB documentada; calibração planeada2026; apoio associado no Songo como hipótese. Prazos do plano passados; sem adjudicação, ausência de oferta ou viabilidade inferidas. | Histórico preservado: Reutiliza rascunhos/auditoria/promoção/catálogo/dossier/contextos existentes;sem novos mestres ou permissões. Equipa interna prepara sem promotor real conhecido;outros âmbitos preservados. | Histórico preservado: A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Vínculo à cadeia existente e etapa documentada disponíveis; cenário têxtil apenas sintético, sem empresas ou capacidades reais. Identificação económica integral de lacunas não demonstrada. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Preparação do contrato/filtro de cadeia disponível; caso positivo não demonstrado porque não existe cadeia consultável na QA. Cadeia integral e lacunas de investimento continuam abertas. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Leitura READ ONLY de dois clones: destino restaurado com 12 setores/6 raízes editoriais/8 clusters/zero elos e ligações; QA aceite tem ainda três níveis sintéticos em setores distintos. UNIQUE economic_activities_sector_uq impede várias atividades por setor; escolha técnica, não regra identificada da Tempo. Fontes oficiais aceites preservadas, sem revalidação. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 600 versus 579 é divergência documental a reconciliar, não escolha arbitrária da Tempo. Recomendações recebidas: limitar QA aos cinco nós do exemplar por hash/versão; divisão 01 como subsector e 01120 como atividade com cinco níveis; CLU-01 como modelo editorial. Não se declara conformidade normativa integral nem execução/aceitação QA. +RF-CLU-003,Representar a cadeia de valor e identificar lacunas de investimento.,"upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","28/10/2026: base comparativa privada carregada e código servido6d147693;435observações distintas em Gurué,237repetições fora da contagem;serviço aplicado com perfil existente,anónimo401. Conferência visual pendente. Disponibilidade histórica preservada: 28/10/2026: consulta/comparação pelas listas apenas em QA; activo mantém569a1cd7, uso ainda não demonstrado. Registo anterior preservado: Percurso proactivo instalado em9fda6d6e,incluindo56c0c6a7;análises/pilotos reais permanecem privados,sem publicação automática. | Histórico preservado: 27/10 identidade proactivaQA 3439f350,sem instalação ou análise económica real;L8 14360748 preservada. | Histórico preservado: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação. | 28/10/2026:destino569a1cd7/teste_investidor;consumidor proactivo com evidência/oferta manual,sem consulta destas listas identificada. Não extrapolar cadastros/contagens para ausência de mercado ou perda noutros ambientes. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293. | 11/11/2026 — Mineração/Energia instaladas emf2767818,incluindo542ac2ff e correcção canónica antes da instalação.22ficheiros conferidos,noveHTTP200,backup/restauro190tabelas/369ficheiros,nove tabelas protegidas idênticas,270instituições preservadas,zero migrações/importações. Percurso localização/grupo → área → dossier → recuperação/SWOT disponível. Recibo outputs/sector-resource-20261111/installation.json. Conferência visual pendente;saldo anterior preservado.","Caso CB-METROLOGIA-20261027: ficha401→dossier894343c7-c33d-452e-a6a5-b6675f77ee23; cinco evidências recuperadas e relatório; consulta anónima recusada. Provas técnicas1afab4a2 reutilizadas. | Histórico preservado: 14API/139asserções;7relatório;UI Laravel login/MFA,criar/guardar/recuperar/editar,divulgar sóQA,anónimo,dossier,recarregar/retomar;tipos/build. | Histórico preservado: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.","28/10/2026: instalado6d147693;delta técnico conferido;conferência visual autenticada pendente;requisito amplo continua parcial. Histórico anterior preservado: 28/10/2026: integração da oferta demonstrada em QA/Gurué, ainda sem instalação; cobertura nacional parcial. Estado anterior do restante requisito preservado: Uso das listas como base comparativa: não demonstrado — conferência28/10/2026;percurso proactivo entregue e provas anteriores preservados. | Estado anterior preservado: Parcial — primeiro caso com fontes reais aplicado em QA; necessidade comercial ainda hipótese, não publicado. | Histórico preservado: Parcial — primeiro percurso proactivo editorial demonstrado emQA;demais cláusulas originais conservadas. | Histórico preservado: Sem evidência suficiente | Registo da linha entregue (continuacao): Parcial — primeiro caso com fontes reais aplicado em QA; necessidade comercial ainda hipótese, não publicado. | Histórico preservado: Parcial — primeiro percurso proactivo editorial demonstrado emQA;demais cláusulas originais conservadas. | Histórico preservado: Sem evidência suficiente","28/10/2026: instalação/carregamento concluídos;restam conferência visual autenticada e pendências nacionais/comerciais delimitadas.361464observações não são empresas únicas;147165repetições não inflam contagens/comparações. Lacuna histórica preservada: 28/10/2026: ligado o catálogo interno à comparação e ao mesmo dossier em QA. Restam instalação, correspondência territorial/classificação completa, reconciliação das identidades e confirmação comercial actual; ausência de registos é informação insuficiente. Pendência anterior conservada no seu âmbito: Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. | 28/10/2026: não demonstrados carregamento/classificação e consumidor destas listas para oferta→comparação→necessidade→oportunidade. Descrição manual de oferta ou entrega do percurso não encerram esse uso.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-003: O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção.",P2,RF-CLU-003: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-003,1,"[{""id"":""RF-CLU-003"",""pedido"":""Representar a cadeia de valor e identificar lacunas de investimento."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv""],""aceitacao"":""O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"Interface autónoma entregue no âmbito demonstrado. Songo pendente de respostas externas;Gurué mantém hipótese agrícola. Instalação não confirma procura,contrato ou sustentabilidade. | Histórico preservado: 27/10: autonomia pela interface demonstrada com perfil QA autorizado: resposta anexada/recuperada,ideia revista e mesmo dossier actualizado sem publicação. Songo/Gurué intactos;sem sessão de formação real presumida. | Histórico preservado: 27/10: Songo pronto para prospecção,privado e pendente de respostas;ficha da equipa disponível. Novo piloto Gurué402/contexto1:apoio à colheita e qualidade do chá como hipótese,sem procura ou viabilidade confirmadas. | Histórico preservado: Caso regional401v3:Vulcan,EDM eNacalaLogistics são prospectos adicionais;ligação accionistaVulcan/Nacala preservada;projecto futuro fora da base. O responsável confirmou ausência de dados comerciais;sustentabilidade não demonstrada. | Histórico preservado: Cahora Bassa: actividade HCB documentada; calibração planeada2026; apoio associado no Songo como hipótese. Prazos do plano passados; sem adjudicação, ausência de oferta ou viabilidade inferidas. | Histórico preservado: Reutiliza rascunhos/auditoria/promoção/catálogo/dossier/contextos existentes;sem novos mestres ou permissões. Equipa interna prepara sem promotor real conhecido;outros âmbitos preservados. | Histórico preservado: A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Vínculo à cadeia existente e etapa documentada disponíveis; cenário têxtil apenas sintético, sem empresas ou capacidades reais. Identificação económica integral de lacunas não demonstrada. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Preparação do contrato/filtro de cadeia disponível; caso positivo não demonstrado porque não existe cadeia consultável na QA. Cadeia integral e lacunas de investimento continuam abertas. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Leitura READ ONLY de dois clones: destino restaurado com 12 setores/6 raízes editoriais/8 clusters/zero elos e ligações; QA aceite tem ainda três níveis sintéticos em setores distintos. UNIQUE economic_activities_sector_uq impede várias atividades por setor; escolha técnica, não regra identificada da Tempo. Fontes oficiais aceites preservadas, sem revalidação. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 600 versus 579 é divergência documental a reconciliar, não escolha arbitrária da Tempo. Recomendações recebidas: limitar QA aos cinco nós do exemplar por hash/versão; divisão 01 como subsector e 01120 como atividade com cinco níveis; CLU-01 como modelo editorial. Não se declara conformidade normativa integral nem execução/aceitação QA. [RECONCILIACAO-43-20261019] 4: Gestão /management/economic-references/lot-01 ainda exige gate global. Catálogo restante requer reconciliação por identidade/edição e lote, não inferência por contagens.","Conferência desta entrega: Gurué→consultar oferta→comparar ideia→guardar→recuperar no mesmo dossier,com fonte/data/incertezas;435observações não empresas únicas,listas internas,cobertura parcial,hipótese. Não confundir com pendências nacionais amplas anteriores. Histórico preservado: 28/10/2026: conferência visual autenticada do percurso instalado;correspondência nacional parcial(205608semterritório único,336sóprovíncia,82864semCAE,113880divergências de denominação/identificador);confirmar oferta/procura/viabilidade actual sem inferir mercado desocupado. Critérios históricos preservados no âmbito restante: 28/10/2026: conferir entrega activa;reconciliar205608 observações sem território único,336 só com província,82864 sem designação CAE e113880 com divergências de denominação/identificador;confirmar oferta/procura actual sem inferir mercado desocupado;uso real da equipa pendente. Restantes critérios anteriores preservados: Concluir apenas com evidência económica local por caso;provar participação/contrato/acesso quando alegados. Automatização e quantificação futura dependem de dados/pressupostos explícitos;sem fecho global deste requisito. | Histórico preservado: Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. | Disponibilização DOC01 executada. Limitação operacional concreta: Editor no ativo: não demonstrado nesta conferência. O utilizador informou não ter acesso à conta de Promotora interna Aurora Chachuaio. A sessão efetiva Osmane Nala, conta 2, recebeu 403 em GET /minhas-oportunidades/create; não existe elevação operacional ativa. Os papéis Promotor/Validador dessa conta permanecem atribuídos; as funções de autorização v1 conferem exatamente com a versão anterior à entrega. Existem seis oportunidades legadas e nenhuma do workflow de promotor no ativo. A mensagem 403 genérica não expõe o motivo; o diagnóstico fica registado, sem alterar permissões, credenciais ou acrescentar uma correção fora do pacote autorizado. Mantêm-se as provas funcionais QA aceites do editor.; limites do critério integral: Vínculo à cadeia existente e etapa documentada disponíveis; cenário têxtil apenas sintético, sem empresas ou capacidades reais. Identificação económica integral de lacunas não demonstrada. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Recorte QA concluído; disponibilização deste incremento exige decisão específica. Preparação do contrato/filtro de cadeia disponível; caso positivo não demonstrado porque não existe cadeia consultável na QA. Cadeia integral e lacunas de investimento continuam abertas. As quatro outras lacunas conservam o seu estado; provas aceites não se repetem. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Recuperação UUID no ativo não observada: conta 2 sem anúncio próprio; dois rascunhos pertencem a outro titular. Não criar dados nem alargar acesso para preencher esta limitação. Cadeia sem caso positivo, sem ensaio volumétrico e limite do payload sintético da reversão mantêm-se. Outras quatro lacunas inalteradas. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Preparar manifesto fechado, adaptar cardinalidade/hierarquia sem copiar mestres, demonstrar preview/idempotência/recusas e caso positivo de cadeia nos dois consumidores; recuperação, decisão independente, divulgação expressa, filtros AND e reversão após edição pelo código anterior com compatibilidade. Nada demonstrado/encerrado por este mapa. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Implementação/provas funcionais e operacionais apenas após decisão QA. Incluir HTTP com esquema ausente, importação privada, publicação e retirada distintas, recusas de identidade/MFA/CSRF/hash, replay/concorrência e motivos visíveis. Reversão após uso é parcial e compatível: schema/dados, seis fontes funcionais, manifesto e build de compatibilidade coerente permanecem; provar edição posterior. Caso positivo de cadeia segue pendente nos dois consumidores. [UTILIZACAO-HOMOLOGACAO-20261019] 4: Disponibilidade condicionada conforme limite registado — 11 actividades presentes; cinco novas referências transportadas. Activação/publicação do lote não executada. -[UTILIZACAO-HOMOLOGACAO-20261019] Correcção por leitura:11 actividades já published, sem nova activação necessária; cobertura integral e cálculos separados. Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global. | Uso destaslistas:NÃO DEMONSTRADO.Demonstrar localização→oferta consultável porsector/actividade→compararideia(concorrência/complementares/parceiros)→necessidade fundamentada→oportunidade privada guardada/recuperada,comlinha/lote/fonte/data/cobertura/incertezas.Não concluir por campos textuais ou registos sintéticos. | Mineração: falta instalar este delta e conferir visualmente; informação territorial mais precisa e oportunidades concretas exigem dados próprios,não se presumem do levantamento. Os restantes critérios deste requisito mantêm-se. | Energia/Mineração:entrega agrupada e conferência visual pendentes;outros critérios anteriores preservados.","OpportunityManagement/management_draft,auditoria cifrada,OpportunityPromotion,geo_locations,sectors,value_chains,documentos e escolhas por ideia no dossier/simulador. | Histórico preservado: InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: sectors, reference_catalog_versions, economic_activities, economic_clusters, value_chains/value_chain_links, opções/decisão/projeção canónicas e suplemento /negocios existentes. UUID de referência publicado/v12 e restantes classificações intactos.","Correcção Tempo28/10:6d147693 instalado;host do conector indisponível (The browser access host is unavailable). Aba aberta não resolve por si só. Restabelecer conector ou conferência autenticada da equipa;sem reinstalar/repetir provas aceites. Histórico preservado: 28/10/2026: entregaGit e carregamento privado concluídos;sem nova autenticação de fontes ou aprovadores;validação visual depende de sessão real e URL confirmado pelo mecanismo do navegador. Não publicar listas nem copiar actores/dossiers QA para activo. Dependências históricas preservadas: 28/10/2026: originais e CAE reutilizados;sem nova validação genérica de autenticidade ou aprovador. Instalação activa exige o procedimento Git existente,backup/restauro e autenticação;correspondências ambíguas ficam explícitas sem bloquear os registos resolvidos. Dependências anteriores no âmbito restante: Dados comerciais externos paraSongo;descoberta dirigida da necessidade e intervenientes emGurué. Instalação técnica deste incremento concluída;publicação real separada. | Histórico preservado: Instalação:capacidade/inodes,main actual,backup/restauro fresco e delta servido. Songo:respostas externas;Gurué:necessidade comercial por confirmar. Independentes da disponibilidade técnica. | Histórico preservado: Songo:inventários/programas/interesse e propostas dos parceiros,distinguindo centros de compra. Gurué:problema actual,critérios,janelas,papéis e pagador. Entrega técnica independente;instalação aguarda capacidade medida. | Histórico preservado: Comercial apenas deste caso:inventários/programas por comprador,volumes,capacidade/preço de parceiros e custo de missões/rotas. Sem frequência anual presumida,zeros ou dupla contagem. Entrega técnica1afab4a2independente. | Histórico preservado: Validação comercial limita apenas a hipótese CB-METROLOGIA;não bloqueia entrega técnica1afab4a2. Confirmar recorrência,volumes/âmbito,parceiros e vantagem;admitir necessidade futura ou arquivo fundamentado se satisfeita. | Histórico preservado: Estado/recorrência das compras, instrumentos/quantidades/requisitos, oferta e parceiros actuais, vantagem/custos; confirmar cada ponto com o comprador e prestadores. Sem contacto externo ou bloqueio pela capacidade do servidor. | Histórico preservado: Método Ruanda disponível(PDF2007,31p;PPT2008,50slides);metodologia não confirma procura local. Fontes internas não divulgadas;revisão semântica editorial no fluxo existente. | Histórico preservado: QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Folhas eBAU: 1360 códigos em cinco níveis; duas cópias de hashes diferentes com as mesmas 8145 células. 600 subclasses versus 579 no roteiro; edição da folha não determinada. Convenções divisão 01/subclasse 01120 e cinco elos editoriais do CLU-01 propostas para decisão. Não associar por nomes. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Caminho operacional desenhado desde já por extensão autenticada do padrão existente: prévia e POST separados de esquema/importação privada/publicação/retirada; ator da sessão, autorização efetiva, MFA concluído, CSRF, hashes, scan, idempotência e backup/restauro fresco. Ainda não implementado/instalado; não deixado para depois da aceitação. Não alterar instaladores de B/COUNTRY02 ou importador documental. | Decisão expressaTempo28/10:baseinterna de análise,sem directórioautomático. Delimitar importações/edições/duplicados e mapeamentos existentes;ausência de registo não significa ausência de oferta.Nenhum novo aprovador,autenticidade oficial genérica ou alargamento de permissões inferidos.","Pedido expresso27/10:encerrar aprofundamento do Songo nesta passagem;prospecção externa e viabilidade quando chegarem respostas;avançar próximo piloto territorial,privado. Publicação e instalação continuam separadas. | Histórico preservado: Decisão expressa:concursos são evidência de procura para oportunidades geradas;foco em cliente,problema,valor,recursos/parcerias e dossier,sem produto de gestão de concursos. | Histórico preservado: Pedido expressoTempo27/10:primeiro incremento emQA,sem integrarL8/instalar/limparservidor/alterarSGF. Sem novo aprovador organizacional. | Histórico preservado: Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Proposto um catálogo de origem na mesma estrutura, cinco nós A/01/011/0112/01120, cinco elos e quatro ligações; 15 registos de referência, sem alterar raízes/associações existentes. Ativo fora do âmbito. Parques a seguir; duplicados e regulação Fintech separados. /negocios concluído no âmbito reportado; observação UUID ativa não demonstrada e não bloqueante; anexos dessa disponibilização não conferidos pela Tempo. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Recomendações não constituem autorização. Proposta QA revista inclui 12 artefactos (dez fontes/uma migration/um manifesto), quatro fontes adicionais para resolver a operação autenticada, compilação e dois instrumentos QA. Lote mantém 15 referências; zero alterações a mestres/classificações existentes. Ativo separado.",Implementação e demonstraçãoQA do recorte;conteúdo económico real por confirmar e automação futura separados. | Histórico preservado: Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: QA restante 12–18 h: manifesto 2–3; schema/preview/importação 2–3; adaptador/apresentação 3–4; provas/reversão 4–6; documentação/recibo 1–2. Exclui decisão, importação integral e disponibilização ativa. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 12–18 h eram QA funcional; +2–4 h para implementar/provar o caminho operacional em QA, total QA revisto 14–22 h. Disponibilização futura 2–4 h separadas, incluindo backup/restauro fresco, condicionada a decisão própria. Sem tempo executado ou consentimento inferidos. | QA01: preparação deste recorte concluída, saldo QA zero. Estimativa original 12–18 h funcionais, +2–4 h operacionais DOC01 =14–22 h, sem aumento adicional pelo ficheiro de compatibilidade. Disponibilização futura 2–4 h separadas, dependente de autorização, janela e backup/restauro fresco. | ATIVO01: saldo operacional deste lote zero. Estimativa anterior de disponibilização 2–4 h arquivada como previsão, não horas consumidas; não foi ensaio funcional repetido. Lotes económicos posteriores, parques, duplicados e Fintech exigem delimitação própria.","28/10/2026: proactive-supply-git-delivery-20261028.json;backup/restauro174tabelas/369ficheiros;importação idempotente361464;serviço instaladoGurué435/237;RLS0semactor;anónimo401;linhas anteriores e369ficheiros preservados;CIhabitual passou;QA7/62reutilizado,delta1/2. Evidência histórica preservada: 28/10/2026: proactive-existing-supply-qa-20261028.json;361464 observações privadas;435 distintas em Gurué (410 na demonstração inicial);2 comparações reais;rascunho402v2 e mesmo dossier/contexto2;5 evidências prévias conservadas;7 testes/62 asserções,tipos/build e navegador;nenhuma publicação. 18423 sem denominação conservadas;343041 observações anteriores idênticas;extensão idempotente. Provas anteriores conservadas: Recibo sequential-delivery-installed-20261027.json:174tabelas restauradas,172tabelas de negócio e369ficheiros intactos por etapa;schema/grants/permissões preservados;996/1000fontes conferidas;revisões servidasc85e772d→9fda6d6e. Falha de teste dependente de outputlocal corrigida eminput sintético portátil;runtimeproactivo igual56c0c6a7. Sem importação defixtures/pilotos ou mudanças noSGF. | Histórico preservado: FichaQA403v4,dossiercontexto2,anexo ClamAV e hash igual ao original. Correcção51d536b7:complementos não tratam preparação privada como origem pública perdida. 2testes/18asserções;provas aceites reutilizadas. Guia no manual;recibo proactive-team-autonomy-qa-20261027.json. | Histórico preservado: Ficha de prospecção PDF2p/42campos reaberta e revista. Novo casoGurué402v1,dossiercontexto1,5referências,recuperação/relatório existentes. Todos os dados anteriores eSongo401v3intactos. Recibo proactive-handoff-gurue-qa-20261027.json;sem código novo,contacto externo,instalação ou repetição de provas. | Histórico preservado: Ficha401/contexto3com11evidências,relatório recuperado e históricos intactos. Recibo proactive-regional-clients-qa-20261027.json;fontes primárias regionais;sem nova funcionalidade,testes repetidos,instalação ou publicação. | Histórico preservado: FichaQA401v2,dossiercontexto2;7fontes recuperadas;anúncio HCB17/08/2026 e âmbitoIPACM0100;provas técnicas reutilizadas. Recibo proactive-opportunity-model-qa-20261027.json;sem novo código,publicação ou instalação. | Histórico preservado: docs/investmoz/unification/proactive-real-pilot-qa-20261027.json;outputs/proactive-real-pilot-20261027/;originais/linhasQAanteriores preservados;sem delta funcional ou instalação. | Histórico preservado: docs/investmoz/unification/proactive-investment-first-qa-20261027.json;outputs/proactive-investment-20261027/;89motores/31originais fiscais e2Ruanda preservados. | Histórico preservado: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json | outputs/investmoz-referencias-economicas-mapa-20261016/MAPA-LOTE-MINIMO.md; ESTADO-QA-READONLY.json; DEPENDENCIAS-QA-READONLY.json; INVENTARIO-ACERVO.json; CAE-ESTRUTURA.json; LOTE-PROPOSTO.json; FONTES-E-DELTA-PREVISTO.json. Inspeção e planeamento, não aceitação funcional. | outputs/investmoz-referencias-economicas-mapa-20261016/DOC01/MAPA-LOTE-MINIMO.md; DESENHO-OPERACIONAL.md; LOTE-PROPOSTO.json; INSPECAO-MECANISMO-EXISTENTE.json; ENQUADRAMENTO-RECOMENDACOES.json. Revisão de desenho/documentos, sem novo teste ou ligação à base ativa. | 16/10/2026 QA01 referencias-economicas-QA-966202f15577: ramo A/01/011/0112/01120 e cinco elos editoriais CLU-01 demonstrados em clone isolado, com caso positivo de atividade/cadeia nos consumidores canónico e /negocios, filtros, recuperação, confirmação independente e divulgação expressa. Preview, instalação nominal autenticada, importação privada, scan real, repetição, publicação/retirada e reversão compatível demonstrados. Provas: outputs/investmoz-referencias-economicas-QA-20261016/para-revisao/RELATORIO-QA.md; HTTP-QA.json; REVERSAO-QA.json; PRESERVACAO-QA.json. Ativo não alterado; original publicado/v12 preservado. Cinco etapas editoriais e quatro ligações com UUID, origem e versão preservados; sem consolidação comercial. | 16/10/2026 ATIVO01 referencias-economicas-QA-966202f15577: disponibilização autorizada e concluída no recorte. 13 artefactos, build de 162 ficheiros, migration nominal via sessão real da conta 2, importação privada das 15 ausências e publicação expressa separada, ClamAV real limpo. Repetição recuperou o mesmo recibo sem duplicação. Backup fresco/restauro isolado e arranque em leitura verificados. API pública recupera cinco níveis; catálogo anterior igual. Comparação de 295 tabelas sem diferenças inesperadas de negócio/histórico; B, COUNTRY02, permissões e documentos preservados. Evidência: outputs/investmoz-referencias-economicas-ativacao-20261016/para-revisao/RELATORIO-FINAL.md; PRESERVACAO-FINAL.json; HTTP-PUBLISHED.json. | Homologação teste-investidor 19/10/2026: Referências económicas — lote mínimo=Ausente. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Referências económicas — lote mínimo=Instalado mas desabilitado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. +[UTILIZACAO-HOMOLOGACAO-20261019] Correcção por leitura:11 actividades já published, sem nova activação necessária; cobertura integral e cálculos separados. Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global. | Uso destaslistas:NÃO DEMONSTRADO.Demonstrar localização→oferta consultável porsector/actividade→compararideia(concorrência/complementares/parceiros)→necessidade fundamentada→oportunidade privada guardada/recuperada,comlinha/lote/fonte/data/cobertura/incertezas.Não concluir por campos textuais ou registos sintéticos. | Mineração: falta instalar este delta e conferir visualmente; informação territorial mais precisa e oportunidades concretas exigem dados próprios,não se presumem do levantamento. Os restantes critérios deste requisito mantêm-se. | Energia/Mineração:entrega agrupada e conferência visual pendentes;outros critérios anteriores preservados. | Entrega sectorial Mineração/Energia instalada;resta conferência visual deste recorte. Critérios anteriores fora do recorte permanecem.","OpportunityManagement/management_draft,auditoria cifrada,OpportunityPromotion,geo_locations,sectors,value_chains,documentos e escolhas por ideia no dossier/simulador. | Histórico preservado: InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: sectors, reference_catalog_versions, economic_activities, economic_clusters, value_chains/value_chain_links, opções/decisão/projeção canónicas e suplemento /negocios existentes. UUID de referência publicado/v12 e restantes classificações intactos.","Correcção Tempo28/10:6d147693 instalado;host do conector indisponível (The browser access host is unavailable). Aba aberta não resolve por si só. Restabelecer conector ou conferência autenticada da equipa;sem reinstalar/repetir provas aceites. Histórico preservado: 28/10/2026: entregaGit e carregamento privado concluídos;sem nova autenticação de fontes ou aprovadores;validação visual depende de sessão real e URL confirmado pelo mecanismo do navegador. Não publicar listas nem copiar actores/dossiers QA para activo. Dependências históricas preservadas: 28/10/2026: originais e CAE reutilizados;sem nova validação genérica de autenticidade ou aprovador. Instalação activa exige o procedimento Git existente,backup/restauro e autenticação;correspondências ambíguas ficam explícitas sem bloquear os registos resolvidos. Dependências anteriores no âmbito restante: Dados comerciais externos paraSongo;descoberta dirigida da necessidade e intervenientes emGurué. Instalação técnica deste incremento concluída;publicação real separada. | Histórico preservado: Instalação:capacidade/inodes,main actual,backup/restauro fresco e delta servido. Songo:respostas externas;Gurué:necessidade comercial por confirmar. Independentes da disponibilidade técnica. | Histórico preservado: Songo:inventários/programas/interesse e propostas dos parceiros,distinguindo centros de compra. Gurué:problema actual,critérios,janelas,papéis e pagador. Entrega técnica independente;instalação aguarda capacidade medida. | Histórico preservado: Comercial apenas deste caso:inventários/programas por comprador,volumes,capacidade/preço de parceiros e custo de missões/rotas. Sem frequência anual presumida,zeros ou dupla contagem. Entrega técnica1afab4a2independente. | Histórico preservado: Validação comercial limita apenas a hipótese CB-METROLOGIA;não bloqueia entrega técnica1afab4a2. Confirmar recorrência,volumes/âmbito,parceiros e vantagem;admitir necessidade futura ou arquivo fundamentado se satisfeita. | Histórico preservado: Estado/recorrência das compras, instrumentos/quantidades/requisitos, oferta e parceiros actuais, vantagem/custos; confirmar cada ponto com o comprador e prestadores. Sem contacto externo ou bloqueio pela capacidade do servidor. | Histórico preservado: Método Ruanda disponível(PDF2007,31p;PPT2008,50slides);metodologia não confirma procura local. Fontes internas não divulgadas;revisão semântica editorial no fluxo existente. | Histórico preservado: QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Folhas eBAU: 1360 códigos em cinco níveis; duas cópias de hashes diferentes com as mesmas 8145 células. 600 subclasses versus 579 no roteiro; edição da folha não determinada. Convenções divisão 01/subclasse 01120 e cinco elos editoriais do CLU-01 propostas para decisão. Não associar por nomes. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Caminho operacional desenhado desde já por extensão autenticada do padrão existente: prévia e POST separados de esquema/importação privada/publicação/retirada; ator da sessão, autorização efetiva, MFA concluído, CSRF, hashes, scan, idempotência e backup/restauro fresco. Ainda não implementado/instalado; não deixado para depois da aceitação. Não alterar instaladores de B/COUNTRY02 ou importador documental. | Decisão expressaTempo28/10:baseinterna de análise,sem directórioautomático. Delimitar importações/edições/duplicados e mapeamentos existentes;ausência de registo não significa ausência de oferta.Nenhum novo aprovador,autenticidade oficial genérica ou alargamento de permissões inferidos.","Pedido expresso27/10:encerrar aprofundamento do Songo nesta passagem;prospecção externa e viabilidade quando chegarem respostas;avançar próximo piloto territorial,privado. Publicação e instalação continuam separadas. | Histórico preservado: Decisão expressa:concursos são evidência de procura para oportunidades geradas;foco em cliente,problema,valor,recursos/parcerias e dossier,sem produto de gestão de concursos. | Histórico preservado: Pedido expressoTempo27/10:primeiro incremento emQA,sem integrarL8/instalar/limparservidor/alterarSGF. Sem novo aprovador organizacional. | Histórico preservado: Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Proposto um catálogo de origem na mesma estrutura, cinco nós A/01/011/0112/01120, cinco elos e quatro ligações; 15 registos de referência, sem alterar raízes/associações existentes. Ativo fora do âmbito. Parques a seguir; duplicados e regulação Fintech separados. /negocios concluído no âmbito reportado; observação UUID ativa não demonstrada e não bloqueante; anexos dessa disponibilização não conferidos pela Tempo. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Recomendações não constituem autorização. Proposta QA revista inclui 12 artefactos (dez fontes/uma migration/um manifesto), quatro fontes adicionais para resolver a operação autenticada, compilação e dois instrumentos QA. Lote mantém 15 referências; zero alterações a mestres/classificações existentes. Ativo separado.",Implementação e demonstraçãoQA do recorte;conteúdo económico real por confirmar e automação futura separados. | Histórico preservado: Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: QA restante 12–18 h: manifesto 2–3; schema/preview/importação 2–3; adaptador/apresentação 3–4; provas/reversão 4–6; documentação/recibo 1–2. Exclui decisão, importação integral e disponibilização ativa. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 12–18 h eram QA funcional; +2–4 h para implementar/provar o caminho operacional em QA, total QA revisto 14–22 h. Disponibilização futura 2–4 h separadas, incluindo backup/restauro fresco, condicionada a decisão própria. Sem tempo executado ou consentimento inferidos. | QA01: preparação deste recorte concluída, saldo QA zero. Estimativa original 12–18 h funcionais, +2–4 h operacionais DOC01 =14–22 h, sem aumento adicional pelo ficheiro de compatibilidade. Disponibilização futura 2–4 h separadas, dependente de autorização, janela e backup/restauro fresco. | ATIVO01: saldo operacional deste lote zero. Estimativa anterior de disponibilização 2–4 h arquivada como previsão, não horas consumidas; não foi ensaio funcional repetido. Lotes económicos posteriores, parques, duplicados e Fintech exigem delimitação própria.","28/10/2026: proactive-supply-git-delivery-20261028.json;backup/restauro174tabelas/369ficheiros;importação idempotente361464;serviço instaladoGurué435/237;RLS0semactor;anónimo401;linhas anteriores e369ficheiros preservados;CIhabitual passou;QA7/62reutilizado,delta1/2. Evidência histórica preservada: 28/10/2026: proactive-existing-supply-qa-20261028.json;361464 observações privadas;435 distintas em Gurué (410 na demonstração inicial);2 comparações reais;rascunho402v2 e mesmo dossier/contexto2;5 evidências prévias conservadas;7 testes/62 asserções,tipos/build e navegador;nenhuma publicação. 18423 sem denominação conservadas;343041 observações anteriores idênticas;extensão idempotente. Provas anteriores conservadas: Recibo sequential-delivery-installed-20261027.json:174tabelas restauradas,172tabelas de negócio e369ficheiros intactos por etapa;schema/grants/permissões preservados;996/1000fontes conferidas;revisões servidasc85e772d→9fda6d6e. Falha de teste dependente de outputlocal corrigida eminput sintético portátil;runtimeproactivo igual56c0c6a7. Sem importação defixtures/pilotos ou mudanças noSGF. | Histórico preservado: FichaQA403v4,dossiercontexto2,anexo ClamAV e hash igual ao original. Correcção51d536b7:complementos não tratam preparação privada como origem pública perdida. 2testes/18asserções;provas aceites reutilizadas. Guia no manual;recibo proactive-team-autonomy-qa-20261027.json. | Histórico preservado: Ficha de prospecção PDF2p/42campos reaberta e revista. Novo casoGurué402v1,dossiercontexto1,5referências,recuperação/relatório existentes. Todos os dados anteriores eSongo401v3intactos. Recibo proactive-handoff-gurue-qa-20261027.json;sem código novo,contacto externo,instalação ou repetição de provas. | Histórico preservado: Ficha401/contexto3com11evidências,relatório recuperado e históricos intactos. Recibo proactive-regional-clients-qa-20261027.json;fontes primárias regionais;sem nova funcionalidade,testes repetidos,instalação ou publicação. | Histórico preservado: FichaQA401v2,dossiercontexto2;7fontes recuperadas;anúncio HCB17/08/2026 e âmbitoIPACM0100;provas técnicas reutilizadas. Recibo proactive-opportunity-model-qa-20261027.json;sem novo código,publicação ou instalação. | Histórico preservado: docs/investmoz/unification/proactive-real-pilot-qa-20261027.json;outputs/proactive-real-pilot-20261027/;originais/linhasQAanteriores preservados;sem delta funcional ou instalação. | Histórico preservado: docs/investmoz/unification/proactive-investment-first-qa-20261027.json;outputs/proactive-investment-20261027/;89motores/31originais fiscais e2Ruanda preservados. | Histórico preservado: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json | outputs/investmoz-referencias-economicas-mapa-20261016/MAPA-LOTE-MINIMO.md; ESTADO-QA-READONLY.json; DEPENDENCIAS-QA-READONLY.json; INVENTARIO-ACERVO.json; CAE-ESTRUTURA.json; LOTE-PROPOSTO.json; FONTES-E-DELTA-PREVISTO.json. Inspeção e planeamento, não aceitação funcional. | outputs/investmoz-referencias-economicas-mapa-20261016/DOC01/MAPA-LOTE-MINIMO.md; DESENHO-OPERACIONAL.md; LOTE-PROPOSTO.json; INSPECAO-MECANISMO-EXISTENTE.json; ENQUADRAMENTO-RECOMENDACOES.json. Revisão de desenho/documentos, sem novo teste ou ligação à base ativa. | 16/10/2026 QA01 referencias-economicas-QA-966202f15577: ramo A/01/011/0112/01120 e cinco elos editoriais CLU-01 demonstrados em clone isolado, com caso positivo de atividade/cadeia nos consumidores canónico e /negocios, filtros, recuperação, confirmação independente e divulgação expressa. Preview, instalação nominal autenticada, importação privada, scan real, repetição, publicação/retirada e reversão compatível demonstrados. Provas: outputs/investmoz-referencias-economicas-QA-20261016/para-revisao/RELATORIO-QA.md; HTTP-QA.json; REVERSAO-QA.json; PRESERVACAO-QA.json. Ativo não alterado; original publicado/v12 preservado. Cinco etapas editoriais e quatro ligações com UUID, origem e versão preservados; sem consolidação comercial. | 16/10/2026 ATIVO01 referencias-economicas-QA-966202f15577: disponibilização autorizada e concluída no recorte. 13 artefactos, build de 162 ficheiros, migration nominal via sessão real da conta 2, importação privada das 15 ausências e publicação expressa separada, ClamAV real limpo. Repetição recuperou o mesmo recibo sem duplicação. Backup fresco/restauro isolado e arranque em leitura verificados. API pública recupera cinco níveis; catálogo anterior igual. Comparação de 295 tabelas sem diferenças inesperadas de negócio/histórico; B, COUNTRY02, permissões e documentos preservados. Evidência: outputs/investmoz-referencias-economicas-ativacao-20261016/para-revisao/RELATORIO-FINAL.md; PRESERVACAO-FINAL.json; HTTP-PUBLISHED.json. | Homologação teste-investidor 19/10/2026: Referências económicas — lote mínimo=Ausente. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Referências económicas — lote mínimo=Instalado mas desabilitado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. [UTILIZACAO-HOMOLOGACAO-20261019] Leitura nominal de contas/recursos no destino; saldo18/10; prévia29 sem escrita; comparação de hashes QA separados. outputs/investmoz-disponibilizacao-integral-20261019/UTILIZACAO-EFECTIVA-HOMOLOGACAO.md @@ -53,7 +53,7 @@ RF-CLU-003,Representar a cadeia de valor e identificar lacunas de investimento., [Executável c11a0c74766c] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. [Executável 82dab3719ffc] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. [Executável 312965f2c653] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. -[Homologação 312965f2c653 executada] Autorização Tempo; 30 fichas privadas/30 locais/31 suportes/11 relações/2 originais e 2 definições internas, 233 caminhos conferidos. Dados anteriores/permissões preservados; zero publicação/migrations/geometrias/P7. Saldo delimitado de execução concluído. Dossier legítimo, oito lacunas e questões de autenticação/visual separadas. RECIBO-EXECUCAO-312965.json. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos. | 23/10/2026: complementos instalados na homologação d8224ba8 pelo processo Git; delta conferido, sem importações/migrations ou fixtures QA; ver recibo investment-complements-qa-receipt-20261023.json. Provas anteriores preservadas; aplicação transversal parcial e contextos específicos dos quatro formulários pendentes. | 28/10/2026:existing-supply-lists-audit-20261028.json;13ficheiros inventariados,4originaisXLSXpreservados;consulta activa READONLY198tabelas,consumidor/hashGit conferidos.Gurué canónico existe;passo oferta daslistas não demonstrado,logo sem fecho do fluxo.Sem escrita/import/publicação/testes novos;pilotos manuais e entrega proactiva preservados. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293.",território,"27/10/2026 — identidade proactiva,primeiro incremento QA | Histórico preservado: 12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada", | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,," | QA01: prova positiva delimitada de atividade/cadeia e operações do lote concluída, conservando as aceitações anteriores e a semântica privada/confirmada/pública. | ATIVO01: instalação/importação/publicação autenticadas, scan, repetição idempotente, recuperação pública do ramo A/01/011/0112/01120 e preservação operacional concluídos. Provas funcionais QA aceites reutilizadas, sem repetição.","Só percurso técnico com fixtures sintéticas. Hipótese/necessidade/ideia/projecto/oferta não equiparados;sem procura,viabilidade,contrato,acesso ou benefício fiscal presumidos. | Histórico preservado: | QA01: divergência documental 600/579 e edição normativa abertas; cadeia editorial; publicação canónica com pré-condições sintéticas; save legado transacional; sem volume ou recuperação de payload legado cifrado; reversão parcial com sete fontes funcionais. Sem decisão ativa presumida. | ATIVO01: não encerra CAE integral ou divergência 600/579/edição normativa; cadeia exclusivamente editorial. Nenhuma classificação ou relação de investimento real alterada/divulgada. Limites QA anteriores e reversão parcial compatível mantidos; editor UUID ativo de /negocios continua não demonstrado e não bloqueante. Parques, duplicados e regulação Fintech separados.","0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,,"Aplicação real preliminar privada emQA demonstrada;cláusulas integrais e pendências conservadas;sem publicação real ou validação comercial. | Histórico preservado: Primeiro incremento proactivo QA demonstrado;requisito global parcial,sem instalação nem validação económica real." +[Homologação 312965f2c653 executada] Autorização Tempo; 30 fichas privadas/30 locais/31 suportes/11 relações/2 originais e 2 definições internas, 233 caminhos conferidos. Dados anteriores/permissões preservados; zero publicação/migrations/geometrias/P7. Saldo delimitado de execução concluído. Dossier legítimo, oito lacunas e questões de autenticação/visual separadas. RECIBO-EXECUCAO-312965.json. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos. | 23/10/2026: complementos instalados na homologação d8224ba8 pelo processo Git; delta conferido, sem importações/migrations ou fixtures QA; ver recibo investment-complements-qa-receipt-20261023.json. Provas anteriores preservadas; aplicação transversal parcial e contextos específicos dos quatro formulários pendentes. | 28/10/2026:existing-supply-lists-audit-20261028.json;13ficheiros inventariados,4originaisXLSXpreservados;consulta activa READONLY198tabelas,consumidor/hashGit conferidos.Gurué canónico existe;passo oferta daslistas não demonstrado,logo sem fecho do fluxo.Sem escrita/import/publicação/testes novos;pilotos manuais e entrega proactiva preservados. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293. | 11/11/2026 — Mineração/Energia instaladas emf2767818,incluindo542ac2ff e correcção canónica antes da instalação.22ficheiros conferidos,noveHTTP200,backup/restauro190tabelas/369ficheiros,nove tabelas protegidas idênticas,270instituições preservadas,zero migrações/importações. Percurso localização/grupo → área → dossier → recuperação/SWOT disponível. Recibo outputs/sector-resource-20261111/installation.json. Conferência visual pendente;saldo anterior preservado.",território,"27/10/2026 — identidade proactiva,primeiro incremento QA | Histórico preservado: 12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada", | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,," | QA01: prova positiva delimitada de atividade/cadeia e operações do lote concluída, conservando as aceitações anteriores e a semântica privada/confirmada/pública. | ATIVO01: instalação/importação/publicação autenticadas, scan, repetição idempotente, recuperação pública do ramo A/01/011/0112/01120 e preservação operacional concluídos. Provas funcionais QA aceites reutilizadas, sem repetição.","Só percurso técnico com fixtures sintéticas. Hipótese/necessidade/ideia/projecto/oferta não equiparados;sem procura,viabilidade,contrato,acesso ou benefício fiscal presumidos. | Histórico preservado: | QA01: divergência documental 600/579 e edição normativa abertas; cadeia editorial; publicação canónica com pré-condições sintéticas; save legado transacional; sem volume ou recuperação de payload legado cifrado; reversão parcial com sete fontes funcionais. Sem decisão ativa presumida. | ATIVO01: não encerra CAE integral ou divergência 600/579/edição normativa; cadeia exclusivamente editorial. Nenhuma classificação ou relação de investimento real alterada/divulgada. Limites QA anteriores e reversão parcial compatível mantidos; editor UUID ativo de /negocios continua não demonstrado e não bloqueante. Parques, duplicados e regulação Fintech separados.","0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,,"Aplicação real preliminar privada emQA demonstrada;cláusulas integrais e pendências conservadas;sem publicação real ou validação comercial. | Histórico preservado: Primeiro incremento proactivo QA demonstrado;requisito global parcial,sem instalação nem validação económica real." RF-CLU-004,Disponibilizar inteligência territorial e comparação multicritério.,upgrade v4 SHA f0b9815…; p. 521; requirements-audit.csv | portal do investidor\Portal V4\upgrade do portal de investimentos v6 programacao.docx; SHA e1169a7743b13ff6c950d3ffd4672a2afea32e81da84885e11154b7d8de9241e; w:p 546 | portal do investidor\Portal V4\upgrade do portal de investimentos v2.docx; SHA 51b8f0ad3296d1064a5c12b450874fc72640869f10a164319cd7f3153dd3a086; w:p 241 | portal do investidor\Portal V4\upgrade do portal de investimentos v5 programacao.docx; SHA edece80c0519537244f8a8b86456af0aa92de1c526f791bb0ee9b85af7a7e8b2; w:p 546,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-004: Mapas autorizados mostram projectos, recursos, infra-estruturas, actores e riscos por unidade territorial; comparações usam critérios, período, fonte e limitações uniformes e não constituem garantia. | MASTER-e1169a77-0045: Disponibilizar inteligência territorial e comparação multicritério. | MASTER-51b8f0ad-0025: Disponibilizar inteligência territorial e comparação multicritério. | MASTER-edece80c-0045: Disponibilizar inteligência territorial e comparação multicritério.",P2,RF-CLU-004: Relatório 25/09 conservado; estado histórico não promove conclusão | MASTER-e1169a77-0045: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-51b8f0ad-0025: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-edece80c-0045: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,RF-CLU-004 | MASTER-e1169a77-0045 | MASTER-51b8f0ad-0025 | MASTER-edece80c-0045,4,"[{""id"":""RF-CLU-004"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 521; requirements-audit.csv""],""aceitacao"":""Mapas autorizados mostram projectos, recursos, infra-estruturas, actores e riscos por unidade territorial; comparações usam critérios, período, fonte e limitações uniformes e não constituem garantia."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""},{""id"":""MASTER-e1169a77-0045"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v6 programacao.docx; SHA e1169a7743b13ff6c950d3ffd4672a2afea32e81da84885e11154b7d8de9241e; w:p 546""],""aceitacao"":""Disponibilizar inteligência territorial e comparação multicritério."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""},{""id"":""MASTER-51b8f0ad-0025"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v2.docx; SHA 51b8f0ad3296d1064a5c12b450874fc72640869f10a164319cd7f3153dd3a086; w:p 241""],""aceitacao"":""Disponibilizar inteligência territorial e comparação multicritério."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""},{""id"":""MASTER-edece80c-0045"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v5 programacao.docx; SHA edece80c0519537244f8a8b86456af0aa92de1c526f791bb0ee9b85af7a7e8b2; w:p 546""],""aceitacao"":""Disponibilizar inteligência territorial e comparação multicritério."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-005,Gerir necessidades de financiamento e correspondência com financiadores.,upgrade v4 SHA f0b9815…; p. 525; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","[INSTITUICOES-20261110]270instituições/operadores,393referências de localização e168contactos do documento fornecido, em QA. Nenhuma nova instalação/publicação activa. | Histórico anterior preservado: [ACT12-20261110] Directório financeiro/conteúdo fornecido em QA; não instalado/publicado. Homologação1c75a30a mantém zero fichas financeiras. | Histórico anterior preservado: Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-005: A necessidade contém elo, fase, instrumento, valor, moeda, beneficiário, finalidade e elegibilidade; o CRM regista correspondências explicáveis e sujeitas a revisão humana.",P2,RF-CLU-005: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-005,1,"[{""id"":""RF-CLU-005"",""pedido"":""Gerir necessidades de financiamento e correspondência com financiadores."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 525; requirements-audit.csv""],""aceitacao"":""A necessidade contém elo, fase, instrumento, valor, moeda, beneficiário, finalidade e elegibilidade; o CRM regista correspondências explicáveis e sujeitas a revisão humana."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","[INSTITUICOES-20261110] Local/categoria/tipo → banco e seguradora → fonte/contacto → mesmo dossier → actualização do processo/recuperação demonstrados; presença física e cobertura separadas, incertezas/histórico explícitos. Restam instalação, revisão/publicação editorial autenticada, consulta efectiva no destino e visual. Outros critérios desta linha não encerrados. | Histórico anterior preservado: [ACT12-20261110] Onze fichas fundamentadas (7instituições+4programas/fundos; BNI Capital como produto BNI), pesquisa local/necessidade no mesmo produto, condições/fontes/contactos e gravação/recuperação no mesmo dossier demonstradas. Restam instalação, preparação/revisão/publicação autenticada e consulta real no destino; visual pendente. Outros critérios desta linha não encerrados. | Histórico anterior preservado: Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,"[INSTITUICOES-20261110]outputs/funding-directory-20261110/institutions/{content,verification}.json e catalogo-qa.html/270fichas;5API/735asserções e28frontend dirigidos. Fonte Instituições financeiras em Moçambique.docx SHA119bb5514d2777849b70aebfec21d28a41885cbdc7d9827fbebd764fe994c108. | Histórico anterior preservado: [ACT12-20261110] outputs/funding-directory-20261110/{verification,content-qa,dossier-qa}.json e catalogo-qa.html/11fichas;3API/127asserções,13frontend; fonte benchmark de melhorias investeMoz.docx SHA065203aacfae766c62cf9c2c272ebacc61ff23bd4ff9e91535939fede87f7617. | Histórico anterior preservado: outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. Preparação editorial assistida em QA: selecção/conferência e publicação explícita separadas, MFA nativo, edições preservadas e repetição exacta. Disponibilização efectiva ainda pendente. Instalação ef24cbdc confirmada10/11/2026; backup/restauro190tabelas/369ficheiros; fontes33hashes. Conteúdo ainda0fichas/0publicações; entrada no editor confirmada, sem POST de preparação/publicação observado. ACT12 aberto até consulta efectiva, sem nova instalação exigida. Confirmação posterior10/11:32rascunhos persistidos/0publicações; continuação e publicação403 após expiraçãoMFA900s (21:31:43+02). Retoma autenticada idempotente conserva rascunhos. Instalaçãoef24cbdc preservada; ACT12 aberto. Confirmação seguinte:90rascunhos/0publicações, recusas403 apósMFA. CorrecçãoQA de retoma na mesma aba poractor/fontes, confirmação separada e recuperação exacta; selecção todas270/contadores/controlos visíveis. Revisãoactivaef24cbdc até recibo posterior. Retoma instalada4f3dbcf8/22:01+02,7hashes/HTTP200/backup-restauro190tabelas369ficheiros, guardasMFA mantidas.90rascunhos/0publicações; preparação/publicação autenticada e consulta efectiva ainda pendentes. ACT12 aberto. Diagnóstico posterior:loginMFAEdge22:03:53/dashboard200; editor403Safari/WebKit22:04 em sessão anterior. Não era expiração da nova sessãoEdge. Colar URL noEdge autenticado; nenhuma permissão/sessão/configuração alterada. Abertura/publicação efectiva por confirmar. Acesso reposto:editorEdgeHTTP200às22:11:21+02 na sessão correcta; sem nova instalação/permissão. Publicação/conteúdo consultável ainda por confirmar. ENTREGACONFIRMADA10/11/2026às22:54:31+02:270/270instituições do documento publicadas/270identidades/393locais168contactos; nenhuma em falta. CatálogoHTTP200total270incluindo histórico, filtroseguradora/Nampula6resultados eBCI/Absa/ArkoHTTP200. Cadastro/disponibilização do original concluídos emhomologação4f3dbcf8; continuidade dossierQA aceite reutilizada; visual separado. Cinco programas anteriores permanecem privados. Provaoutputs/funding-directory-20261110/institutions/publication-complete.json.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-006,"Gerir programas, iniciativas, constrangimentos e planos de acção.",upgrade v4 SHA f0b9815…; p. 529; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-006: Cada registo possui objectivo ou problema, território, responsável, parceiros, orçamento, prazo, indicador, dependências, risco, escalonamento, estado e decisão necessária.",P2,RF-CLU-006: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-006,1,"[{""id"":""RF-CLU-006"",""pedido"":""Gerir programas, iniciativas, constrangimentos e planos de acção."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 529; requirements-audit.csv""],""aceitacao"":""Cada registo possui objectivo ou problema, território, responsável, parceiros, orçamento, prazo, indicador, dependências, risco, escalonamento, estado e decisão necessária."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, @@ -450,7 +450,7 @@ MASTER-9dee08d0-0027,Nota técnica: Os endpoints indicados na tabela são exempl MASTER-9dee08d0-0028,"Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 291 | portal do investidor\backup\Reformulacao do portal do investidor 1.docx; SHA efd550fd2a9d2a21785d7b3c140d4608f1ba27c52f156e2709e9fbf388a1a569; w:p 267 | portal do investidor\backup\Reformulacao do portal do investidor v2.docx; SHA 9f5719c8b0cf78855f727d980b77a8f9409fc7f93e303e25d355d009a07d5734; w:p 280 | portal do investidor\backup\Reformulacao do portal do investidor v3.docx; SHA 626cae3d584658842ca36b658e7b5b3cc98d87036747e65b29274f0209734e5a; w:p 279,governação/outros,/api/v1/investment/admin/interests/{interest}/status; /management/history; /management/interests; /management/interests/{interest}; /management/interests/{interest}/consent/contact; /management/interests/{interest}/consent/proponent; /management/opportunities; /management/opportunities/create; /management/opportunities/drafts; /management/opportunities/{id}/draft; /management/opportunities/{id}/edit; /management/opportunities/{id}/lifecycle,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-9dee08d0-0028: Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos: | MASTER-efd550fd-0028: Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos: | MASTER-9f5719c8-0029: Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos: | MASTER-626cae3d-0026: Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:",P2,MASTER-9dee08d0-0028: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-efd550fd-0028: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-9f5719c8-0029: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-626cae3d-0026: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0028 | MASTER-efd550fd-0028 | MASTER-9f5719c8-0029 | MASTER-626cae3d-0026,4,"[{""id"":""MASTER-9dee08d0-0028"",""pedido"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 291""],""aceitacao"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""},{""id"":""MASTER-efd550fd-0028"",""pedido"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""fontes"":[""portal do investidor\\backup\\Reformulacao do portal do investidor 1.docx; SHA efd550fd2a9d2a21785d7b3c140d4608f1ba27c52f156e2709e9fbf388a1a569; w:p 267""],""aceitacao"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""},{""id"":""MASTER-9f5719c8-0029"",""pedido"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""fontes"":[""portal do investidor\\backup\\Reformulacao do portal do investidor v2.docx; SHA 9f5719c8b0cf78855f727d980b77a8f9409fc7f93e303e25d355d009a07d5734; w:p 280""],""aceitacao"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""},{""id"":""MASTER-626cae3d-0026"",""pedido"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""fontes"":[""portal do investidor\\backup\\Reformulacao do portal do investidor v3.docx; SHA 626cae3d584658842ca36b658e7b5b3cc98d87036747e65b29274f0209734e5a; w:p 279""],""aceitacao"":""Para resolver as limitações da versão actual, o frontend deve incorporar os seguintes módulos:"",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,Requisito transversal; consultar estado-ativo-after.json,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer","Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: governação e demais cláusulas. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,governação e demais cláusulas,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",AGENTS.md — componentes do domínio encontrados; correspondência integral deste requisito não presumida,; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-9dee08d0-0029,"Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização.",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 297 | portal do investidor\backup\Reformulacao do portal do investidor 1.docx; SHA efd550fd2a9d2a21785d7b3c140d4608f1ba27c52f156e2709e9fbf388a1a569; w:p 273 | portal do investidor\backup\Reformulacao do portal do investidor v2.docx; SHA 9f5719c8b0cf78855f727d980b77a8f9409fc7f93e303e25d355d009a07d5734; w:p 286 | portal do investidor\backup\Reformulacao do portal do investidor v3.docx; SHA 626cae3d584658842ca36b658e7b5b3cc98d87036747e65b29274f0209734e5a; w:p 285,simuladores,/api/v1/questionnaires/{code}; /api/v1/simulation-drafts; /api/v1/simulation-drafts/claim; /api/v1/simulation-drafts/claim-preview; /api/v1/simulation-drafts/current; /api/v1/simulation-drafts/linkable-businesses; /api/v1/simulation-drafts/{id}; /api/v1/simulation-drafts/{id}/business-link; /api/v1/simulation-drafts/{id}/conversions; /api/v1/simulation-drafts/{id}/touch; /api/v1/simulations; /api/v1/simulations/history,"SimulationExecution, resultados/cenários/fontes, rascunhos e dossier existentes. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Cenário→cálculo→gravação→resultado/dossier correto→nova sessão→PDF/derivadas autorizadas. Sem aprovação/score inventado. Critério individual original preservado; cobertura atual ainda não individualizada.,"Regras financeiras/fiscais separadas; fonte oficial aceite, parâmetros/âmbito/período podem faltar; não substituir por0/taxa atual. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-9dee08d0-0029: Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização. | MASTER-efd550fd-0029: Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização. | MASTER-9f5719c8-0030: Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização. | MASTER-626cae3d-0027: Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização.",P2,MASTER-9dee08d0-0029: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-efd550fd-0029: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-9f5719c8-0030: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-626cae3d-0027: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0029 | MASTER-efd550fd-0029 | MASTER-9f5719c8-0030 | MASTER-626cae3d-0027,4,"[{""id"":""MASTER-9dee08d0-0029"",""pedido"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 297""],""aceitacao"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""simuladores""},{""id"":""MASTER-efd550fd-0029"",""pedido"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""fontes"":[""portal do investidor\\backup\\Reformulacao do portal do investidor 1.docx; SHA efd550fd2a9d2a21785d7b3c140d4608f1ba27c52f156e2709e9fbf388a1a569; w:p 273""],""aceitacao"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""simuladores""},{""id"":""MASTER-9f5719c8-0030"",""pedido"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""fontes"":[""portal do investidor\\backup\\Reformulacao do portal do investidor v2.docx; SHA 9f5719c8b0cf78855f727d980b77a8f9409fc7f93e303e25d355d009a07d5734; w:p 286""],""aceitacao"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""simuladores""},{""id"":""MASTER-626cae3d-0027"",""pedido"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""fontes"":[""portal do investidor\\backup\\Reformulacao do portal do investidor v3.docx; SHA 626cae3d584658842ca36b658e7b5b3cc98d87036747e65b29274f0209734e5a; w:p 285""],""aceitacao"":""Filtros inteligentes: permitir filtrar documentos por sector, tipo de incentivo fiscal ou aduaneiro, província, entidade competente, fase do investimento e data de actualização."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""simuladores""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.simulation_form_drafts: 22 registos; public.simulation_scenarios: 16 registos; public.simulations: 16 registos; public.simulation_tax_rules: tabela ausente,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Cenário→cálculo→gravação→resultado/dossier correto→nova sessão→PDF/derivadas autorizadas. Sem aprovação/score inventado. Critério individual original preservado; cobertura atual ainda não individualizada.,"SimulationExecution, resultados/cenários/fontes, rascunhos e dossier existentes","Regras financeiras/fiscais separadas; fonte oficial aceite, parâmetros/âmbito/período podem faltar; não substituir por0/taxa atual.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: simuladores. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,simuladores,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/SimulationTaxParameterResolver.php; resources/js/components/simulation-form.tsx — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"SimulationExecutionTest, SimulationFormDraftTest, SimulationDraftContinuityTest, SimulationTaxRuleGovernanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-9dee08d0-0030,"Alterar os exemplos de busca para termos do ecossistema de negócios: ""Isenção de IVA agricultura"", ""Como registar projecto na APIEX"", ""Repatriamento de dividendos"".",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 314,negócios,/api/v1/business-opportunities; /api/v1/business-opportunities/{slug}; /api/v1/existing-business/listings; /api/v1/existing-business/listings/{id}; /api/v1/existing-business/listings/{id}/objects; /api/v1/existing-business/listings/{id}/objects/{object}; /api/v1/existing-business/listings/{id}/transitions; /api/v1/existing-business/listings/{id}/verifications; /api/v1/existing-business/reviews; /api/v1/simulation-drafts/linkable-businesses; /api/v1/simulation-drafts/{id}/business-link; /investidor/negocios,"ExistingBusinessDrafts/Policy, anúncio público, InterestSubmission e filtros atuais. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Negócio→revisão/publicação→interesse→origem→estatística única→recuperação; preparar caso existente autorizado sem forçar estado. Critério individual original preservado; cobertura atual ainda não individualizada.,Políticas legadas próprias e docs/mandatos; QA18445zero anúncios publicados; notificaçõesOFF. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,"MASTER-9dee08d0-0030: Alterar os exemplos de busca para termos do ecossistema de negócios: ""Isenção de IVA agricultura"", ""Como registar projecto na APIEX"", ""Repatriamento de dividendos"".",P2,MASTER-9dee08d0-0030: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0030,1,"[{""id"":""MASTER-9dee08d0-0030"",""pedido"":""Alterar os exemplos de busca para termos do ecossistema de negócios: \""Isenção de IVA agricultura\"", \""Como registar projecto na APIEX\"", \""Repatriamento de dividendos\""."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 314""],""aceitacao"":""Alterar os exemplos de busca para termos do ecossistema de negócios: \""Isenção de IVA agricultura\"", \""Como registar projecto na APIEX\"", \""Repatriamento de dividendos\""."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""negócios""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.existing_businesses: 2 registos; public.existing_business_revisions: 2 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Negócio→revisão/publicação→interesse→origem→estatística única→recuperação; preparar caso existente autorizado sem forçar estado. Critério individual original preservado; cobertura atual ainda não individualizada.,"ExistingBusinessDrafts/Policy, anúncio público, InterestSubmission e filtros atuais",Políticas legadas próprias e docs/mandatos; QA18445zero anúncios publicados; notificaçõesOFF.,Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: negócios. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,negócios,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Http/Controllers/ExistingBusinessController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"ExistingBusinessFoundationTest, ExistingBusinessIntakeTest, ExistingBusinessWizardTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, -MASTER-9dee08d0-0031,"Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação.",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 316,governação/outros,/api/v1/investment/admin/interests/{interest}/status; /management/history; /management/interests; /management/interests/{interest}; /management/interests/{interest}/consent/contact; /management/interests/{interest}/consent/proponent; /management/opportunities; /management/opportunities/create; /management/opportunities/drafts; /management/opportunities/{id}/draft; /management/opportunities/{id}/edit; /management/opportunities/{id}/lifecycle,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-9dee08d0-0031: Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação.",P2,MASTER-9dee08d0-0031: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0031,1,"[{""id"":""MASTER-9dee08d0-0031"",""pedido"":""Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 316""],""aceitacao"":""Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,Requisito transversal; consultar estado-ativo-after.json,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada. | Mineração: falta instalar este delta e conferir visualmente; informação territorial mais precisa e oportunidades concretas exigem dados próprios,não se presumem do levantamento. Os restantes critérios deste requisito mantêm-se. | Energia/Mineração:entrega agrupada e conferência visual pendentes;outros critérios anteriores preservados.","Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer","Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: governação e demais cláusulas. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293.",governação e demais cláusulas,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",AGENTS.md — componentes do domínio encontrados; correspondência integral deste requisito não presumida,; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, +MASTER-9dee08d0-0031,"Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação.",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 316,governação/outros,/api/v1/investment/admin/interests/{interest}/status; /management/history; /management/interests; /management/interests/{interest}; /management/interests/{interest}/consent/contact; /management/interests/{interest}/consent/proponent; /management/opportunities; /management/opportunities/create; /management/opportunities/drafts; /management/opportunities/{id}/draft; /management/opportunities/{id}/edit; /management/opportunities/{id}/lifecycle,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293. | 11/11/2026 — Mineração/Energia instaladas emf2767818,incluindo542ac2ff e correcção canónica antes da instalação.22ficheiros conferidos,noveHTTP200,backup/restauro190tabelas/369ficheiros,nove tabelas protegidas idênticas,270instituições preservadas,zero migrações/importações. Percurso localização/grupo → área → dossier → recuperação/SWOT disponível. Recibo outputs/sector-resource-20261111/installation.json. Conferência visual pendente;saldo anterior preservado.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-9dee08d0-0031: Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação.",P2,MASTER-9dee08d0-0031: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0031,1,"[{""id"":""MASTER-9dee08d0-0031"",""pedido"":""Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 316""],""aceitacao"":""Em vez de “Explore o potencial...”, apresentar dados operacionais de cada sector quando validados, como área disponível, incentivos aplicáveis, entidades competentes e chamada de acção específica. Qualquer número ou taxa deve ser identificado como exemplo ilustrativo ou confirmado por fonte oficial antes da publicação."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,Requisito transversal; consultar estado-ativo-after.json,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada. | Mineração: falta instalar este delta e conferir visualmente; informação territorial mais precisa e oportunidades concretas exigem dados próprios,não se presumem do levantamento. Os restantes critérios deste requisito mantêm-se. | Energia/Mineração:entrega agrupada e conferência visual pendentes;outros critérios anteriores preservados. | Entrega sectorial Mineração/Energia instalada;resta conferência visual deste recorte. Critérios anteriores fora do recorte permanecem.","Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer","Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: governação e demais cláusulas. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293. | 11/11/2026 — Mineração/Energia instaladas emf2767818,incluindo542ac2ff e correcção canónica antes da instalação.22ficheiros conferidos,noveHTTP200,backup/restauro190tabelas/369ficheiros,nove tabelas protegidas idênticas,270instituições preservadas,zero migrações/importações. Percurso localização/grupo → área → dossier → recuperação/SWOT disponível. Recibo outputs/sector-resource-20261111/installation.json. Conferência visual pendente;saldo anterior preservado.",governação e demais cláusulas,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",AGENTS.md — componentes do domínio encontrados; correspondência integral deste requisito não presumida,; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-9dee08d0-0032,"Próximo passo recomendado: priorizar primeiro as melhorias de conteúdo e navegação da página pública, porque são as que têm impacto imediato na credibilidade do portal. Em seguida, deve ser preparada a especificação funcional da Área Reservada do Investidor e, numa fase posterior, o desenho técnico das integrações por API com entidades públicas relevantes.",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 321,Balcão/orientação,/balcao-virtual/contextos; /balcao-virtual/dossiers; /balcao-virtual/dossiers/{id}; /balcao-virtual/dossiers/{id}/documentos; /balcao-virtual/dossiers/{id}/documentos/{document}; /balcao-virtual/dossiers/{id}/documentos/{document}/conferencia; /balcao-virtual/dossiers/{id}/etapas; /balcao-virtual/dossiers/{id}/fontes; /balcao-virtual/dossiers/{id}/orientacao; /balcao-virtual/dossiers/{id}/pedidos; /balcao-virtual/dossiers/{id}/pressupostos; /balcao-virtual/dossiers/{id}/recomendacoes,"VirtualDesk, pedidos/casos, anexos, contexto dossier e acompanhamento. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Pedido contextual→gravar→submeter→nova sessão→gestor→mensagem/documentos/resultado, reaproveitando A/B. Critério individual original preservado; cobertura atual ainda não individualizada.","Perfis próprios do Balcão; serviços/campos e decisões externas aplicáveis, sem inventar destinatário/prazo. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-9dee08d0-0032: Próximo passo recomendado: priorizar primeiro as melhorias de conteúdo e navegação da página pública, porque são as que têm impacto imediato na credibilidade do portal. Em seguida, deve ser preparada a especificação funcional da Área Reservada do Investidor e, numa fase posterior, o desenho técnico das integrações por API com entidades públicas relevantes.",P2,MASTER-9dee08d0-0032: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0032,1,"[{""id"":""MASTER-9dee08d0-0032"",""pedido"":""Próximo passo recomendado: priorizar primeiro as melhorias de conteúdo e navegação da página pública, porque são as que têm impacto imediato na credibilidade do portal. Em seguida, deve ser preparada a especificação funcional da Área Reservada do Investidor e, numa fase posterior, o desenho técnico das integrações por API com entidades públicas relevantes."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 321""],""aceitacao"":""Próximo passo recomendado: priorizar primeiro as melhorias de conteúdo e navegação da página pública, porque são as que têm impacto imediato na credibilidade do portal. Em seguida, deve ser preparada a especificação funcional da Área Reservada do Investidor e, numa fase posterior, o desenho técnico das integrações por API com entidades públicas relevantes."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""Balcão/orientação""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.desk_cases: 1 registos; public.desk_requests: 0 registos; public.desk_institutional_links: 0 registos; public.desk_messages: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Pedido contextual→gravar→submeter→nova sessão→gestor→mensagem/documentos/resultado, reaproveitando A/B. Critério individual original preservado; cobertura atual ainda não individualizada.","VirtualDesk, pedidos/casos, anexos, contexto dossier e acompanhamento","Perfis próprios do Balcão; serviços/campos e decisões externas aplicáveis, sem inventar destinatário/prazo.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: balcão. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,balcão,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/VirtualDesk.php; app/Services/Ai/InvestorGuidance.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,InvestorGuidanceTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-9dee08d0-0033,"Secção 1 — Identificação da oportunidade: consultar sector, província, entidade promotora, código de referência e estado editorial. Prioridade: obrigatória.",portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 327,oportunidades,/api/v1/business-opportunities; /api/v1/business-opportunities/{slug}; /investidor/terra-duat; /investidor/terra-duat/novo; /investidor/terra-duat/{id}; /investidor/terra-duat/{id}/actualizacoes; /investidor/terra-duat/{id}/documentos; /investidor/terra-duat/{id}/documentos/{attachment}; /investidor/terra-duat/{id}/editar; /investidor/terra-duat/{id}/imprimir; /investidor/terra-duat/{id}/solicitar-apoio; /management/opportunities,"OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Reconciliar contrato/cláusula e provas por categoria; completar apenas falha/variante executável identificada. Response normativo não é completo. Critério individual original preservado; cobertura atual ainda não individualizada.,"030000→040000 já instalados; contratos/resources existentes, sessão/MFA, ClamD e worker para ficheiros; gates das seis categorias ON. Variantes modulares/offers continuam separadas. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","MASTER-9dee08d0-0033: Secção 1 — Identificação da oportunidade: consultar sector, província, entidade promotora, código de referência e estado editorial. Prioridade: obrigatória.",P2,MASTER-9dee08d0-0033: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0033,1,"[{""id"":""MASTER-9dee08d0-0033"",""pedido"":""Secção 1 — Identificação da oportunidade: consultar sector, província, entidade promotora, código de referência e estado editorial. Prioridade: obrigatória."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 327""],""aceitacao"":""Secção 1 — Identificação da oportunidade: consultar sector, província, entidade promotora, código de referência e estado editorial. Prioridade: obrigatória."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""oportunidades""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.opportunities: 6 registos; public.opportunity_images: tabela ausente; public.opportunity_documents: tabela ausente; public.opportunity_location_drafts: tabela ausente,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Reconciliar contrato/cláusula e provas por categoria; completar apenas falha/variante executável identificada. Response normativo não é completo. Critério individual original preservado; cobertura atual ainda não individualizada.,"OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources","030000→040000 já instalados; contratos/resources existentes, sessão/MFA, ClamD e worker para ficheiros; gates das seis categorias ON. Variantes modulares/offers continuam separadas.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: oportunidades. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,oportunidades,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/OpportunityManagement.php; app/Services/OpportunityResources.php; resources/js/pages/management/opportunity-draft.tsx — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"OpportunityManagementTest, OpportunityResourcesTest, OpportunityOriginReviewTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, MASTER-9dee08d0-0034,Secção 2 — Resumo executivo: usar como abertura da apresentação e síntese da proposta de valor. Prioridade: obrigatória.,portal do investidor\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 328,governação/outros,/api/v1/investment/admin/interests/{interest}/status; /management/history; /management/interests; /management/interests/{interest}; /management/interests/{interest}/consent/contact; /management/interests/{interest}/consent/proponent; /management/opportunities; /management/opportunities/create; /management/opportunities/drafts; /management/opportunities/{id}/draft; /management/opportunities/{id}/edit; /management/opportunities/{id}/lifecycle,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.",MASTER-9dee08d0-0034: Secção 2 — Resumo executivo: usar como abertura da apresentação e síntese da proposta de valor. Prioridade: obrigatória.,P2,MASTER-9dee08d0-0034: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,MASTER-9dee08d0-0034,1,"[{""id"":""MASTER-9dee08d0-0034"",""pedido"":""Secção 2 — Resumo executivo: usar como abertura da apresentação e síntese da proposta de valor. Prioridade: obrigatória."",""fontes"":[""portal do investidor\\Reformulacao do portal do investidor.docx; SHA 9dee08d0ebbbb262651a01ffc7e0ade97323664bda59fe8ce0b07ead82736ce1; w:p 328""],""aceitacao"":""Secção 2 — Resumo executivo: usar como abertura da apresentação e síntese da proposta de valor. Prioridade: obrigatória."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""governação/outros""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,Requisito transversal; consultar estado-ativo-after.json,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.",Localizar obrigação verificável e consumidores/contrato atuais antes de estimar implementação ou declarar conclusão. Critério individual original preservado; cobertura atual ainda não individualizada.,"Entidades, schema/configuração e serviços existentes; correspondência individual por estabelecer","Ler secção/versão correspondente; distinguir requisito funcional, decisão e exemplo. Fontes oficiais já aceites.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: governação e demais cláusulas. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,governação e demais cláusulas,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",AGENTS.md — componentes do domínio encontrados; correspondência integral deste requisito não presumida,; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, @@ -10811,13 +10811,13 @@ AUD-LEG-04,Consulta pública sem login; autenticação apenas para guardar/acomp [PLANO-P1-P6-20261019] Plano Tempo: 27–46 h disponibilização; P7 e desenvolvimento separados. Inclusão 36–39 expressa para decisão; sem publicação automática. Revisão de proposta d87970e701f0. Roteiro no manual existente; não encerra critério por instalação. [QA público/visual 20/10/2026 b0fdd083ca56] Consulta sem identidade dentro de perímetro independente; autenticação só na operação, contexto recuperado no navegador. Login/registo PT e marca Tempo; início/editorial preservados. 13+6 verificações, build/TS passaram. Correcção só QA, não instalada remotamente; abertura externa exige decisão. Ver RECIBO-PUBLICO-VISUAL-QA.json. Não encerra os restantes critérios deste requisito. [Reconciliação geral 20/10/2026 423bd512d8c5] b0 preservada; commits 97a08df2/50738750 compostos com menus/formulários/editorial e provas anteriores. Identidade InvesteMoz, propriedade da Tempo. Reserva Nginx independente e reversão sequenciada passaram em QA. Zero escrita remota; preflight fresco de todos os fontes do build e vhost obrigatório, recusar divergências dos programadores. Ver PROPOSTA-CONSOLIDADA-QA.json. Não encerra outros critérios nem autoriza abertura externa.",documentos e legado,15/10/2026 — fecho do piloto ativo e preparação por leitura dos restantes setores; sem novos testes funcionais.,,,"Consulta pública/proteção privada dos setores demonstradas. Disponibilização ativa,C37/QA18,A/B e aceitações manuais adicionais permanecem separadas. | Histórico anterior: Nenhum critério pendente na consulta e proteção do piloto QA demonstrado. C37/QA18 no navegador do utilizador e disponibilização ativa são requisitos/ações independentes, não fechados por este ensaio.",Biblioteca/documentos existentes; Balcão+09/190000 para dossier. Expansão cartográfica exige correspondências fundamentadas. C37/A-B/SLA/perfis e ativação mantêm âmbito próprio.,"Artigo, imagem, biblioteca e pesquisa respondem sem login; início/associação ao dossier requer sessão verificada. Outra conta403, contexto privado ausente em leitura pública/alheia.","[Interface legado QA 10/10/2026] Chromium instalado, contextos isolados, desktop 1440 px / móvel 390 px: fotografia/fontes/paleta, pesquisa hit/miss, Enter/foco de 3 px, links carteira/zonas/biblioteca/oportunidade. Promotor QA21: login→MFA→dossier→fonte→retorno→logout→novo contexto/MFA→recuperação/F5→associação repetida. Conta23:403 e artigo público sem título privado; anónimo sem contexto privado. UI observada; referência/evento únicos e originais/hash/scan confirmados em leitura QA. legacy-content-browser-qa.json; legacy-content-browser-persistence-qa.json; legado-piloto-qa.md. | Evidência anterior preservada: legado-piloto-qa.md; legacy-content-http-qa.json: recursos6/5 públicos, hashes verificados, pesquisa, login/MFA21, criação/continuação, logout/nova sessão, recuperação, replay único e isolamento. Interface não observada. | [Confirmação manual recebida 10/10/2026] Responsável confirmou leitura pública → autenticação → criar/escolher dossier → guardar referência → nova sessão → recuperar dossier e abrir artigo. Confirmação declarada, sem conta/perfil/dispositivo/data de execução identificados. Não comprova MFA específico, ensaios móveis, acessibilidade, outros perfis, deduplicação, C37/QA18 ou A/B. Ver legado-piloto-qa.md, confirmação manual. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","GET públicos e escritas autenticadas no servidor18097, alvo real55441 confirmado; publicação separada do importador. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.",,,"Fecho exclusivo do piloto agronegócio; não cobre todo o acervo, versões, URLs, anexos ou setores. Mercado Financeiro vazio continua separado.",0 h de repetição sem regressão concreta.,,, -AUD-LEG-05,"Fonte única associada a setores, territórios e etapas com fundamento; artigo não vira oportunidade concreta","Pedido direto do responsável,10/10/2026, integração do legado emQA §5; https://investemoz.tempo.co.mz/; legado-piloto-qa.md",biblioteca / conteúdo público / percurso do investidor,/explorar/agronegocio; /agronegocio; /documentos/6; /investimentos/a-partir-de/agronegocio; /investimentos/{id}/conteudos,"documents, biblioteca, importação autenticada, VerifiedDocumentBinary, jobs/derivadas. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Disponibilizado em 15/10/2026, setores-fintech-QA-d5b4dc354265 DOC01: 16 fontes e compilação; sete entradas setoriais e especialização Fintech no dossier; três artigos publicados (recursos reais 27/28/29), imagem 24 reutilizada por identidade/hash. Flags existentes preservadas; sem migrations/categorias novas. B e COUNTRY02 preservados. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293.","QA aceite reutilizada; execução ativa com backup/restauro, scan real, publicação expressa e HTTP anónimo200. Sem repetir percurso. outputs/investmoz-legado-ativacao-20261015/RESULTADO-FINAL.json; FINAL-READONLY.json; ANONYMOUS-HTTP.json; RECIBO-INTEGRIDADE-FINAL.json; outputs/investmoz-legado-restantes-setores-preparacao-20261015/INVENTARIO-E-RECORTE.json",Implementado parcialmente — entradas setoriais e três artigos ativos,Lote ativo mantém conteúdo educativo separado de oportunidades e referências territoriais; imagens genéricas e índice curto identificados. Associações restantes dependem de fundamento individual.,Scanner/worker/GD/WebP e originais privados; ACL por oportunidade/sala diferente de partilha individual não implementada. LegadoOFF. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Mesma fonte/versionamento reutilizados; relações têm citação/âmbito; cadastros reais e artigos distintos; ausência de relação é apresentada explicitamente.,P1,"Legado post171985 modificado2026-04-20; categoria Oportunidades preservada como metadado, entidade guia. Metadados/sitemapInfopublica e área de investimento distintos; não remapear por nome.",USR-LEG-20261010-05,1,"[{""id"":""USR-LEG-20261010-05"",""pedido"":""Fonte única associada a setores, territórios e etapas com fundamento; artigo não vira oportunidade concreta"",""fontes"":[""Pedido direto10/10/2026 §5""],""aceitacao"":""Mesma fonte/versionamento reutilizados; relações têm citação/âmbito; cadastros reais e artigos distintos; ausência de relação é apresentada explicitamente."",""estado"":""parcial"",""variantes"":""IntegraçãoprogressivaQA, sem substituição de pendências anteriores"",""modulo"":""legado/biblioteca/percurso"",""incremento_setores_qa_20261010"":{""atualizado_em"":""2026-10-10T16:23:25.695297+00:00"",""ambito"":""QA18097;base55441isolada"",""evidencia"":""22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados."",""estado_requisito_atual"":""parcial"",""exclusoes"":[""ativação"",""C37/QA18"",""A/B"",""móvel"",""acessibilidade"",""cobertura integral""]}}]","[Interface legado QA 10/10/2026] Render/cliques observados no Chromium QA, com recuperação noutra sessão/F5 e negação à conta23. Não é o navegador pessoal do utilizador nem o ensaio C37/QA18. | Evidência anterior preservada: React preparado e buildQA; dados Inertia recuperados. Navegador indisponível; roteiro manual em legado-piloto-qa.md. Aceitação visual pendente. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","GET públicos e escritas autenticadas no servidor18097, alvo real55441 confirmado; publicação separada do importador. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","Dois recursos na biblioteca existente e referências no payload cifrado do dossier; sem nova tabela/cadastro paralelo. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","[Interface legado QA 10/10/2026] Render/cliques observados no Chromium QA, com recuperação noutra sessão/F5 e negação à conta23. Não é o navegador pessoal do utilizador nem o ensaio C37/QA18. | Evidência anterior preservada: Logout/nova sessão FortifyMFA21: fonte/versão/hashes recuperados; outra conta negada e projeto independente sem referência. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.",Piloto ativo encerrado; restante legado pendente.,Piloto agronegócio: ativo e entrega encerrada. Integração integral do legado: pendente nos mesmos IDs.,parcial,Não disponibilizado; guarda QA/flagfalse. Nenhuma escrita ou divulgação ativa autorizada.,"15/10/2026: entrega do piloto encerrada; dados/B/COUNTRY02/build preservados. Não equivale a integração integral do legado. | Lote setorial disponibilizado por autorização expressa da Tempo; integração integral continua pendente. | QA 15/10/2026: setores-fintech-QA-d5b4dc354265; sete entradas comerciais/contexto no dossier e três artigos preparados. B/COUNTRY02/aceitações preservados; sem disponibilização ativa. | Disponibilização expressamente autorizada pela Tempo: «Autorizo a disponibilizar». Executada com backup/restauro fresco verificado; apenas conferência operacional, sem repetir aceitação QA. +AUD-LEG-05,"Fonte única associada a setores, territórios e etapas com fundamento; artigo não vira oportunidade concreta","Pedido direto do responsável,10/10/2026, integração do legado emQA §5; https://investemoz.tempo.co.mz/; legado-piloto-qa.md",biblioteca / conteúdo público / percurso do investidor,/explorar/agronegocio; /agronegocio; /documentos/6; /investimentos/a-partir-de/agronegocio; /investimentos/{id}/conteudos,"documents, biblioteca, importação autenticada, VerifiedDocumentBinary, jobs/derivadas. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Disponibilizado em 15/10/2026, setores-fintech-QA-d5b4dc354265 DOC01: 16 fontes e compilação; sete entradas setoriais e especialização Fintech no dossier; três artigos publicados (recursos reais 27/28/29), imagem 24 reutilizada por identidade/hash. Flags existentes preservadas; sem migrations/categorias novas. B e COUNTRY02 preservados. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293. | 11/11/2026 — Mineração/Energia instaladas emf2767818,incluindo542ac2ff e correcção canónica antes da instalação.22ficheiros conferidos,noveHTTP200,backup/restauro190tabelas/369ficheiros,nove tabelas protegidas idênticas,270instituições preservadas,zero migrações/importações. Percurso localização/grupo → área → dossier → recuperação/SWOT disponível. Recibo outputs/sector-resource-20261111/installation.json. Conferência visual pendente;saldo anterior preservado.","QA aceite reutilizada; execução ativa com backup/restauro, scan real, publicação expressa e HTTP anónimo200. Sem repetir percurso. outputs/investmoz-legado-ativacao-20261015/RESULTADO-FINAL.json; FINAL-READONLY.json; ANONYMOUS-HTTP.json; RECIBO-INTEGRIDADE-FINAL.json; outputs/investmoz-legado-restantes-setores-preparacao-20261015/INVENTARIO-E-RECORTE.json",Implementado parcialmente — entradas setoriais e três artigos ativos,Lote ativo mantém conteúdo educativo separado de oportunidades e referências territoriais; imagens genéricas e índice curto identificados. Associações restantes dependem de fundamento individual.,Scanner/worker/GD/WebP e originais privados; ACL por oportunidade/sala diferente de partilha individual não implementada. LegadoOFF. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Mesma fonte/versionamento reutilizados; relações têm citação/âmbito; cadastros reais e artigos distintos; ausência de relação é apresentada explicitamente.,P1,"Legado post171985 modificado2026-04-20; categoria Oportunidades preservada como metadado, entidade guia. Metadados/sitemapInfopublica e área de investimento distintos; não remapear por nome.",USR-LEG-20261010-05,1,"[{""id"":""USR-LEG-20261010-05"",""pedido"":""Fonte única associada a setores, territórios e etapas com fundamento; artigo não vira oportunidade concreta"",""fontes"":[""Pedido direto10/10/2026 §5""],""aceitacao"":""Mesma fonte/versionamento reutilizados; relações têm citação/âmbito; cadastros reais e artigos distintos; ausência de relação é apresentada explicitamente."",""estado"":""parcial"",""variantes"":""IntegraçãoprogressivaQA, sem substituição de pendências anteriores"",""modulo"":""legado/biblioteca/percurso"",""incremento_setores_qa_20261010"":{""atualizado_em"":""2026-10-10T16:23:25.695297+00:00"",""ambito"":""QA18097;base55441isolada"",""evidencia"":""22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados."",""estado_requisito_atual"":""parcial"",""exclusoes"":[""ativação"",""C37/QA18"",""A/B"",""móvel"",""acessibilidade"",""cobertura integral""]}}]","[Interface legado QA 10/10/2026] Render/cliques observados no Chromium QA, com recuperação noutra sessão/F5 e negação à conta23. Não é o navegador pessoal do utilizador nem o ensaio C37/QA18. | Evidência anterior preservada: React preparado e buildQA; dados Inertia recuperados. Navegador indisponível; roteiro manual em legado-piloto-qa.md. Aceitação visual pendente. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","GET públicos e escritas autenticadas no servidor18097, alvo real55441 confirmado; publicação separada do importador. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","Dois recursos na biblioteca existente e referências no payload cifrado do dossier; sem nova tabela/cadastro paralelo. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","[Interface legado QA 10/10/2026] Render/cliques observados no Chromium QA, com recuperação noutra sessão/F5 e negação à conta23. Não é o navegador pessoal do utilizador nem o ensaio C37/QA18. | Evidência anterior preservada: Logout/nova sessão FortifyMFA21: fonte/versão/hashes recuperados; outra conta negada e projeto independente sem referência. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.",Piloto ativo encerrado; restante legado pendente.,Piloto agronegócio: ativo e entrega encerrada. Integração integral do legado: pendente nos mesmos IDs.,parcial,Não disponibilizado; guarda QA/flagfalse. Nenhuma escrita ou divulgação ativa autorizada.,"15/10/2026: entrega do piloto encerrada; dados/B/COUNTRY02/build preservados. Não equivale a integração integral do legado. | Lote setorial disponibilizado por autorização expressa da Tempo; integração integral continua pendente. | QA 15/10/2026: setores-fintech-QA-d5b4dc354265; sete entradas comerciais/contexto no dossier e três artigos preparados. B/COUNTRY02/aceitações preservados; sem disponibilização ativa. | Disponibilização expressamente autorizada pela Tempo: «Autorizo a disponibilizar». Executada com backup/restauro fresco verificado; apenas conferência operacional, sem repetir aceitação QA. [RECONCILIACAO-43-20261019] 5: Sem saldo de código no recorte visual aceite. | 8: Outras identidades do legado exigem lotes e eventual adaptação por tipo. Não há autorização genérica para publicar todo o acervo. [REPOSICAO-SECTORES-20261026-RESULTADO] Decisão expressa da Tempo: mostrar o conteúdo completo de cada sector na própria página /sectores. Inventário público de onze fichas: dez já tinham o bloco integral, Agronegócio conservava guia e 12 oportunidades, e Economia Azul omitia sectorEntry por depender do mapa editorial CONTENT (condição técnica desde 6a76aac8). cf003c86/3258a25f preservam as fichas; ec4b2f2a altera o índice visual. O catálogo de resumos não demonstra eliminação de dados. Implementado conjunto de dados/componente único para catálogo e ficha, dez secções completas com âncoras/retorno e cobertura comum de Economia Azul sem exigir artigo. Preservados publicação, especialização Fintech, páginas, originais e relações existentes; nenhuma escrita/publicação no activo. QA exclusivo sector_catalog_restore_20261026_test, 127.0.0.1:55441, cópia de QA local: dois testes/173 asserções passaram, com rollback e equivalência catálogo/ficha, exclusão de sectores/oportunidades não públicos e ausência de escritas por consulta. TypeScript, build e diff passaram; prévia isolada dos componentes reais com dados públicos/ponte QA da Economia Azul em 1440/390/320 px confirmou dez secções, acções, âncoras/retorno e ausência de transbordo. Recibos em outputs/sector-restoration-20261026/. Entrega local, sem disponibilização no destino; critérios globais permanecem no estado anterior.","Lote ativo mantém conteúdo educativo separado de oportunidades e referências territoriais; imagens genéricas e índice curto identificados. Associações restantes dependem de fundamento individual. | Entrega operacional deste delta concluída. Mercado Financeiro geral vazio e restante acervo mantêm os seus estados. Licenças, requisitos e documentos específicos Fintech por atividade permanecem por determinar; não bloqueiam a preparação independente nem se consideram concluídos. | Recorte QA demonstrado, sem encerrar critérios globais. Histórico económico combinado conservado, fora de novas escolhas; oportunidade6 não inferida como Fintech. Sem fusões por nome. Recuperação existente conferida por leitura e hashes; outra sessão/dispositivo e percursos aceites não reensaiados. Conferência dos anexos pelo utilizador pendente. | Recorte aprovado disponibilizado; requisitos globais permanecem abertos. Atividade historica combinada e oportunidade6 sem reclassificacao. Conferencia dos anexos finais pelo utilizador pendente. Sem repetir testes aceites, formularios ou L1. -[UTILIZACAO-HOMOLOGACAO-20261019] 5: Disponibilidade condicionada conforme limite registado — Ecrã aberto: dez sectores principais, especialização Fintech sem cartão principal duplicado; 12 registos conservados. | 8: Disponibilidade condicionada conforme limite registado — Adaptador habilitado; artigos/imagens transportados privadamente, sem os publicar. | Mineração: falta instalar este delta e conferir visualmente; informação territorial mais precisa e oportunidades concretas exigem dados próprios,não se presumem do levantamento. Os restantes critérios deste requisito mantêm-se. | Energia/Mineração:entrega agrupada e conferência visual pendentes;outros critérios anteriores preservados.","documents, biblioteca, importação autenticada, VerifiedDocumentBinary, jobs/derivadas","Dependências operacionais desta entrega resolvidas: hashes, backup/restauro fresco, conta autenticada, scans e publicações. Dependências regulatórias específicas e editoriais restantes preservadas no critério atual. | Origem: pedido expresso da Tempo de18/10. IDs, especialização por leitura e ponte histórica são escolhas técnicas; sem nova regra organizacional. Ativo inalterado; disponibilização separada. Sem migration/instalação140000/150000; reversão retém somente a rota nova Fintech além dos dados/histórico e associação2→8. Estados e critérios anteriores preservados. | Origem: autorizacao expressa Tempo18/10/2026. Backup/restauro e execucao autenticada concluidos; 140000/150000 presentes uma vez, sem migrations. Reversao parcial preserva dados/auditoria/esquemas e rota compativel Fintech. Matriz/manual/backlog atuais preservados. Ficha integral dos parques separada.","Autorização Tempo para setores-fintech-QA-d5b4dc354265 DOC01 executada, limitada a 16 fontes/compilação e três artigos. Decisões fora deste recorte mantêm-se; nenhuma publicação do restante acervo.",Delta disponibilizado; pendências fora do recorte continuam na mesma matriz.,"Saldo operacional desta entrega: zero. A faixa 1h30–3h era estimativa, não saldo atual. Esforço das lacunas remanescentes depende de delimitação concreta; não repetir aceitações.","outputs/investmoz-legado-ativacao-20261015/RESULTADO-FINAL.json; FINAL-READONLY.json; ANONYMOUS-HTTP.json; RECIBO-INTEGRIDADE-FINAL.json; outputs/investmoz-legado-restantes-setores-preparacao-20261015/INVENTARIO-E-RECORTE.json | 15/10/2026: outputs/investmoz-legado-setores-ativacao-20261015/FINAL-READONLY.json; ANONYMOUS-HTTP.json; SOURCE-DELIVERY.json; FRESH-BACKUP.json. 20 importados privados, scan clean e publicados pela sessão Osmane Nala (2); registos de negócio anteriores preservados. | outputs/investmoz-fintech-investimento-QA-20261015/RESULTADO-QA.md; PROVA-DELTA-QA.json; HTTP-DELTA-QA.json; PROVA-FINAL-DELTA-QA.json; HTTP-RECUPERACAO-FINAL-QA.json; MANIFESTO-ENTREGA.json | outputs/investmoz-setores-fintech-ativacao-20261015/RELATORIO-ENTREGA.md; PUBLISHED.json; PRESERVACAO-FINAL.json; HTTP-OPERACIONAL.json; FRESH-BACKUP.json; RECIBO-FINAL.json | 18/10: sectores-duplicacoes-QA-9b6097f97121, organização sectorial/duplicações apenas QA. Energia8/Mineração7; Fintech9 especialização de Mercado6; oportunidade2 reclassificada2→8 sem duplicação; 56HTTP,30serviço,3SQL e5reversão observados. Relatório e manifesto exatos em outputs/investmoz-sectores-duplicacoes-QA-20261018/para-revisao/. | 18/10/2026: disponibilizada sectores-duplicacoes-QA-e9f7d821b6f7 em investemoz:5432, procedimento DOC02. Backup/restauro fresco validado. 34 fontes/167 build. Conta2 com permissao/MFA; oportunidade2 sector2 para8; evento/recibo unicos, operacao27e6a658-d8bc-4d94-ab7b-b977ba56d141. Mesma transacao/ligacao e limpeza SET LOCAL observadas. Provas em outputs/investmoz-sectores-duplicacoes-ativacao-20261018/CONFERENCIA-FINAL.json e para-revisao/RECIBO-EXECUCAO.json. | 19/10/2026 — Inhambane v1, lote QA separado a2b47f486332c78926202eb462c5238fac15ffc8afb2fe391e47b091541e2058. Fonte32c6ab160c50… comparada com anterior9f628cd57eb8…; 39 itens+5 condições reconciliados em30 rascunhos privados/30 locais,2 originais privados com scan real ClamAV. Repetição sem duplicação, fontes/intervalos/agregados preservados, nenhum total financeiro do lote. Backend de recuperação e confidencialidade demonstrado; login real/edição visual/publicação/percurso positivo destas fichas pendentes. Lacunas concretas: dados do promotor/contacto/taxonomia/local, proveniência documental no snapshot do dossier e reutilização biblioteca→anexo canónico. Sem novos papéis, migrations, alteração activa ou incorporação na HML01. outputs/investmoz-inhambane-v1-QA-20261019/RELATORIO-QA.md. Não encerra requisito global. +[UTILIZACAO-HOMOLOGACAO-20261019] 5: Disponibilidade condicionada conforme limite registado — Ecrã aberto: dez sectores principais, especialização Fintech sem cartão principal duplicado; 12 registos conservados. | 8: Disponibilidade condicionada conforme limite registado — Adaptador habilitado; artigos/imagens transportados privadamente, sem os publicar. | Mineração: falta instalar este delta e conferir visualmente; informação territorial mais precisa e oportunidades concretas exigem dados próprios,não se presumem do levantamento. Os restantes critérios deste requisito mantêm-se. | Energia/Mineração:entrega agrupada e conferência visual pendentes;outros critérios anteriores preservados. | Entrega sectorial Mineração/Energia instalada;resta conferência visual deste recorte. Critérios anteriores fora do recorte permanecem.","documents, biblioteca, importação autenticada, VerifiedDocumentBinary, jobs/derivadas","Dependências operacionais desta entrega resolvidas: hashes, backup/restauro fresco, conta autenticada, scans e publicações. Dependências regulatórias específicas e editoriais restantes preservadas no critério atual. | Origem: pedido expresso da Tempo de18/10. IDs, especialização por leitura e ponte histórica são escolhas técnicas; sem nova regra organizacional. Ativo inalterado; disponibilização separada. Sem migration/instalação140000/150000; reversão retém somente a rota nova Fintech além dos dados/histórico e associação2→8. Estados e critérios anteriores preservados. | Origem: autorizacao expressa Tempo18/10/2026. Backup/restauro e execucao autenticada concluidos; 140000/150000 presentes uma vez, sem migrations. Reversao parcial preserva dados/auditoria/esquemas e rota compativel Fintech. Matriz/manual/backlog atuais preservados. Ficha integral dos parques separada.","Autorização Tempo para setores-fintech-QA-d5b4dc354265 DOC01 executada, limitada a 16 fontes/compilação e três artigos. Decisões fora deste recorte mantêm-se; nenhuma publicação do restante acervo.",Delta disponibilizado; pendências fora do recorte continuam na mesma matriz.,"Saldo operacional desta entrega: zero. A faixa 1h30–3h era estimativa, não saldo atual. Esforço das lacunas remanescentes depende de delimitação concreta; não repetir aceitações.","outputs/investmoz-legado-ativacao-20261015/RESULTADO-FINAL.json; FINAL-READONLY.json; ANONYMOUS-HTTP.json; RECIBO-INTEGRIDADE-FINAL.json; outputs/investmoz-legado-restantes-setores-preparacao-20261015/INVENTARIO-E-RECORTE.json | 15/10/2026: outputs/investmoz-legado-setores-ativacao-20261015/FINAL-READONLY.json; ANONYMOUS-HTTP.json; SOURCE-DELIVERY.json; FRESH-BACKUP.json. 20 importados privados, scan clean e publicados pela sessão Osmane Nala (2); registos de negócio anteriores preservados. | outputs/investmoz-fintech-investimento-QA-20261015/RESULTADO-QA.md; PROVA-DELTA-QA.json; HTTP-DELTA-QA.json; PROVA-FINAL-DELTA-QA.json; HTTP-RECUPERACAO-FINAL-QA.json; MANIFESTO-ENTREGA.json | outputs/investmoz-setores-fintech-ativacao-20261015/RELATORIO-ENTREGA.md; PUBLISHED.json; PRESERVACAO-FINAL.json; HTTP-OPERACIONAL.json; FRESH-BACKUP.json; RECIBO-FINAL.json | 18/10: sectores-duplicacoes-QA-9b6097f97121, organização sectorial/duplicações apenas QA. Energia8/Mineração7; Fintech9 especialização de Mercado6; oportunidade2 reclassificada2→8 sem duplicação; 56HTTP,30serviço,3SQL e5reversão observados. Relatório e manifesto exatos em outputs/investmoz-sectores-duplicacoes-QA-20261018/para-revisao/. | 18/10/2026: disponibilizada sectores-duplicacoes-QA-e9f7d821b6f7 em investemoz:5432, procedimento DOC02. Backup/restauro fresco validado. 34 fontes/167 build. Conta2 com permissao/MFA; oportunidade2 sector2 para8; evento/recibo unicos, operacao27e6a658-d8bc-4d94-ab7b-b977ba56d141. Mesma transacao/ligacao e limpeza SET LOCAL observadas. Provas em outputs/investmoz-sectores-duplicacoes-ativacao-20261018/CONFERENCIA-FINAL.json e para-revisao/RECIBO-EXECUCAO.json. | 19/10/2026 — Inhambane v1, lote QA separado a2b47f486332c78926202eb462c5238fac15ffc8afb2fe391e47b091541e2058. Fonte32c6ab160c50… comparada com anterior9f628cd57eb8…; 39 itens+5 condições reconciliados em30 rascunhos privados/30 locais,2 originais privados com scan real ClamAV. Repetição sem duplicação, fontes/intervalos/agregados preservados, nenhum total financeiro do lote. Backend de recuperação e confidencialidade demonstrado; login real/edição visual/publicação/percurso positivo destas fichas pendentes. Lacunas concretas: dados do promotor/contacto/taxonomia/local, proveniência documental no snapshot do dossier e reutilização biblioteca→anexo canónico. Sem novos papéis, migrations, alteração activa ou incorporação na HML01. outputs/investmoz-inhambane-v1-QA-20261019/RELATORIO-QA.md. Não encerra requisito global. 19/10/2026 — Pendências técnicas Inhambane em QA independente, revisão 306e3ebc8a7036b36820d61cf5c828d6dd1126dc1891d9eaa59cde57f91f08ac. Reutilização de originais sem duplicação (31 ligações/2 originais), snapshot documental no dossier e navegador com saída/nova sessão/login/MFA/continuação comprovados; dez verificações de permissões passaram. 30 fichas reconciliadas; lacunas e origem das exigências por ficha/campo. Corrigida condição financeira OP-9f173ed3-0043. Sem nova importação, submissão/publicação, migrations, alterações de MFA ou catálogo de papéis, activo ou HML01. Provas e limites: outputs/investmoz-inhambane-tecnico-QA-20261019/RELATORIO-QA.md. Substitui apenas pendências técnicas do relato anterior; não encerra requisitos globais nem dados em falta. | Homologação teste-investidor 19/10/2026: Sectores e duplicação visual=Instalado mas desabilitado; Legado — conteúdo restante=Instalado mas desabilitado. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Sectores e duplicação visual=Disponível; Legado — conteúdo restante=Instalado mas desabilitado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. @@ -10825,7 +10825,7 @@ AUD-LEG-05,"Fonte única associada a setores, territórios e etapas com fundamen [RECONCILIACAO-43-20261019] Código e critérios confrontados com leitura READ ONLY fresca; PROVA-RECONCILIACAO-43-LEITURA.json, RECONCILIACAO-43-QA-FONTES.json, RECONCILIACAO-43-SCHEMA-QA.json. Não encerra critério funcional por inventário. -[PLANO-P1-P6-20261019] Plano Tempo: 27–46 h disponibilização; P7 e desenvolvimento separados. Inclusão 36–39 expressa para decisão; sem publicação automática. Revisão de proposta d87970e701f0. Roteiro no manual existente; não encerra critério por instalação. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293.",documentos e legado,15/10/2026 — fecho do piloto ativo e preparação por leitura dos restantes setores; sem novos testes funcionais.,,,"Mesma biblioteca/versão/imagem reutilizada. Turismo editorial sem geometrias inferidas; relações territoriais e por etapa ainda exigem fundamento concreto. | Histórico anterior: Relações territoriais concretas e ampliação por etapa/setor ainda por fundamentar. Fonte única no piloto, sem criar oportunidades ou geometrias pelo artigo.",Biblioteca/documentos existentes; Balcão+09/190000 para dossier. Expansão cartográfica exige correspondências fundamentadas. C37/A-B/SLA/perfis e ativação mantêm âmbito próprio.,"Documento único6 e imagem5; três links com fundamento: tema, thumbnail e apoio editorialS01. Relações de oportunidades pelo setor já cadastrado; zero oportunidade ou geometria criada pelo artigo.","[Interface legado QA 10/10/2026] Chromium instalado, contextos isolados, desktop 1440 px / móvel 390 px: fotografia/fontes/paleta, pesquisa hit/miss, Enter/foco de 3 px, links carteira/zonas/biblioteca/oportunidade. Promotor QA21: login→MFA→dossier→fonte→retorno→logout→novo contexto/MFA→recuperação/F5→associação repetida. Conta23:403 e artigo público sem título privado; anónimo sem contexto privado. UI observada; referência/evento únicos e originais/hash/scan confirmados em leitura QA. legacy-content-browser-qa.json; legacy-content-browser-persistence-qa.json; legado-piloto-qa.md. | Evidência anterior preservada: legado-piloto-qa.md; legacy-content-http-qa.json: recursos6/5 públicos, hashes verificados, pesquisa, login/MFA21, criação/continuação, logout/nova sessão, recuperação, replay único e isolamento. Interface não observada. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","GET públicos e escritas autenticadas no servidor18097, alvo real55441 confirmado; publicação separada do importador. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.",,,"Fecho exclusivo do piloto agronegócio; não cobre todo o acervo, versões, URLs, anexos ou setores. Mercado Financeiro vazio continua separado. | 19/10/2026 — Inhambane v1, lote QA separado a2b47f486332c78926202eb462c5238fac15ffc8afb2fe391e47b091541e2058. Fonte32c6ab160c50… comparada com anterior9f628cd57eb8…; 39 itens+5 condições reconciliados em30 rascunhos privados/30 locais,2 originais privados com scan real ClamAV. Repetição sem duplicação, fontes/intervalos/agregados preservados, nenhum total financeiro do lote. Backend de recuperação e confidencialidade demonstrado; login real/edição visual/publicação/percurso positivo destas fichas pendentes. Lacunas concretas: dados do promotor/contacto/taxonomia/local, proveniência documental no snapshot do dossier e reutilização biblioteca→anexo canónico. Sem novos papéis, migrations, alteração activa ou incorporação na HML01. outputs/investmoz-inhambane-v1-QA-20261019/RELATORIO-QA.md. Não encerra requisito global.","2–8 h de reconciliação/ensaio por consumidor agrupado, pressupondo dados sintéticos/perfis preparados. Alteração: estimar após reprodução concreta; variante integral pode exceder esta faixa.",,, +[PLANO-P1-P6-20261019] Plano Tempo: 27–46 h disponibilização; P7 e desenvolvimento separados. Inclusão 36–39 expressa para decisão; sem publicação automática. Revisão de proposta d87970e701f0. Roteiro no manual existente; não encerra critério por instalação. | 11/11/2026 — Mineração: documento fornecido integrado no sector existente em QA:11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores por período e13 fontes. Filtrar localização/grupo → escolher área → dossier novo ou existente → gravação/recuperação → evidência SWOT. Fonte e versão preservadas; sem coordenadas ou direitos inferidos,sem criar oportunidades/promotores. Provas outputs/mining-reference-20261111/verification.json. Não instalado; referência da homologação6d3bf293. | 11/11/2026 — Energia incorporada pelo mesmo mecanismo deMineração:7segmentos,11áreas,10projectos,4riscos e24fontes ligadas. Localização/segmento → área → dossier novo/existente → recuperação → evidênciaSWOT. Duas fontes coexistem sem substituição,sem coordenadas/direitos inferidos ou novas oportunidades. QA conjunto7casos nativos/166asserções+5casos de interface;prova outputs/sector-resource-20261111/verification.json. Implementado emQA,não instalado;homologação de referência6d3bf293. | 11/11/2026 — Mineração/Energia instaladas emf2767818,incluindo542ac2ff e correcção canónica antes da instalação.22ficheiros conferidos,noveHTTP200,backup/restauro190tabelas/369ficheiros,nove tabelas protegidas idênticas,270instituições preservadas,zero migrações/importações. Percurso localização/grupo → área → dossier → recuperação/SWOT disponível. Recibo outputs/sector-resource-20261111/installation.json. Conferência visual pendente;saldo anterior preservado.",documentos e legado,15/10/2026 — fecho do piloto ativo e preparação por leitura dos restantes setores; sem novos testes funcionais.,,,"Mesma biblioteca/versão/imagem reutilizada. Turismo editorial sem geometrias inferidas; relações territoriais e por etapa ainda exigem fundamento concreto. | Histórico anterior: Relações territoriais concretas e ampliação por etapa/setor ainda por fundamentar. Fonte única no piloto, sem criar oportunidades ou geometrias pelo artigo.",Biblioteca/documentos existentes; Balcão+09/190000 para dossier. Expansão cartográfica exige correspondências fundamentadas. C37/A-B/SLA/perfis e ativação mantêm âmbito próprio.,"Documento único6 e imagem5; três links com fundamento: tema, thumbnail e apoio editorialS01. Relações de oportunidades pelo setor já cadastrado; zero oportunidade ou geometria criada pelo artigo.","[Interface legado QA 10/10/2026] Chromium instalado, contextos isolados, desktop 1440 px / móvel 390 px: fotografia/fontes/paleta, pesquisa hit/miss, Enter/foco de 3 px, links carteira/zonas/biblioteca/oportunidade. Promotor QA21: login→MFA→dossier→fonte→retorno→logout→novo contexto/MFA→recuperação/F5→associação repetida. Conta23:403 e artigo público sem título privado; anónimo sem contexto privado. UI observada; referência/evento únicos e originais/hash/scan confirmados em leitura QA. legacy-content-browser-qa.json; legacy-content-browser-persistence-qa.json; legado-piloto-qa.md. | Evidência anterior preservada: legado-piloto-qa.md; legacy-content-http-qa.json: recursos6/5 públicos, hashes verificados, pesquisa, login/MFA21, criação/continuação, logout/nova sessão, recuperação, replay único e isolamento. Interface não observada. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.","GET públicos e escritas autenticadas no servidor18097, alvo real55441 confirmado; publicação separada do importador. | [Setores QA após C71 10/10/2026] 22 originais importados privadamente após prévia renovada, hashes recuperados,22 scans ClamD reais e replay sem novos documentos/recursos/auditoria/scans. Divulgação autenticada separada:16 artigos com texto+5 imagens públicos; Mercado Financeiro privado, vazio confirmado na origem HTML e Inertia200. Chromium desktop:16 artigos, pesquisa/imagens, Energia e Mineração distintas, C72 título preservado; QA21 criou4 dossiers, retorno, logout/novaMFA/F5/replay; QA23 negado403 e anónimo sem contexto. Persistência READ ONLY:8 dossiers HTTP/Chromium, uma referência/evento cada,22 hashes únicos,0 relações geográficas automáticas. legacy-sectors-{apply,replay,http,browser,persistence}-qa.json; legacy-financial-origin-20261010/proof.json. C37/QA18,A/B,móvel/acessibilidade/cobertura integral não encerrados.",,,"Fecho exclusivo do piloto agronegócio; não cobre todo o acervo, versões, URLs, anexos ou setores. Mercado Financeiro vazio continua separado. | 19/10/2026 — Inhambane v1, lote QA separado a2b47f486332c78926202eb462c5238fac15ffc8afb2fe391e47b091541e2058. Fonte32c6ab160c50… comparada com anterior9f628cd57eb8…; 39 itens+5 condições reconciliados em30 rascunhos privados/30 locais,2 originais privados com scan real ClamAV. Repetição sem duplicação, fontes/intervalos/agregados preservados, nenhum total financeiro do lote. Backend de recuperação e confidencialidade demonstrado; login real/edição visual/publicação/percurso positivo destas fichas pendentes. Lacunas concretas: dados do promotor/contacto/taxonomia/local, proveniência documental no snapshot do dossier e reutilização biblioteca→anexo canónico. Sem novos papéis, migrations, alteração activa ou incorporação na HML01. outputs/investmoz-inhambane-v1-QA-20261019/RELATORIO-QA.md. Não encerra requisito global.","2–8 h de reconciliação/ensaio por consumidor agrupado, pressupondo dados sintéticos/perfis preparados. Alteração: estimar após reprodução concreta; variante integral pode exceder esta faixa.",,, AUD-LEG-06,"Preservar contexto ao entrar/regressar ao percurso, URLs existentes e correspondências de migração","Pedido direto do responsável,10/10/2026, integração do legado emQA §6; https://investemoz.tempo.co.mz/; legado-piloto-qa.md Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas. [Revisão externa 10/11/2026] Directiva de Implementação Segura v1.0 de 08/11/2026; correecoes ao portal.docx SHA db630ab937cc00686480aa02ef0156a8ac20edadf97306995277a5173d890f51; confronto em revisao-externa-2026-11-10.md. diff --git a/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md b/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md index 1f41def8..d9aa27c6 100644 --- a/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md +++ b/docs/investmoz/v2/auditoria-portal/visao-consolidada-modulos.md @@ -1,3 +1,13 @@ +## 11/11/2026 — Mineração e Energia instaladas em f2767818 + +Entrega autorizada de542ac2ff instalada na revisão `f27678187669d18ec063a01473dc8788c713448d`. A revisão inclui a correcção técnica dos hashes e dos geradores para usar os mesmos bytesJSON emWindows eGit/Linux,detectada antes de alterar a instalação;conteúdo,interface e âmbito preservados. Os sete casos nativos/166asserções voltaram a passar sobre os bytes canónicos. Pacote original preservado;pacote canónico com aplicação/reversão exactas. Recibo `outputs/sector-resource-20261111/installation.json`,conferido em2026-11-11T12:19:59.901666+00:00. + +**Disponível:** `/sectores/mineracao` —11grupos/10áreas de cadeia de valor/6projectos de referência; `/sectores/energia-especifica` —7segmentos/11áreas/10projectos/24fontes ligadas. Localização e grupo/segmento → área → dossier novo ou existente → gravação/recuperação → evidência paraSWOT. As duas referências coexistem no mesmo dossier sem substituir escolhas. Estados,períodos,divergências e locais por definir preservados;sem criar direitos,coordenadas,ofertas ou projectos reais. + +**Instalação conferida:** backup consistente e restauro isolado190tabelas;369ficheiros restaurados e conferidos porhash;22ficheiros da entrega idênticos aoGit;revisão e nove entradasHTTP200,incluindo as duas páginas sectoriais. Configuração intacta,zero migrações/importações. Nove tabelas protegidas com totais/checksums idênticos ao backup,incluindo instituições/versões/interesses,dossiers,simulações,educação,oportunidades e sectores;270instituições publicadas preservadas. + +**Saldo:** implementação e instalação deste recorte encerradas;conferência visual permanece pendente. Ofertas concretas,implantação mais precisa e dados adicionais dependem do respectivo investimento,não se presumem das referências. Restantes módulos e resíduos fiscaisL1–L7,L8,L9–L16 mantêm o saldo anterior;portal integralmente concluído não declarado. + ## 11/11/2026 — Energia incorporada pelo mesmo percurso de Mineração, em QA **Implementação:** o sector existente `/sectores/energia-especifica` passa a apresentar o documento fornecido com7segmentos,11áreas de cadeia de valor,10projectos de referência,4riscos e24fontes com as ligações originais. Gás/upstream/construção/midstream/industrialização/mercado final,redes/hídrica,solar/baterias/eólica,hidrogénio,biocombustíveis e parques verdes mantêm o seu contexto. As três centrais solares aparecem uma vez cada,com capacidade,promotores,financiamento e estado referidos. Metoro conserva56milhõesUSD e47,3milhõesEUR,atribuídos às fontes,sem conversão ou escolha silenciosa. Previsão,operação,desenvolvimento,estudo e proposta não são tratados como estados equivalentes. From b20068d04bc70e8fa94b90692e07afc60b406910 Mon Sep 17 00:00:00 2001 From: nala Date: Fri, 13 Nov 2026 13:27:36 +0200 Subject: [PATCH 02/10] Deliver additive INE demography and authenticated homologation installation --- app/Http/Controllers/DemographyController.php | 79 +++++ app/Services/DemographicEvidence.php | 133 ++++++++ app/Services/DemographicImport.php | 209 ++++++++++++ app/Services/DemographicInstallation.php | 303 +++++++++++++++++ app/Services/InvestmentGeography.php | 4 + .../InvestmentPreparationWorkspace.php | 5 + config/demography.php | 10 + .../data/demography-remaining-20261113.json | 120 +++++++ .../data/demography-zambezia-20261113.json | 23 ++ ...11_13_100000_create_demographic_series.php | 70 ++++ .../unification/traceability-and-manual.md | 62 ++++ .../v2/auditoria-portal/matriz-requisitos.csv | 1 + .../demografia-ine-homologacao-2026-11-13.md | 142 ++++++++ .../js/components/demographic-context.tsx | 58 ++++ .../js/components/demographic-evidence.tsx | 231 +++++++++++++ resources/js/components/simulation-form.tsx | 5 + .../js/components/structure-geography.tsx | 7 + resources/js/pages/investment/catalogue.tsx | 35 +- resources/js/pages/investment/demography.tsx | 128 ++++++++ resources/js/pages/investment/detail.tsx | 7 + .../pages/management/demography-install.tsx | 180 ++++++++++ resources/js/pages/management/demography.tsx | 307 ++++++++++++++++++ resources/js/pages/management/shared.tsx | 1 + routes/demography.php | 17 + routes/web.php | 1 + tests/Feature/DemographicInstallationTest.php | 121 +++++++ tests/Feature/DemographicZambeziaTest.php | 79 +++++ tests/Feature/DemographyTest.php | 217 +++++++++++++ tests/Unit/DemographicTargetTest.php | 30 ++ tests/demography_workbook_test.py | 109 +++++++ tools/demography_workbook.py | 279 ++++++++++++++++ 31 files changed, 2971 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/DemographyController.php create mode 100644 app/Services/DemographicEvidence.php create mode 100644 app/Services/DemographicImport.php create mode 100644 app/Services/DemographicInstallation.php create mode 100644 config/demography.php create mode 100644 database/data/demography-remaining-20261113.json create mode 100644 database/data/demography-zambezia-20261113.json create mode 100644 database/migrations/2026_11_13_100000_create_demographic_series.php create mode 100644 docs/investmoz/v2/demografia-ine-homologacao-2026-11-13.md create mode 100644 resources/js/components/demographic-context.tsx create mode 100644 resources/js/components/demographic-evidence.tsx create mode 100644 resources/js/pages/investment/demography.tsx create mode 100644 resources/js/pages/management/demography-install.tsx create mode 100644 resources/js/pages/management/demography.tsx create mode 100644 routes/demography.php create mode 100644 tests/Feature/DemographicInstallationTest.php create mode 100644 tests/Feature/DemographicZambeziaTest.php create mode 100644 tests/Feature/DemographyTest.php create mode 100644 tests/Unit/DemographicTargetTest.php create mode 100644 tests/demography_workbook_test.py create mode 100644 tools/demography_workbook.py diff --git a/app/Http/Controllers/DemographyController.php b/app/Http/Controllers/DemographyController.php new file mode 100644 index 00000000..c7dff792 --- /dev/null +++ b/app/Http/Controllers/DemographyController.php @@ -0,0 +1,79 @@ +validate(['territories' => 'nullable|array|max:4', 'territories.*' => 'required|uuid|distinct', + 'start_year' => 'nullable|integer|between:1900,2100', 'end_year' => 'nullable|integer|between:1900,2100|gte:start_year', + 'sector' => 'nullable|in:'.implode(',', array_keys(DemographicEvidence::sectors())), 'edition' => 'nullable|uuid']); + $start = (int) ($data['start_year'] ?? date('Y')); + $end = (int) ($data['end_year'] ?? $start); + abort_unless($end >= $start && $end - $start <= 50, 422, 'Escolha um horizonte até 50 anos.'); + $evidence = $service->analyse($data['territories'] ?? [], $start, $end, $data['sector'] ?? 'general', $data['edition'] ?? null); + if ($request->expectsJson()) { + return response()->json($evidence); + } + $territories = $service->territories()->orderBy('name')->get(['id', 'name', 'parent_id', 'location_type']); + + return Inertia::render('investment/demography', ['evidence' => $evidence, 'filters' => $data, 'territories' => $territories, 'sectors' => DemographicEvidence::sectors()]); + } + + public function management(Request $request, DemographicImport $service): Response|RedirectResponse + { + if (! Schema::hasTable('demographic_imports')) { + return redirect('/management/demography/install'); + } + $service->authorize($request->user()); + $data = $request->validate(['batch' => 'nullable|uuid']); + + return Inertia::render('management/demography', ['qa' => ! app(DemographicInstallation::class)->activeTarget(), 'batches' => DB::table('demographic_imports')->orderByDesc('created_at')->get(['id', 'file_name', 'publication_version', 'status', 'created_at']), + 'preview' => isset($data['batch']) ? $service->preview($request->user(), $data['batch']) : null]); + } + + public function installation(Request $request, DemographicInstallation $service): Response + { + return Inertia::render('management/demography-install', ['plan' => $service->preview($request->user())]); + } + + public function install(Request $request, DemographicInstallation $service): JsonResponse + { + return response()->json($service->apply($request->user(), $request->all())); + } + + public function prepare(Request $request, DemographicImport $service): JsonResponse + { + $data = $request->validate(['file' => 'required|file|mimes:xlsx|max:19531', 'publication_version' => 'required|string|max:255', 'baseline_year' => 'nullable|integer|between:1900,2100']); + $file = $request->file('file'); + + return response()->json($service->prepare($request->user(), $file->getRealPath(), $file->getClientOriginalName(), $data['publication_version'], isset($data['baseline_year']) ? (int) $data['baseline_year'] : null)); + } + + public function confirm(Request $request, string $id, DemographicImport $service): JsonResponse + { + $data = $request->validate(['sha256' => 'required|string|size:64', 'mapping' => 'present|array', 'mapping.*' => 'required|uuid', 'reason' => 'required|string|min:10|max:2000']); + + return response()->json($service->confirm($request->user(), $id, $data['sha256'], $data['mapping'], $data['reason'])); + } + + public function transition(Request $request, string $id, DemographicImport $service): JsonResponse + { + $data = $request->validate(['action' => 'required|in:approved,disabled', 'reason' => 'required|string|min:10|max:2000']); + $service->transition($request->user(), $id, $data['action'], $data['reason']); + + return response()->json(['id' => $id, 'status' => $data['action']]); + } +} diff --git a/app/Services/DemographicEvidence.php b/app/Services/DemographicEvidence.php new file mode 100644 index 00000000..f8e30c85 --- /dev/null +++ b/app/Services/DemographicEvidence.php @@ -0,0 +1,133 @@ +publicReferences(); + + return DB::table('geo_locations')->whereNull('deleted_at')->whereIn('location_type', ['province', 'district']) + ->where(function ($q) use ($public) { + $q->whereIn('id', (clone $public)->select('id')); + if ($this->installed() && str_ends_with(DB::connection()->getDatabaseName(), '_test')) { + // Macate/Vanduzi: expressly authorised QA references, never active registry changes. + $q->orWhere(fn ($qa) => $qa->where('source_system', 'ine-demography-qa')->where('data_classification', 'public')->whereIn('parent_id', (clone $public)->select('id'))); + } + }); + } + + public function installed(): bool + { + return (bool) config('demography.enabled', app()->environment('local', 'testing')) + && Schema::hasTable('demographic_imports') && Schema::hasTable('demographic_observations'); + } + + /** @return array */ + public static function sectors(): array + { + return ['commerce' => 'Comércio e serviços', 'industry' => 'Indústria', 'agriculture' => 'Agricultura e agro-indústria', 'education' => 'Educação', 'health' => 'Saúde', 'general' => 'Contexto geral']; + } + + /** @param list $territories + * @return array */ + public function analyse(array $territories, int $start, int $end, string $sector = 'general', ?string $edition = null): array + { + $result = ['state' => 'unavailable', 'start_year' => $start, 'end_year' => $end, 'sector' => $sector, 'territories' => [], 'differences' => [], 'comparisons' => [], + 'limitations' => ['População residente não mede procura efectiva ou poder de compra.', 'Idade activa não demonstra disponibilidade ou qualificação de mão-de-obra.', + 'Sem extrapolação: anos sem série oficial permanecem sem dados.', 'A demografia não altera impostos, incentivos ou probabilidades de sucesso.']]; + if (! $this->installed() || $territories === []) { + return $result; + } + $locations = $this->territories()->whereIn('id', $territories)->get(['id', 'name', 'location_type']); + $records = DB::table('demographic_observations as o')->join('demographic_imports as b', 'b.id', '=', 'o.import_id') + ->where('b.status', 'approved')->whereIn('o.geo_location_id', $locations->pluck('id'))->whereBetween('o.year', [$start, $end]) + ->where('o.sex', 'all')->when($edition, fn ($q) => $q->where('b.id', $edition)) + ->orderBy('o.year')->orderBy('o.import_id')->orderBy('o.id') + ->get(['o.*', 'b.source', 'b.publication_version', 'b.sha256', 'b.file_name']); + $issuesByImport = DB::table('demographic_imports')->whereIn('id', $records->pluck('import_id')->unique()->all()) + ->get(['id', DB::raw("report->'issue_counts' AS issue_counts")])->keyBy('id'); + foreach ($locations as $location) { + $series = []; + foreach ($records->where('geo_location_id', $location->id)->groupBy('import_id') as $importId => $rows) { + $first = $rows->first(); + $issueCounts = json_decode($issuesByImport->get($importId)->issue_counts ?? '{}', true, 512, JSON_THROW_ON_ERROR); + $values = $rows->filter(function ($r) use ($sector) { + if ($r->indicator !== 'population') { + return in_array($sector, ['health', 'general'], true); + } + + return $r->age_group === 'all' || in_array($sector, ['education', 'health', 'industry', 'agriculture', 'general'], true); + })->map(fn ($r) => ['year' => $r->year, 'indicator' => $r->indicator, 'age_group' => $r->age_group, 'residence' => $r->residence, + 'value' => $r->numeric_value, 'original_value' => $r->original_value, 'unit' => $r->unit, 'data_kind' => $r->data_kind, + 'sheet' => $r->sheet, 'cell' => $r->cell, 'validation_status' => $r->validation_status])->values()->all(); + $years = array_values(array_unique(array_column($values, 'year'))); + $series[] = ['import_id' => $importId, 'source' => $first->source, 'version' => $first->publication_version, 'sha256' => $first->sha256, 'file_name' => $first->file_name, + 'values' => $values, 'missing_years' => array_values(array_diff(range($start, $end), $years)), 'issue_counts' => $issueCounts]; + } + $result['territories'][] = ['id' => $location->id, 'name' => $location->name, 'level' => $location->location_type, 'series' => $series, + 'factors_to_assess' => match ($sector) { + 'industry' => ['Estrutura etária e evolução da população; verificar qualificações, mobilidade e emprego.'], + 'agriculture' => ['População rural e mercados locais; relacionar com os clusters documentados.'], + 'education' => ['Grupos etários da população-alvo; verificar cobertura e capacidade dos serviços.'], + 'health' => ['Estrutura etária e estatísticas vitais com unidades conhecidas; verificar cobertura dos serviços.'], + default => ['Dimensão e evolução da população; confrontar com rendimento, acesso e condições sectoriais.'], + }]; + } + // Identify concurrent values without summing editions or choosing a supposedly newer one. + foreach ($result['territories'] as $territory) { + $byDimension = []; + foreach ($territory['series'] as $series) { + foreach ($series['values'] as $row) { + $key = implode('|', [$row['year'], $row['indicator'], $row['age_group'], $row['residence'], $row['unit']]); + $byDimension[$key][] = ['import_id' => $series['import_id'], 'value' => $row['value'], 'data_kind' => $row['data_kind']]; + } + } + foreach ($byDimension as $key => $values) { + if (count($values) > 1) { + $result['differences'][] = ['territory_id' => $territory['id'], 'dimension' => $key, 'state' => count(array_unique(array_column($values, 'value'))) === 1 ? 'matching_values' : 'divergent_values', 'values' => $values]; + } + } + } + $result['state'] = $records->isEmpty() ? 'no_data' : 'available'; + foreach ($result['territories'] as $i => $left) { + foreach (array_slice($result['territories'], $i + 1) as $right) { + foreach ($left['series'] as $a) { + foreach ($right['series'] as $b) { + foreach (array_unique([$start, $end]) as $year) { + $isTotal = fn ($r) => $r['year'] === $year && $r['indicator'] === 'population' && $r['age_group'] === 'all' && $r['residence'] === 'all'; + $x = array_values(array_filter($a['values'], $isTotal))[0] ?? null; + $y = array_values(array_filter($b['values'], $isTotal))[0] ?? null; + if (! $x || ! $y) { + continue; + } + $comparable = $left['level'] === $right['level'] && $x['unit'] === $y['unit'] && $x['data_kind'] === $y['data_kind'] && $a['version'] === $b['version']; + $delta = $comparable ? DB::selectOne('SELECT (?::numeric - ?::numeric)::text AS value', [$x['value'], $y['value']])->value : null; + $result['comparisons'][] = ['year' => $year, 'left' => $left['name'], 'right' => $right['name'], 'left_value' => $x['value'], 'right_value' => $y['value'], + 'left_import' => $a['import_id'], 'right_import' => $b['import_id'], 'difference' => $delta, + 'explanation' => $comparable ? 'Diferença dos totais de população no mesmo ano, nível, tipo de dado, unidade e identificação de edição. Não mede procura efectiva.' : 'Âmbitos ou metadados distintos; não se calculou uma diferença como se fossem equivalentes.']; + } + } + } + } + } + + return $result; + } + + /** @param array $context + * @return array */ + public function forContext(array $context): array + { + $fields = $context['fields'] ?? []; + $id = ($fields['district_id'] ?? null) ?: ($fields['province_id'] ?? null); + + // No inference from an influence area to a project's implantation territory. + return $this->analyse($id ? [$id] : [], (int) date('Y'), (int) date('Y'), 'general'); + } +} diff --git a/app/Services/DemographicImport.php b/app/Services/DemographicImport.php new file mode 100644 index 00000000..f92bff2f --- /dev/null +++ b/app/Services/DemographicImport.php @@ -0,0 +1,209 @@ +can('manage-portal') && ! app(PortalProfileAccess::class)->has($actor, 'auditor'), 403); + abort_unless($actor->two_factor_confirmed_at && $actor->two_factor_secret, 403, 'Confirme MFA para gerir dados demográficos.'); + if (! IsolatedQaDatabase::allowsSchemaChanges()) { + abort_unless(app(DemographicInstallation::class)->activeTarget() && app(DemographicEvidence::class)->installed(), 403, 'Destino demográfico não instalado ou não autorizado.'); + abort_unless(app(PortalProfileAccess::class)->mfa($actor), 403, 'Conclua MFA nesta sessão para gerir dados demográficos.'); + } + } + + /** @return array */ + public function prepare(User $actor, string $file, string $name, string $version, ?int $baselineYear): array + { + $this->authorize($actor); + abort_unless(is_file($file) && filesize($file) <= 20_000_000 && strtolower(pathinfo($name, PATHINFO_EXTENSION)) === 'xlsx', 422); + $sha = CheckedFile::sha256($file); + $existing = DB::table('demographic_imports')->where('sha256', $sha)->first(); + if ($existing) { + return $this->preview($actor, $existing->id); + } + $id = (string) Str::uuid(); + $directory = 'demography/'.$id; + $disk = Storage::disk('local'); + $disk->makeDirectory($directory); + $path = $disk->path($directory.'/original.xlsx'); + abort_unless(copy($file, $path) && CheckedFile::matches($path, $sha), 409); + $scan = app(MalwareScanner::class)->scan($path, (int) filesize($path), $disk->path($directory)); + abort_unless($scan['result'] === 'clean', 423, 'Análise antimalware pendente ou não limpa; original privado conservado.'); + $output = $disk->path($directory.'/preview.json'); + $command = [config('demography.python', 'python'), base_path('tools/demography_workbook.py'), $path, '--output', $output, '--records-output', $disk->path($directory.'/records.ndjson')]; + if ($baselineYear !== null) { + array_push($command, '--baseline-year', (string) $baselineYear); + } + $process = new Process($command, base_path(), timeout: 120); + $process->run(); + abort_unless($process->isSuccessful(), 422, 'Não foi possível reconhecer o Excel; confira a estrutura e o ano de referência.'); + $report = json_decode(CheckedFile::read($output), true, 512, JSON_THROW_ON_ERROR); + abort_unless(hash_equals($sha, $report['sha256']) && CheckedFile::matches($path, $sha), 409); + $summary = array_diff_key($report, ['records' => true]); + $summary['scan'] = ['result' => $scan['result'], 'engine' => $scan['engine'], 'engine_version' => $scan['engine_version'], 'sha256' => $sha]; + // The supplied publication label is provenance metadata, never an invented edition/date. + DB::table('demographic_imports')->insert(['id' => $id, 'sha256' => $sha, 'file_name' => basename($name), + 'source' => $report['source'], 'publication_version' => $version, 'status' => 'prepared', + 'report' => json_encode($summary, JSON_THROW_ON_ERROR), 'preview_sha256' => CheckedFile::sha256($output), + 'prepared_by' => $actor->id, 'created_at' => now(), 'updated_at' => now()]); + $this->event($id, $actor, 'prepared', 'Pré-visualização do original; sem aprovação de utilização.', ['sha256' => $sha]); + + return $this->preview($actor, $id); + } + + public static function key(string $province, string $territory, string $level): string + { + return $province.'|'.$territory.'|'.$level; + } + + /** @return array */ + public function preview(User $actor, string $id): array + { + $this->authorize($actor); + $batch = DB::table('demographic_imports')->where('id', $id)->first(); + abort_unless($batch !== null, 404); + $report = json_decode($batch->report, true, 512, JSON_THROW_ON_ERROR); + $locations = DB::table('geo_locations')->whereIn('location_type', ['province', 'district'])->whereNull('deleted_at')->get(['id', 'name', 'parent_id', 'location_type']); + $matches = []; + foreach ($report['territories'] as [$province, $territory, $level]) { + $provinces = $locations->filter(fn ($g) => $g->location_type === 'province' && $this->normalize($g->name) === $this->normalize($province)); + $candidates = $level === 'province' ? $provinces : $locations->filter(fn ($g) => $g->location_type === 'district' && $provinces->contains('id', $g->parent_id) && $this->normalize($g->name) === $this->normalize($territory)); + $key = self::key($province, $territory, $level); + if ($level === 'district') { + $headers = $report['territory_headers'][$key] ?? []; + if ($headers !== [] && $candidates->count() > 1 && array_all($headers, fn ($h) => preg_match('/^Distrito de /i', $h) === 1)) { + $candidates = $candidates->filter(fn ($g) => ! preg_match('/^CIDADE /i', $g->name)); + } + if ($headers !== [] && $candidates->count() > 1 && array_all($headers, fn ($h) => preg_match('/^Cidade (de|da) /i', $h) === 1)) { + $candidates = $candidates->filter(fn ($g) => preg_match('/^CIDADE /i', $g->name) === 1); + } + $manifest = DemographicInstallation::remainingManifest(); + $hashes = array_column($manifest['files'], 'sha256'); + $alias = in_array($batch->sha256, $hashes, true) ? ($manifest['aliases'][$key] ?? null) : null; + if ($alias !== null) { + $candidates = $locations->filter(fn ($g) => $g->location_type === 'district' && $provinces->contains('id', $g->parent_id) && $this->literal($g->name) === $this->literal($alias)); + } + } + $matches[] = ['key' => self::key($province, $territory, $level), 'province' => $province, 'territory' => $territory, 'level' => $level, + 'geo_location_id' => $candidates->count() === 1 ? $candidates->first()->id : null, 'state' => $candidates->count() === 1 ? 'matched' : ($candidates->isEmpty() ? 'missing' : 'ambiguous')]; + } + + return ['id' => $id, 'file_name' => $batch->file_name, 'sha256' => $batch->sha256, 'publication_version' => $batch->publication_version, + 'status' => $batch->status, 'report' => $report, 'matches' => $matches, + 'territory_options' => $locations->values()->all(), 'events' => DB::table('demographic_events')->where('import_id', $id)->orderBy('id')->get()]; + } + + private function normalize(string $name): string + { + return preg_replace('/^(cidade|distrito) (de|da) /', '', $this->literal($name)); + } + + private function literal(string $name): string + { + $name = str_replace(['`', '’', '‘', '´'], "'", Str::ascii($name)); + return preg_replace('/\s+/', ' ', trim(strtolower(str_replace(['-', '–'], ' ', $name)))); + } + + /** @param array $mapping + * @return array */ + public function confirm(User $actor, string $id, string $sha, array $mapping, string $reason): array + { + $this->authorize($actor); + + return DB::transaction(function () use ($actor, $id, $sha, $mapping, $reason) { + $batch = DB::table('demographic_imports')->where('id', $id)->lockForUpdate()->first(); + abort_unless($batch && hash_equals($batch->sha256, $sha), 409); + if ($batch->status !== 'prepared') { + return ['id' => $id, 'status' => $batch->status, 'records' => DB::table('demographic_observations')->where('import_id', $id)->count(), 'repeated' => true]; + } + $disk = Storage::disk('local'); + $file = $disk->path('demography/'.$id.'/preview.json'); + abort_unless(is_file($file) && CheckedFile::matches($file, $batch->preview_sha256) && CheckedFile::matches($disk->path('demography/'.$id.'/original.xlsx'), $sha), 409, 'Prévia ou original alterados.'); + $report = json_decode(CheckedFile::read($file), true, 512, JSON_THROW_ON_ERROR); + $blocking = array_intersect(array_keys($report['issue_counts']), ['conflicting_value', 'duplicate_value', 'unsupported_sheet', 'unsupported_population_headers', 'reference_year_required', 'title_year_mismatch', 'invalid_numeric_or_formula']); + abort_if($blocking !== [], 422, 'Corrija os erros estruturais antes de confirmar: '.implode(', ', $blocking)); + $plan = $this->preview($actor, $id); + $resolved = []; + foreach ($plan['matches'] as $match) { + $locationId = $mapping[$match['key']] ?? $match['geo_location_id']; + $location = DB::table('geo_locations')->where('id', $locationId)->whereNull('deleted_at')->first(); + abort_unless($location && $location->location_type === $match['level'], 422, 'Correspondência territorial por resolver.'); + if ($match['level'] === 'district') { + $provinceKey = self::key($match['province'], $match['province'], 'province'); + $provinceMatch = array_values(array_filter($plan['matches'], fn ($m) => $m['key'] === $provinceKey))[0] ?? null; + abort_unless($location->parent_id === ($mapping[$provinceKey] ?? $provinceMatch['geo_location_id'] ?? null), 422, 'Distrito fora da província indicada.'); + } + abort_if(in_array($locationId, $resolved, true), 422, 'Duas designações não podem ser fundidas na mesma localização.'); + $resolved[$match['key']] = $locationId; + } + $chunk = []; + $recordCount = 0; + foreach ($this->recordRows($report, $disk->path('demography/'.$id.'/records.ndjson')) as $row) { + $recordCount++; + $chunk[] = ['import_id' => $id, 'geo_location_id' => $resolved[self::key($row['province'], $row['territory'], $row['level'])], + ...array_intersect_key($row, array_flip(['year', 'indicator', 'sex', 'residence', 'age_group', 'unit', 'data_kind', 'original_value', 'numeric_value', 'sheet', 'cell'])), + 'validation_status' => $report['issues'] === [] ? 'valid' : 'warning']; + if (count($chunk) === 500) { + DB::table('demographic_observations')->insert($chunk); + $chunk = []; + } + } + if ($chunk !== []) { + DB::table('demographic_observations')->insert($chunk); + } + abort_unless($recordCount === $report['record_count'], 409, 'O número de observações difere da prévia.'); + DB::table('demographic_imports')->where('id', $id)->update(['status' => 'imported', 'updated_at' => now()]); + $this->event($id, $actor, 'imported', $reason, ['mapping' => $resolved, 'records' => $recordCount, 'sha256' => $sha]); + + return ['id' => $id, 'status' => 'imported', 'records' => $recordCount, 'repeated' => false]; + }); + } + + /** @param array $report + * @return iterable> */ + private function recordRows(array $report, string $path): iterable + { + if (! isset($report['records_file_sha256'])) { + yield from $report['records']; + return; + } + abort_unless(is_file($path) && CheckedFile::matches($path, $report['records_file_sha256']), 409, 'As observações diferem da prévia conferida.'); + $stream = new \SplFileObject($path, 'r'); + while (! $stream->eof()) { + $line = $stream->fgets(); + if (trim($line) === '') { continue; } + yield json_decode($line, true, 512, JSON_THROW_ON_ERROR); + } + } + + public function transition(User $actor, string $id, string $action, string $reason): void + { + $this->authorize($actor); + DB::transaction(function () use ($actor, $id, $action, $reason) { + $batch = DB::table('demographic_imports')->where('id', $id)->lockForUpdate()->first(); + abort_unless($batch !== null, 404); + abort_unless(in_array($action, ['approved', 'disabled'], true) && $batch->status !== 'prepared', 422); + // No deletes, replacement of other editions, or automatic publication in production. + DB::table('demographic_imports')->where('id', $id)->update(['status' => $action, 'updated_at' => now()]); + $this->event($id, $actor, $action, $reason, ['previous_status' => $batch->status]); + }); + } + + /** @param array $details */ + private function event(string $id, User $actor, string $action, string $reason, array $details): void + { + DB::table('demographic_events')->insert(['import_id' => $id, 'actor_id' => $actor->id, 'action' => $action, 'reason' => $reason, 'details' => json_encode($details, JSON_THROW_ON_ERROR), 'created_at' => now()]); + } +} diff --git a/app/Services/DemographicInstallation.php b/app/Services/DemographicInstallation.php new file mode 100644 index 00000000..ada3740a --- /dev/null +++ b/app/Services/DemographicInstallation.php @@ -0,0 +1,303 @@ + ['sha256' => self::MANICA_SHA256, 'records' => 71604], + 'Inhambane.xlsx' => ['sha256' => '51a9b91dfb6e32e5b49def115cb007f21faa97b3d0584b16ef911b22b89bd818', 'records' => 82620], + 'Dados demograficos.xlsx' => ['sha256' => '4763aaa7476f3ae24564e9750ac2ac8babb07dfbba67473a180fb9b1f47eb335', 'records' => 482], + ]; + + /** @return array */ + public static function remainingManifest(): array + { + return json_decode(CheckedFile::read(database_path('data/demography-remaining-20261113.json')), true, 512, JSON_THROW_ON_ERROR); + } + + /** @return array */ + public static function zambeziaManifest(): array + { + return json_decode(CheckedFile::read(database_path('data/demography-zambezia-20261113.json')), true, 512, JSON_THROW_ON_ERROR); + } + + /** @return list */ + public static function publicDistrictRefs(): array + { + $refs = [self::MANICA_SHA256.':Macate', self::MANICA_SHA256.':Vanduzi']; + foreach ([self::remainingManifest(), self::zambeziaManifest()] as $manifest) { + foreach ($manifest['new_districts'] as $province => $names) { + $source = array_values(array_filter($manifest['files'], fn ($f) => $f['province'] === $province))[0]['sha256']; + foreach ($names as $name) { $refs[] = $source.':'.$name; } + } + } + return $refs; + } + + /** @return list */ + public function files(): array + { + return ['database/data/demography-zambezia-20261113.json', 'database/data/demography-remaining-20261113.json', 'app/Services/DemographicInstallation.php', 'app/Services/DemographicImport.php', 'app/Services/DemographicEvidence.php', + 'app/Services/InvestmentGeography.php', 'app/Services/InvestmentPreparationWorkspace.php', 'app/Http/Controllers/DemographyController.php', + 'database/migrations/'.self::MIGRATION.'.php', 'config/demography.php', 'routes/demography.php', 'routes/web.php', 'tools/demography_workbook.py', + 'resources/js/components/demographic-context.tsx', 'resources/js/components/demographic-evidence.tsx', 'resources/js/components/simulation-form.tsx', + 'resources/js/components/structure-geography.tsx', 'resources/js/pages/investment/demography.tsx', 'resources/js/pages/investment/catalogue.tsx', + 'resources/js/pages/investment/detail.tsx', 'resources/js/pages/management/demography.tsx', 'resources/js/pages/management/demography-install.tsx', + 'resources/js/pages/management/shared.tsx']; + } + + public function fingerprint(): string + { + $files = []; + foreach ($this->files() as $path) { + $files[$path] = CheckedFile::sha256(base_path($path)); + } + + return hash('sha256', json_encode($files, JSON_THROW_ON_ERROR)); + } + + public function activeTarget(): bool + { + $c = config('database.connections.pgsql'); + $homologation = config('app.url') === 'https://teste-investidor.tempo.co.mz' + && config('demography.enabled', false) && $c['database'] === 'teste_investidor'; + if (app()->environment('testing') || config('database.default') !== 'pgsql' || ! empty($c['url']) + || ! in_array($c['host'], ['127.0.0.1', 'localhost'], true) || (int) $c['port'] !== 5432 + || ($c['database'] !== 'investemoz' && ! $homologation)) { + return false; + } + $target = DB::selectOne('SELECT current_database() AS database,inet_server_port() AS port'); + + return $target->database === $c['database'] && (int) $target->port === 5432; + } + + public function schemaAllowed(): bool + { + if (IsolatedQaDatabase::allowsSchemaChanges()) { + return true; + } + $actor = auth()->user(); + if (! config('demography.authenticated_installation', false) || ! $actor || ! $this->activeTarget()) { + return false; + } + app(PortalProfileInstallation::class)->authorize($actor, true); + + return true; + } + + private function authorize(User $actor, bool $write): void + { + app(PortalProfileInstallation::class)->authorize($actor, $write); + abort_unless($this->activeTarget() || IsolatedQaDatabase::allowsSchemaChanges(), 403, 'Destino não autorizado para esta entrega.'); + } + + /** @return array */ + public function preview(User $actor): array + { + $this->authorize($actor, false); + $proofFile = storage_path('app/private/demography-deployment/readiness.json'); + $proof = is_file($proofFile) ? json_decode(CheckedFile::read($proofFile), true, 512, JSON_THROW_ON_ERROR) : []; + $code = $this->fingerprint(); + $target = (array) DB::selectOne('SELECT current_database() AS database,inet_server_port() AS port'); + $qa = IsolatedQaDatabase::allowsSchemaChanges(); + $ready = $qa || (($proof['code_sha256'] ?? '') === $code && ($proof['qa_passed'] ?? false) && ($proof['compatibility_verified'] ?? false) + && ($proof['restore_verified'] ?? false) && ($proof['files_verified'] ?? false) && ($proof['target']['database'] ?? '') === $target['database'] + && (int) ($proof['target']['port'] ?? 0) === (int) $target['port'] && ($proof['decision'] ?? '') !== '' + && strtotime($proof['verified_at'] ?? '') >= time() - 86400 && strtotime($proof['verified_at'] ?? '') <= time()); + if (! $qa) { + foreach (['dump', 'files'] as $kind) { + $file = $proof[$kind.'_path'] ?? ''; + $ready = $ready && is_file($file) && CheckedFile::matches($file, $proof[$kind.'_sha256'] ?? ''); + } + $ready = $ready && CheckedFile::matches(base_path('.env'), $proof['environment_sha256'] ?? '') + && is_file(public_path('build/manifest.json')) && CheckedFile::matches(public_path('build/manifest.json'), $proof['release_manifest_sha256'] ?? ''); + foreach ($proof['release_files'] ?? [] as $relative => $sha) { + $file = public_path('build/'.$relative); + $ready = $ready && ! str_contains($relative, '..') && ! str_contains($relative, ':') && is_file($file) && CheckedFile::matches($file, $sha); + } + } + $tables = array_map(fn ($t) => Schema::hasTable($t), ['demographic_imports', 'demographic_observations', 'demographic_events']); + $ledger = DB::table('migrations')->where('migration', self::MIGRATION)->exists(); + $consistent = ($ledger && ! in_array(false, $tables, true)) || (! $ledger && ! in_array(true, $tables, true)); + $runtime = new Process([config('demography.python', 'python'), '-c', 'import sys; assert sys.version_info >= (3, 9)'], base_path(), timeout: 15); + try { + $runtime->run(); + $runtimeReady = $runtime->isSuccessful(); + } catch (ExceptionInterface) { + $runtimeReady = false; + } + $mode = $ledger ? 'remaining' : 'initial'; + $manifest = self::remainingManifest(); + if ($ledger && DB::table('demographic_imports')->whereIn('sha256', array_column($manifest['files'], 'sha256'))->where('status', 'approved')->count() === count($manifest['files'])) { $mode = 'zambezia'; $manifest = self::zambeziaManifest(); } + $files = $mode !== 'initial' ? $manifest['files'] : self::FILES; + $already = $ledger ? DB::table('demographic_imports')->whereIn('sha256', array_column($files, 'sha256'))->where('status', 'approved')->pluck('sha256')->all() : []; + $pending = array_filter($files, fn ($f) => ! in_array($f['sha256'], $already, true)); + $state = ['mode' => $mode, 'pending_count' => count($pending), 'aliases' => $mode !== 'initial' ? $manifest['aliases'] : [], 'alias_sources' => $mode !== 'initial' ? $manifest['sources'] : [], 'missing_province_source' => $manifest['missing_province_source'], 'target' => (array) DB::selectOne('SELECT current_database() AS database,inet_server_port() AS port'), + 'migration' => self::MIGRATION, 'code_sha256' => $code, 'backup_verified' => $ready, 'consistent' => $consistent, + 'ready' => $ready && $consistent && $runtimeReady && count($pending) > 0, 'runtime_ready' => $runtimeReady, 'installed' => $ledger, 'files' => $files, 'new_districts' => $mode !== 'initial' ? array_merge(...array_values($manifest['new_districts'])) : ['Macate', 'Vanduzi'], + 'mfa_confirmed' => app(PortalProfileAccess::class)->mfa($actor), + 'notice' => ($runtimeReady ? '' : 'O interpretador do importador está indisponível; a execução permanece bloqueada. ').'Preservar seis advertências de Manica/2031, unidades ausentes e versões estatísticas. A instalação não corrige os originais nem concede permissões.']; + + return [...$state, 'hash' => hash_hmac('sha256', json_encode([$actor->id, session()->getId(), $state], JSON_THROW_ON_ERROR), config('app.key'))]; + } + + /** @param list $preservedHashes + * @return array */ + private function protectedState(array $preservedHashes = []): array + { + $state = []; + foreach (['desk_cases', 'simulation_form_drafts', 'funding_programmes', 'funding_programme_versions', 'funding_programme_interests', + 'labour_demands', 'training_capacities', 'opportunities', 'investment_dossiers', 'projects', 'economic_clusters'] as $table) { + if (Schema::hasTable($table)) { + $rows = DB::select('SELECT row_to_json(t)::text AS row FROM "'.$table.'" t ORDER BY row_to_json(t)::text'); + $state[$table] = ['count' => count($rows), 'sha256' => hash('sha256', implode("\n", array_map(fn ($r) => $r->row, $rows)))]; + } + } + + if (Schema::hasTable('demographic_imports')) { + $ids = DB::table('demographic_imports')->whereIn('sha256', $preservedHashes ?: array_column(self::FILES, 'sha256'))->pluck('id'); + foreach (['demographic_imports' => 'id', 'demographic_observations' => 'import_id', 'demographic_events' => 'import_id'] as $table => $key) { + $digest = hash_init('sha256'); + $count = 0; + DB::table($table)->whereIn($key, $ids)->chunkById(500, function ($rows) use ($digest, &$count) { + foreach ($rows as $row) { + if ($count > 0) { hash_update($digest, "\n"); } + hash_update($digest, json_encode($row, JSON_THROW_ON_ERROR)); + $count++; + } + }); + $state['accepted_'.$table] = ['count' => $count, 'sha256' => hash_final($digest)]; + } + } + return $state; + } + + private function territories(User $actor): void + { + $province = app(InvestmentGeography::class)->publicReferences()->where('location_type', 'province')->whereRaw('lower(name)=?', ['manica'])->get(['id']); + abort_unless($province->count() === 1, 422, 'Província de Manica ambígua ou indisponível.'); + foreach (['Macate', 'Vanduzi'] as $name) { + $matches = DB::table('geo_locations')->where('parent_id', $province->first()->id)->where('location_type', 'district')->whereRaw('lower(trim(name))=?', [strtolower($name)])->get(); + if ($matches->isNotEmpty()) { + abort_unless($matches->count() === 1 && $matches->first()->deleted_at === null, 409, 'Cadastro territorial divergente; não restaurar nem fundir automaticamente.'); + + continue; + } + $id = (string) Str::uuid(); + DB::table('geo_locations')->insert(['id' => $id, 'parent_id' => $province->first()->id, 'name' => $name, 'location_type' => 'district', + 'code' => 'INE-DEMOGRAPHY-'.strtoupper($name), 'source_system' => 'ine-demography', 'external_id' => self::MANICA_SHA256.':'.$name, + 'data_classification' => 'public', 'version_no' => 1, 'created_at' => now(), 'updated_at' => now()]); + app(PortalProfileAccess::class)->audit($actor, 'demography_territory_created', ['territory_id' => $id, 'name' => $name, + 'source_sha256' => self::MANICA_SHA256, 'decision' => 'Autorização expressa do proprietário em 13/11/2026; destino conferido pelo instalador.', + 'scope' => 'Identificação territorial da série INE; sem limites geográficos ou direitos territoriais presumidos.']); + } + } + + /** @param array $manifest */ + private function remainingTerritories(User $actor, array $manifest): void + { + foreach ($manifest['new_districts'] as $province => $names) { + $parents = app(InvestmentGeography::class)->publicReferences()->where('location_type', 'province')->whereRaw('lower(name)=?', [mb_strtolower($province)])->pluck('id'); + abort_unless($parents->count() === 1, 409); + $source = array_values(array_filter($manifest['files'], fn ($f) => $f['province'] === $province))[0]['sha256']; + foreach ($names as $name) { + $existing = DB::table('geo_locations')->where('parent_id', $parents[0])->where('location_type', 'district')->whereRaw('lower(trim(name))=?', [mb_strtolower($name)])->get(); + if ($existing->isNotEmpty()) { abort_unless($existing->count() === 1 && $existing[0]->deleted_at === null, 409); continue; } + $id = (string) Str::uuid(); + DB::table('geo_locations')->insert(['id' => $id, 'parent_id' => $parents[0], 'name' => $name, 'location_type' => 'district', 'code' => 'INE-DEMOGRAPHY-'.strtoupper($name), 'source_system' => 'ine-demography', 'external_id' => $source.':'.$name, 'data_classification' => 'public', 'version_no' => 1]); + app(PortalProfileAccess::class)->audit($actor, 'demography_territory_created', ['territory_id' => $id, 'name' => $name, 'source_sha256' => $source, 'basis' => $manifest['authority']]); + } + } + } + + /** @param array $input + * @return array */ + public function apply(User $actor, array $input): array + { + $this->authorize($actor, true); + $data = Validator::make($input, ['hash' => 'required|string|size:64', 'operation_key' => 'required|uuid', + 'mode' => 'nullable|in:initial,remaining,zambezia', 'confirm' => 'required|accepted', 'reason' => 'required|string|min:20|max:1000'])->validate(); + $mode = $data['mode'] ?? 'initial'; + $files = $mode === 'initial' ? self::FILES : ($mode === 'zambezia' ? self::zambeziaManifest()['files'] : self::remainingManifest()['files']); + $preservedHashes = $mode === 'zambezia' ? array_column([...self::FILES, ...self::remainingManifest()['files']], 'sha256') : array_column(self::FILES, 'sha256'); + $action = $mode === 'zambezia' ? 'extend_zambezia' : ($mode === 'remaining' ? 'extend_provinces' : 'install_and_import'); + $payload = hash('sha256', json_encode($mode === 'initial' ? [$actor->id, $data['reason']] : [$actor->id, $data['reason'], $mode, $files], JSON_THROW_ON_ERROR)); + $existing = DB::table('audit_events')->where('source_system', 'demography-installation')->where('action', $action)->where('correlation_id', $data['operation_key'])->first(); + if ($existing) { + $event = json_decode($existing->after_data, true, 512, JSON_THROW_ON_ERROR); + abort_unless((int) $existing->actor_user_id === $actor->id && hash_equals($event['payload_sha256'], $payload), 409); + + return [...$event['result'], 'repeated' => true]; + } + $plan = $this->preview($actor); + abort_unless($plan['ready'] && $plan['mode'] === $mode && hash_equals($plan['hash'], $data['hash']), 409, 'Consulte a prévia actual; código, destino ou provas mudaram.'); + set_time_limit(300); + + return DB::transaction(function () use ($actor, $data, $payload, $mode, $files, $action, $preservedHashes) { + DB::select('SELECT pg_advisory_xact_lock(131126, 100000)'); + // Recheck after the lock as another request may have completed while we waited. + $existing = DB::table('audit_events')->where('source_system', 'demography-installation')->where('action', $action)->where('correlation_id', $data['operation_key'])->first(); + if ($existing) { + $event = json_decode($existing->after_data, true, 512, JSON_THROW_ON_ERROR); + abort_unless((int) $existing->actor_user_id === $actor->id && hash_equals($event['payload_sha256'], $payload), 409); + + return [...$event['result'], 'repeated' => true]; + } + $before = $this->protectedState($preservedHashes); + $previous = config('demography.authenticated_installation'); + config(['demography.authenticated_installation' => true]); + try { + if ($mode === 'initial') { + abort_unless(Artisan::call('migrate', ['--path' => 'database/migrations/'.self::MIGRATION.'.php', '--force' => true]) === 0, 500, 'Falha ao instalar a estrutura demográfica.'); + } else { abort_unless(Schema::hasTable('demographic_observations'), 409); } + } finally { + config(['demography.authenticated_installation' => $previous]); + } + if ($mode === 'initial') { $this->territories($actor); } else { $this->remainingTerritories($actor, $mode === 'zambezia' ? self::zambeziaManifest() : self::remainingManifest()); } + $receipts = []; + $directory = config('demography.source_directory', 'C:/Mac/Home/Documents/TEMPO/Portal Tempo/Servicos Tempo/portal do investidor/demografia/Provincias'); + $service = app(DemographicImport::class); + foreach ($files as $name => $expected) { + $old = DB::table('demographic_imports')->where('sha256', $expected['sha256'])->first(); + if ($old && $old->status === 'approved') { + $count = DB::table('demographic_observations')->where('import_id', $old->id)->count(); + abort_unless($count === $expected['records'], 409); + $receipts[] = ['file' => $name, 'sha256' => $expected['sha256'], 'id' => $old->id, 'records' => $count, 'preserved' => true]; + continue; + } + $file = $directory.'/'.$name; + abort_unless(is_file($file) && CheckedFile::matches($file, $expected['sha256']), 409, 'O exemplar aprovado mudou: '.$name); + $plan = $service->prepare($actor, $file, $name, 'Exemplar INE fornecido pela Tempo; edição não indicada; SHA256 identifica a versão', $name === 'Dados demograficos.xlsx' ? 2017 : null); + $receipt = $service->confirm($actor, $plan['id'], $expected['sha256'], [], $data['reason']); + abort_unless($receipt['records'] === $expected['records'], 409, 'Contagem divergente da homologação: '.$name); + $service->transition($actor, $plan['id'], 'approved', $data['reason']); + $receipts[] = ['file' => $name, 'sha256' => $expected['sha256'], 'id' => $plan['id'], 'records' => $receipt['records']]; + } + abort_unless($before === ($mode === 'initial' ? array_filter($this->protectedState($preservedHashes), fn ($key) => ! str_starts_with($key, 'accepted_'), ARRAY_FILTER_USE_KEY) : $this->protectedState($preservedHashes)), 409, 'Estado protegido alterado; instalação revertida.'); + $result = ['installed' => true, 'target' => (array) DB::selectOne('SELECT current_database() AS database,inet_server_port() AS port'), + 'imports' => $receipts, 'protected_state' => $before, 'record_count' => array_sum(array_column($receipts, 'records')), 'at' => now()->toIso8601String()]; + DB::table('audit_events')->insert(['source_system' => 'demography-installation', 'entity_type' => 'demographic_series', + 'actor_user_id' => $actor->id, 'action' => $action, 'correlation_id' => $data['operation_key'], 'data_classification' => 'restricted', + 'after_data' => json_encode(['payload_sha256' => $payload, 'reason' => $data['reason'], 'result' => $result], JSON_THROW_ON_ERROR)]); + + return $result; + }); + } +} diff --git a/app/Services/InvestmentGeography.php b/app/Services/InvestmentGeography.php index e104a67e..cdc072e8 100644 --- a/app/Services/InvestmentGeography.php +++ b/app/Services/InvestmentGeography.php @@ -138,6 +138,10 @@ final class InvestmentGeography $query->where(function ($workbook) { $workbook->where('source_system', 'cartografia-workbook') ->where('external_id', 'like', '964a187ad32ea553b9e112cd159caa90b900050c42b7329594a75bcd798a96ff:%'); + })->orWhere(function ($demography) { + // Owner, 13/11/2026: only these source-backed additions are authorised. + $demography->where('source_system', 'ine-demography')->where('location_type', 'district') + ->whereIn('external_id', DemographicInstallation::publicDistrictRefs()); })->orWhereIn('id', app(TerritorialRegistry::class)->published()->select('g.id')); }); } diff --git a/app/Services/InvestmentPreparationWorkspace.php b/app/Services/InvestmentPreparationWorkspace.php index 50bcebf8..558ddf6f 100644 --- a/app/Services/InvestmentPreparationWorkspace.php +++ b/app/Services/InvestmentPreparationWorkspace.php @@ -127,6 +127,11 @@ final class InvestmentPreparationWorkspace { $objects = [['key' => 'investment:'.$case->id, 'label' => $case->title, 'kind' => 'investment']]; $evidence = []; + $demography = app(DemographicEvidence::class)->forContext($context); + if ($demography['state'] === 'available') { + $evidence['demography'] = ['key' => 'demography', 'label' => 'Contexto demográfico INE', 'current' => $demography, + 'notice' => 'Evidência para análise SWOT; não produz conclusões automáticas. Consulte ano, edição e limitações.']; + } foreach ($context['sector_references'] ?? [] as $reference) { $current = hash_equals((SectorResourceReferences::SOURCES[$reference['sector_slug']] ?? ''), $reference['source_sha256'] ?? '') ? $reference : ['unavailable' => true, 'source_sha256' => (SectorResourceReferences::SOURCES[$reference['sector_slug']] ?? '')]; $evidence['sector-resource:'.$reference['key']] = ['key' => 'sector-resource:'.$reference['key'], 'label' => $reference['title'], 'consulted' => $reference, 'current' => $current, 'notice' => 'Referência sectorial e de cadeia de valor; não certifica direitos, licenças nem disponibilidade de projecto.']; diff --git a/config/demography.php b/config/demography.php new file mode 100644 index 00000000..7233d3b6 --- /dev/null +++ b/config/demography.php @@ -0,0 +1,10 @@ + env('DEMOGRAPHY_ENABLED', env('APP_URL') !== 'https://teste-investidor.tempo.co.mz' + && in_array(env('APP_ENV', 'production'), ['local', 'testing'], true)), + 'source_directory' => env('DEMOGRAPHY_SOURCE_DIRECTORY', 'C:/Mac/Home/Documents/TEMPO/Portal Tempo/Servicos Tempo/portal do investidor/demografia/Provincias'), + // An explicit interpreter avoids Windows Store execution aliases in web workers. + 'python' => env('DEMOGRAPHY_PYTHON', 'python'), +]; diff --git a/database/data/demography-remaining-20261113.json b/database/data/demography-remaining-20261113.json new file mode 100644 index 00000000..52d93bad --- /dev/null +++ b/database/data/demography-remaining-20261113.json @@ -0,0 +1,120 @@ +{ + "files": { + "Cabo Delgado.xlsx": { + "sha256": "419ebf09f26055a2d46dac7027143835ee2e2dc8a91e3b1f498c5b459566ce16", + "records": 92808, + "province": "Cabo Delgado", + "issues": { + "missing_value": 6336 + } + }, + "Gaza.xlsx": { + "sha256": "b66ccde3478a74a854e8e2c4d51209401d844a15a701b16267e005fa44b70dc4", + "records": 82618, + "province": "Gaza", + "issues": { + "age_total_mismatch": 4, + "missing_value": 2, + "residence_total_mismatch": 4, + "sex_total_mismatch": 1 + } + }, + "Maputo Provincia.xlsx": { + "sha256": "1bf2921ef43d18817878a6d05e487ce5b107c14aa149ad17bedae6f1c652430e", + "records": 49504, + "province": "Maputo Província", + "issues": { + "cached_formula_value": 42972, + "missing_value": 68 + } + }, + "Maputo Cidade.xlsx": { + "sha256": "ba72c0b64200e5bdb4b1dda60a0a974bc7ce7c6d28d37a490735437261f1e513", + "records": 44064, + "province": "Maputo Cidade", + "issues": {} + }, + "Nampula.xlsx": { + "sha256": "cc960b06d7dfd0cb3f9a16edd94ff8db0451e8f3e24f3ad8442d03f7a053ac3b", + "records": 131400, + "province": "Nampula", + "issues": { + "missing_value": 792 + } + }, + "Niassa.xlsx": { + "sha256": "3116278d32de729058c7133ccc8204b42f14a0f8ba2b8d0aa8be46c9ff08d160", + "records": 93632, + "province": "Niassa", + "issues": { + "age_total_mismatch": 3, + "cached_formula_value": 12, + "district_total_mismatch": 2, + "missing_value": 4, + "residence_total_mismatch": 1 + } + }, + "Sofala.xlsx": { + "sha256": "4eaf5ef5e332ed50d5739330e14d78e2ead2551f407de7e31e0d1a96a76c956e", + "records": 77108, + "province": "Sofala", + "issues": { + "age_total_mismatch": 6, + "missing_value": 4, + "residence_total_mismatch": 6 + } + }, + "Tete.xlsx": { + "sha256": "4bbd7856107c4a3716b533caf7968a691deab4662e42689a7c529b58b80e2d58", + "records": 67932, + "province": "Tete", + "issues": { + "missing_value": 20196 + } + } + }, + "new_districts": { + "Gaza": [ + "Chongoene", + "Limpopo", + "Mapai" + ], + "Nampula": [ + "Larde", + "Liupo" + ], + "Niassa": [ + "Chimbonila" + ], + "Tete": [ + "Doa", + "Marara" + ] + }, + "aliases": { + "Cabo Delgado|Metuge|district": "PEMBA - METUGE", + "Gaza|Mandlakaze|district": "MANDLACAZE", + "Nampula|Erati|district": "NAMAPA-ERATI", + "Nampula|Ilha de Mocambique|district": "CIDADE ILHA DE MOCAMBIQUE", + "Nampula|Nacala-a-Velha|district": "NACALA-VELHA", + "Nampula|Rapale|district": "NAMPULA", + "Maputo Cidade|KaMphumu|district": "DISTRITO URBANO 1", + "Maputo Cidade|Nlhamankulu|district": "DISTRITO URBANO 2", + "Maputo Cidade|KaMaxakeni|district": "DISTRITO URBANO 3", + "Maputo Cidade|KaMavota|district": "DISTRITO URBANO 4", + "Maputo Cidade|KaMubukwana|district": "DISTRITO URBANO 5", + "Maputo Cidade|KaTembe|district": "DISTRITO DE CATEMBE", + "Maputo Cidade|KaNyaka|district": "DISTRITO DE INHACA", + "Nampula|Nampula|district": "CIDADE DE NAMPULA", + "Niassa|Lichinga|district": "CIDADE DE LICHINGA", + "Gaza|Xai-Xai|district": "CIDADE DE XAI-XAI" + }, + "authority": "Pedido de instalar restantes províncias e autorização expressa de oito distritos,13/11/2026. Correspondências históricas apresentadas na prévia autenticada,sem renomear nem fundir IDs.", + "sources": [ + "https://archive.gazettes.africa/archive/mz/2013/mz-government-gazette-series-i-dated-2013-12-18-no-101.pdf", + "https://international.ipums.org/international-action/variables/MZ2017A_0436", + "https://archive.gazettes.africa/archive/mz/2020/mz-government-gazette-series-i-dated-2020-05-04-no-83.pdf" + ], + "missing_province_source": "Zambézia", + "city_mapping_decision": "Proprietário confirmou expressamente em13/11/2026 a ligação destes três rótulos às respectivas cidades,preservando Rapale,Chimbonila,Limpopo separados." +} \ No newline at end of file diff --git a/database/data/demography-zambezia-20261113.json b/database/data/demography-zambezia-20261113.json new file mode 100644 index 00000000..9680f3de --- /dev/null +++ b/database/data/demography-zambezia-20261113.json @@ -0,0 +1,23 @@ +{ + "files": { + "Zambezia.xlsx": { + "sha256": "8d502e25e1e1fec0cc381ba0aa47b35cfa1eea586de53cb69ffa201d3b5ffeb7", + "records": 126684, + "province": "Zambezia", + "issues": {} + } + }, + "new_districts": { + "Zambezia": [ + "Derre", + "Luabo", + "Mocubela", + "Molumbo", + "Mulevala" + ] + }, + "aliases": {}, + "sources": [], + "authority": "Proprietário autorizou expressamente Derre,Luabo,Mocubela,Molumbo e Mulevala e a incorporação de Zambezia.xlsx em13/11/2026,sem códigos oficiais ou geometria inferidos.", + "missing_province_source": null +} \ No newline at end of file diff --git a/database/migrations/2026_11_13_100000_create_demographic_series.php b/database/migrations/2026_11_13_100000_create_demographic_series.php new file mode 100644 index 00000000..ec065834 --- /dev/null +++ b/database/migrations/2026_11_13_100000_create_demographic_series.php @@ -0,0 +1,70 @@ +schemaAllowed()) { + throw new RuntimeException('Demografia: instalação exige QA isolado ou a acção autenticada autorizada.'); + } + Schema::create('demographic_imports', function (Blueprint $t) { + $t->uuid('id')->primary(); + $t->char('sha256', 64)->unique(); + $t->string('file_name'); + $t->string('source'); + $t->string('publication_version'); + $t->string('status')->default('prepared'); + $t->jsonb('report'); + $t->char('preview_sha256', 64); + $t->foreignId('prepared_by')->constrained('users')->restrictOnDelete(); + $t->timestampsTz(); + }); + Schema::create('demographic_observations', function (Blueprint $t) { + $t->bigIncrements('id'); + $t->foreignUuid('import_id')->constrained('demographic_imports')->restrictOnDelete(); + $t->foreignUuid('geo_location_id')->constrained('geo_locations')->restrictOnDelete(); + $t->unsignedSmallInteger('year'); + $t->string('indicator', 80); + $t->string('sex', 10); + $t->string('residence', 10); + $t->string('age_group', 30); + $t->string('unit', 80); + $t->string('data_kind', 20); + $t->string('original_value', 100); + $t->text('numeric_value'); // Exact decimal text, including Excel storage precision. + $t->string('sheet'); + $t->string('cell', 20); + $t->string('validation_status', 20); + $t->unique(['import_id', 'geo_location_id', 'year', 'indicator', 'sex', 'residence', 'age_group'], 'demography_dimension_unique'); + $t->index(['geo_location_id', 'year', 'indicator']); + }); + Schema::create('demographic_events', function (Blueprint $t) { + $t->bigIncrements('id'); + $t->foreignUuid('import_id')->constrained('demographic_imports')->restrictOnDelete(); + $t->foreignId('actor_id')->constrained('users')->restrictOnDelete(); + $t->string('action', 30); + $t->text('reason'); + $t->jsonb('details'); + $t->timestampTz('created_at')->useCurrent(); + }); + DB::statement("ALTER TABLE demographic_imports ADD CONSTRAINT demographic_import_state CHECK (status IN ('prepared','imported','approved','disabled'))"); + DB::statement("ALTER TABLE demographic_observations ADD CONSTRAINT demographic_observation_state CHECK (validation_status IN ('valid','warning'))"); + } + + public function down(): void + { + if (! IsolatedQaDatabase::allowsSchemaChanges() || DB::table('demographic_imports')->exists()) { + throw new RuntimeException('Preserve originais e histórico demográfico antes de reverter.'); + } + Schema::dropIfExists('demographic_events'); + Schema::dropIfExists('demographic_observations'); + Schema::dropIfExists('demographic_imports'); + } +}; diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 8a9706c3..67df7807 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -1,3 +1,65 @@ +## 13/11/2026 — Zambézia instalada; doze lotes demográficos verificados + +A operação autenticada daZambézia terminou às **11:33:38Africa/Johannesburg (09:33:38UTC)**. Verificação posterior exclusivamente de leitura confirmou `Zambezia.xlsx`,SHA256 `8d502e25e1e1fec0cc381ba0aa47b35cfa1eea586de53cb69ffa201d3b5ffeb7`,lote `9c8f1c48-a29d-4ca7-9ae5-23bd8ca2d05b`,estado `approved` e126684observações de2017–2050. Recibo autenticado confirmado;nenhuma repetição da importação pelo agente. + +**Disponível no portal operacional local `investemoz:5432`:12lotes aprovados,total920456observações.** Todos os ficheiros provinciais fornecidos foram incorporados,além do exemplar nacional. A consulta provincial daZambézia devolve dados e os cinco distritos autorizados(Dérre,Luabo,Mocubela,Molumbo,Mulevala) estão consultáveis. Onze lotes anteriores preservados por contagens/SHA de metadados,observações e eventos,assim como as oito tabelas de negócio protegidas. Não há pendência de importação desta província. + +Provas `outputs/demography-20261113/zambezia/installation-status.json`,`verification.json` e `outputs/demography-20261113/operational-status.json`. As advertências/unidades ausentes dos exemplares anteriores continuam preservadas;nenhuma correcção de estatísticas,recálculo de fórmulas ou preenchimento de lacunas. O novo original não apresentou advertências detectadas. Permanecem separados a conferência visual administrativa,indicadores sem valores no acervo e a instalação em ambientes diferentes deste portal local. Não se declara o portal inteiro concluído. + +Este registo substitui as pendências históricas de ficheiro em falta ou operação autenticada daZambézia descritas abaixo,sem apagar o histórico. + +## 13/11/2026 — oito províncias concluídas; Zambézia fornecida e preparada separadamente + +A extensão anterior foi executada comMFA às11:18:05Africa/Johannesburg (09:18:05UTC) e verificada em leitura:11lotes aprovados/793772observações,recibo autenticado único,oito séries provinciais2017–2050 disponíveis,oito distritos novos consultáveis e preservação integral das oito tabelas de negócio e dos três lotes originais(importações/observações/eventos). Não foi repetida a importação. Recibo `outputs/demography-20261113/remaining-provinces/installation-status.json`;essa extensão deixa de ser pendência. + +O proprietário forneceu depois `Zambezia.xlsx`,SHA256 `8d502e25e1e1fec0cc381ba0aa47b35cfa1eea586de53cb69ffa201d3b5ffeb7`:126684observações de2017–2050,sem advertências detectadas. Autorizou expressamente Dérre,Luabo,Mocubela,Molumbo,Mulevala;referências sem códigos oficiais ou geometrias inferidos. Restantes correspondências únicas no cadastro existente,sem nova fusão ou renomeação. + +Coorte separada `zambezia` no mesmo instalador:uma entrada,sem reimportar os onze lotes ou invalidar a recuperação dos recibos das coortes anteriores. O estado protegido abrange agora as793772observações anteriores,metadados e eventos,conferidos em páginas500. O backup/restauro mantém comparação exacta dos bytes com cursores de250linhas e ordenaçãoC,sem materializar tabelas inteiras emPHP. Novo backup/restauro299tabelas/1268ficheiros. Dois testes focados/32asserções com limite256MiB confirmaram acréscimo126684,total920456/12lotes,repetição sem duplicação,preservação dos onze lotes,MFA e os cinco distritos consultáveis;tipos,análisePHP e build aprovados. Provas anteriores de importação e integridade NDJSON reutilizadas,não reexecutadas globalmente. + +**Estado:** código/interface e readiness disponibilizados. Falta a operação autenticada do proprietário no botão **Disponibilizar Zambézia**,em `/management/demography/install`,e conferir o recibo. Os onze lotes anteriores permanecem disponíveis. A indicação histórica de ficheiro daZambézia em falta está ultrapassada pela recepção deste original;não confundir preparação com importação concluída. Recibos `outputs/demography-20261113/zambezia/verification.json`, `release-readiness.json` e posterior `installation-status.json`. Conferência visual administrativa e ressalvas das séries anteriores permanecem separadas. + +## 13/11/2026 — restantes províncias preparadas; correcção de memória verificada + +Pedido expresso de instalar os oito ficheiros disponíveis:Cabo Delgado92808,Gaza82618,Maputo Província49504,Maputo Cidade44064,Nampula131400,Niassa93632,Sofala77108,Tete67932. Acréscimo previsto639066observações,total793772com os três lotes iniciais. Zambézia não tem ficheiro provincial no acervo fornecido;os dados nacionais2017 não são declarados cobertura anual dessa província. O proprietário autorizou explicitamente Chongoene/Limpopo/Mapai(Gaza),Larde/Liupo(Nampula),Chimbonila(Niassa),Doa/Marara(Tete),sem códigos oficiais ou geometria inferidos. Confirmou que os rótulos Nampula/Lichinga/Xai-Xai se ligam às cidades,preservando Rapale/Chimbonila/Limpopo separados. Correspondências históricas são apresentadas antes da confirmação autenticada;cadastro existente não é renomeado ou fundido. + +Leitor adaptado aos títulos “Cidade da”/“Distrito Municipal”,conservando cabeçalhos e valores originais. Células com fórmulas usam somente a cache numérica do original,com advertência e fórmula conservada;nenhuma fórmula é executada/recalculada e cache ausente continua bloqueante. Valores em falta e divergências não são substituídos. Três lotes aprovados permanecem intactos e protegidos pela extensão,que não reexecuta a migração nem cria permissões. + +A tentativa operacional às11:07foi revertida por esgotar256MiB na conferência de preservação. Corrigidas leitura/hash em páginas500 e importação porNDJSON vinculado à prévia porSHA256,com confirmação transaccional de contagens e compatibilidade com préviasJSON antigas. Relatórios completos permanecem guardados;consulta pública carrega contagens de advertências uma vez por lote. A interface passa a distinguir resposta sem reciboJSON e orienta conferência antes de repetir. + +**Verificação:** oito testes do leitor;seis testes de instalação/50asserções incluindo639066novas observações,11lotes/793772total,preservação e replay com o mesmo limite256MiB do servidor;12testes de integração/42asserções,incluindo adulteração e contagemNDJSON;tipos,análisePHP focada,lint e build aprovados. Novo backup/restauro299tabelas/1157ficheiros. Código/interface e readiness actualizados;nenhum dado adicional aplicado pelo agente. Resta a operação autenticada no botão **Disponibilizar restantes províncias** em `/management/demography/install` e a conferência do recibo. Os três lotes originais continuam disponíveis. Provas `outputs/demography-20261113/remaining-provinces/verification.json`,`release-readiness.json` e`installation-status.json`. + +## 13/11/2026 — instalação demográfica concluída e verificada no portal operacional local + +A operação autenticada foi concluída em **13/11/2026 às10:39:19 Africa/Johannesburg (08:39:19UTC)** no destino confirmado `investemoz:5432`. Verificação posterior exclusivamente de leitura confirmou os três identificadores apresentados pelo operador,estado `approved`,hashes exactos dos originais e **154706observações**:Manica71604,Inhambane82620,nacional482. Recibo autenticado único,sem repetição da instalação/importação. A prova anterior desactualizada após a correcção do interpretador foi reconciliada com a versão actual;cinco testes focados das guardas/12asserções passaram emQA,sem alterar MFA ou dispensar conferências. + +**Utilizável:** `https://portal-investidor.test/localizacoes/demografia`. GONDOLA eGURO,sectorIndústria,2017–2050 devolveram estado disponível,uma série e1836valores por distrito;Macate eVanduzi constam dos territórios consultáveis. As oito tabelas protegidas constantes do recibo mantêm contagens eSHA idênticos:projectos,dossiers/oportunidades,necessidades de competências,clusters,preparação e simulações. As seis advertências deManica,24valores ausentes e sete cabeçalhos sem unidade continuam preservados;nenhuma correcção estatística presumida. + +**Estado actual:** instalação/importação e conferência técnica deste recorte concluídas. Restam conferência visual administrativa e ressalvas estatísticas já identificadas;outras províncias/indicadores e instalação noutros ambientes não estão concluídos por esta operação. A API sem selecção territorial devolve indisponível por ausência de contexto;a consulta comGONDOLA/GURO foi confirmada disponível. Não confundir esse estado inicial com falha da instalação. + +Recibos `outputs/demography-20261113/installation-verified.json` e `operational-status.json`;este registo substitui as pendências históricas de execução abaixo,sem apagar as provas anteriores. + +## 13/11/2026 — homologação demográfica e instalação operacional preparadas + +Proprietário confirmou `investemoz:5432` no portal operacional local, incluindo três ficheiros e Macate/Vanduzi. Backup/restauro conferidos: 296 tabelas/872 ficheiros; cinco testes de instalação na cópia restaurada (21 asserções) e 11 regressões de integração (36 asserções) aprovados. Palavra-passe, TOTP e prévia administrativa QA passaram após corrigir apenas o formato do envelope da conta sintética. Controlos e credenciais operacionais preservados. + +Frontend/instalador publicados, `.env` intacto. **Dados activos ainda não instalados**: abrir `https://portal-investidor.test/management/demography/install`, autenticar-se como gestor de instalação habitual com MFA de sessão, conferir destino/ficheiros/advertências e executar **Instalar e disponibilizar**. É o controlo autenticado existente, não uma nova autorização organizacional. A ferramenta de navegador está indisponível; não foi contornada a autenticação. Clientes CLI apresentaram impedimentos na conferência TLS da cadeia local, sem alterações de certificados ou redução da validação. + +A acção instala apenas a migração demográfica, acrescenta quando ausentes os dois distritos autorizados e importa/aprova os três exemplares exactos com histórico, hashes, scans e contagens homologadas. Confere preservação de dossiers, simulações, instituições financeiras, oportunidades, competências e projectos/clusters. Repetição conserva contagens. Após executar: verificar três lotes/154 706 observações e comparação territorial no portal; manter as seis advertências de Manica/2031 e as unidades/edições ausentes identificadas. + +Recibos `outputs/demography-20261113/release-readiness.json`, `installation-tests.log`, `qa-http-homologation.json`, `operational-status.json`. Relatório e reversão na adenda de `docs/investmoz/v2/demografia-ine-homologacao-2026-11-13.md`. Não declarar disponibilização dos dados concluída antes de existir o recibo autenticado. + +## 13/11/2026 — demografia INE em desenvolvimento/QA + +Entrega implementada na base nova `investmoz_demography_test:55441`, sem migração, importação, permissões ou publicação no activo. Inventário consultado: cadastro/caminhos territoriais, mapa, comparação, simulador, percurso e fontes SWOT existentes; provas e aceitações anteriores conservadas. O delta acrescenta consulta demográfica aos consumidores existentes, sem substituir cálculos, contexto, projectos ou fontes. Não foi feita uma nova aceitação global do portal nem declarada reposição de funcionalidade desaparecida. + +**Utilização:** em `http://127.0.0.1:18813/localizacoes/demografia`, escolher até quatro províncias/distritos, sector e anos. GONDOLA/GURO permitem comparar a evolução 2017–2050, consultar originais por folha/célula e distinguir edições. Na oportunidade, comparação, simulador e localização documentada de projecto/cluster, abrir “Demografia na análise de viabilidade”; o acesso leva também à selecção temporal. Na preparação/SWOT do dossier, a fonte “Contexto demográfico INE” conserva a revisão e as conclusões manuais existentes. Não equiparar população a procura ou mão-de-obra efectiva. + +**Administração QA:** `/management/demography`, usando a permissão de gestão e MFA existentes. Preparar → conferir correspondências/advertências → confirmar → aprovar utilização em QA. Desactivar retira a série das análises e conserva observações/eventos. Edições e hashes coexistem. Manica: 71 604 observações; Inhambane: 82 620; nacional: 482; total 154 706. Macate/Vanduzi existem apenas no cadastro QA por resposta expressa do proprietário. Seis advertências de Manica/2031, 24 valores urbanos/rurais ausentes e sete cabeçalhos vitais sem unidade permanecem visíveis; não foram preenchidos ou corrigidos por inferência. + +**Verificação e saldo:** leitor (6 testes), integração (11 testes), regressão frontend de mapa/preparação/simulador (38 testes), TypeScript, análise PHP focada e build QA aprovados. Consulta pública conferida em Chromium a 1440 e 390 px, com dois distritos, filtros conservados e sem overflow da página. Conferência visual administrativa pendente: duas tentativas de navegação após desafio TOTP da conta sintética não avançaram; paragem dessa frente, sem contornar MFA. Permissões/MFA/importação continuam cobertas pelos testes HTTP. PHPStan global tem 19 erros em três ficheiros de pesquisa intactos e a formatação global tem falhas preexistentes; não declarar CI integral aprovado. + +Relatório e procedimento de homologação: `docs/investmoz/v2/demografia-ine-homologacao-2026-11-13.md`. Recibos, hashes, reconciliação de 72 dimensões entre exemplares, screenshots e diagnóstico de navegação em `outputs/demography-20261113/`. Implementação QA disponível; homologação com ressalvas estatísticas e conferência visual administrativa pendentes. Incorporar outras províncias ou instalar no activo continua fora desta execução. + ## 11/11/2026 — Mineração e Energia instaladas em f2767818 Entrega autorizada de542ac2ff instalada na revisão `f27678187669d18ec063a01473dc8788c713448d`. A revisão inclui a correcção técnica dos hashes e dos geradores para usar os mesmos bytesJSON emWindows eGit/Linux,detectada antes de alterar a instalação;conteúdo,interface e âmbito preservados. Os sete casos nativos/166asserções voltaram a passar sobre os bytes canónicos. Pacote original preservado;pacote canónico com aplicação/reversão exactas. Recibo `outputs/sector-resource-20261111/installation.json`,conferido em2026-11-11T12:19:59.901666+00:00. diff --git a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv index 55f567f4..5e4702f7 100644 --- a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv +++ b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv @@ -11125,3 +11125,4 @@ AUD-SIM-L1-P130,Transmissão de bens digitais,"Refinamento Tempo24/10 do saldoL1 AUD-SIM-L1-P131,"Facto gerador/exigibilidade: entrega, serviço, importação, instalação e operações continuadas",Refinamento Tempo24/10 do saldoL1; origemAUD-SIM-INT02; CIVA2016 PDF8–9 e alterações aplicáveis,Simulador/IVA — cobertura por operacao,/simulador,"G11A/P131 instalado e8b5ae43:goods_available,goods_transport,goods_installation,service_completed,service_early_charge,import_clearance,import_auction,continuous_period,contract_effects. Eventos7(1)a/b/c,7(2),7(3),7(7):disponibilização,início transporte,instalação/montagem concluída,serviço realizado/cobrado ou debitado antecipadamente pelo montante respectivo,desembaraço/arrematação/venda na importação,termo do período sucessivo,efeitos translativos com excepções3(3)a/b. Facto gerador separado de exigibilidade8;factura comercial não desloca evento aduaneiro.",Disponível na homologação e8b5ae43;delta instalado conferido,19frontend/API1/65rollback/tipos/build/EdgeCUA;provas anteriores reutilizadas.,"Demonstrado em QA e entregue na homologação e8b5ae43,no âmbito do ramo","Sem pendência neste recorte de eventos7/exigibilidade8 parametrizada;2026contexto;facto gerador7 e exigibilidade8 por data/âmbito;uma parcela de recebimento e restante por linha,ou parcelas de âmbitos distintos,sem agregação de totais entre linhas. Prazo de emissão é parâmetro legal identificado,não calendário presumido;importação segue7c. P104parcial não aplica câmbio fiscal.Sem nova base/IVA,taxa,dedução,campo11,regularização ou totaisModeloA;P133regimes suspensivos/viagens mantém âmbito separado.","Eventos7(1)a/b/c,7(2),7(3),7(7):disponibilização,início transporte,instalação/montagem concluída,serviço realizado/cobrado ou debitado antecipadamente pelo montante respectivo,desembaraço/arrematação/venda na importação,termo do período sucessivo,efeitos translativos com excepções3(3)a/b. Facto gerador separado de exigibilidade8;factura comercial não desloca evento aduaneiro.",Condicoes/fonte/periodo desta operacao -> calculo ou nao aplicacao explicada -> gravacao -> recuperacao -> relatorio coerentes; desconhecido nao e zero. Preservar oportunidade e historico.,Saldo L1; sequencia do incremento indicada,,AUD-SIM-INT02,1,,,,,,,,,,"P131/P132 entregue conjuntamente e8b5ae43 sobre92eaa935;backup/restauro174tabelas/369ficheiros e delta conferidos. | Histórico: QAconcluído7e6e462e. | Histórico: PreparaçãoQA P104/P131/P132;118fechos inventariados antes dos testes,sem perdas confirmadas. | Histórico: 25/10/2026 impedimento: Falta motor de eventos7/8 para entrega,serviço,importação,instalação e operações continuadas. | Operacao discriminada do saldo anterior; e desenvolvimento nao demonstrado, nao regressao ou perda de fonte aceite.",Manter encerrado no âmbito entregue;reutilizar provas e conferir apenas deltas afectados.,currencyEvents nosnapshot/API/dossier;convertCents existente exportado semmudarlógica,Backup/restauro/destino autenticado;sem schema/permissões alterados ou ensaios sintéticos no activo.,"CIVA Lei13/2016:7(1)–(7),PDF8/p1426(266);8,PDF9/p1426(267);15(8),PDF14/p1426(272),páginas visualmente conferidas.Lei22/2022 eLei10/2025 não alteram7/8;15(8)mantido.RIVADecreto7/2008,21,PDF4:regra histórica5dias úteis e excepções;prazo actual não automatizado,exige disposição/calendário/âmbito identificados.","Desenvolvimento,QA e entrega conjunta concluídos no recorte;L1aberto",Sem esforço funcional pendente neste recorte;não estimativa de todoL1.,"Cotejo documental e revisao do codigo; candidato544068e8 preservado. Sem ensaio funcional deste ramo. | C:\laragon\www\portal-investidor\outputs\iva-l1-currency-events-20261025\preservation-before-tests.json | docs\investmoz\simulations\iva-l1-currency-events-qa-20261025.json | iva_l1_currency_events_P131_P132_partial_P104_homologation_20261025:manifesto/24marcadores/5hashes/simuladorHTTP200,preservação174tabelas/369ficheiros/29fichas/28relações/408geometrias;QA individual reutilizada",G11A,25/10/2026 — entrega conjuntaP131/P132 e8b5ae43,"{""article"": ""7(1–3);8"", ""source"": ""CIVA2016 PDF8–9 e alterações aplicáveis"", ""scope"": ""2026 somente quando condicoes e periodo aplicavel forem determinados"", ""next_increment"": ""L1-R1P: período fiscal efectivo, distinto de mês orçamental""}",,,,,,,,,Nao confundir prova dos dez tratamentos anteriores com cobertura deste ramo.,,,,Entregue na homologação e8b5ae43;L1aberto AUD-SIM-L1-P132,"Exigibilidade em uso próprio,comissão,consignação e adiantamentos",Refinamento Tempo24/10 do saldoL1; origemAUD-SIM-INT02; CIVA2016 PDF8–9 e alterações aplicáveis,Simulador/IVA — cobertura por operacao,/simulador,"G11B/P132 instalado e8b5ae43:own_goods,own_services,commission_delivery,consignment_deadline,advance_payment. Eventos7(4)/(5)/(6) e8c:afectações/transmissões assimiladas3(3)e/f,serviços4(2),disponibilização pelo comissário,termo180dias de mercadorias à consignação3(3)d e pagamentos anteriores à factura. Corrigida remissão a consignação,não embalagensP102.8a/b/c separam parcela recebida e restante,sem dupla contagem.",Disponível na homologação e8b5ae43;delta instalado conferido,19frontend/API1/65rollback/tipos/build/EdgeCUA;provas anteriores reutilizadas.,"Demonstrado em QA e entregue na homologação e8b5ae43,no âmbito do ramo","Sem pendência neste recorte de eventos7/exigibilidade8 parametrizada;2026contexto;facto gerador7 e exigibilidade8 por data/âmbito;uma parcela de recebimento e restante por linha,ou parcelas de âmbitos distintos,sem agregação de totais entre linhas. Prazo de emissão é parâmetro legal identificado,não calendário presumido;importação segue7c. P104parcial não aplica câmbio fiscal.Sem nova base/IVA,taxa,dedução,campo11,regularização ou totaisModeloA;P133regimes suspensivos/viagens mantém âmbito separado.","Eventos7(4)/(5)/(6) e8c:afectações/transmissões assimiladas3(3)e/f,serviços4(2),disponibilização pelo comissário,termo180dias de mercadorias à consignação3(3)d e pagamentos anteriores à factura. Corrigida remissão a consignação,não embalagensP102.8a/b/c separam parcela recebida e restante,sem dupla contagem.",Condicoes/fonte/periodo desta operacao -> calculo ou nao aplicacao explicada -> gravacao -> recuperacao -> relatorio coerentes; desconhecido nao e zero. Preservar oportunidade e historico.,Saldo L1; sequencia do incremento indicada,,AUD-SIM-INT02,1,,,,,,,,,,"P131/P132 entregue conjuntamente e8b5ae43 sobre92eaa935;backup/restauro174tabelas/369ficheiros e delta conferidos. | Histórico: QAconcluído7e6e462e. | Histórico: PreparaçãoQA P104/P131/P132;118fechos inventariados antes dos testes,sem perdas confirmadas. | Histórico: 25/10/2026 impedimento: Falta exigibilidade dos eventos específicos de uso próprio/comissão/embalagens/adiantamentos. | Operacao discriminada do saldo anterior; e desenvolvimento nao demonstrado, nao regressao ou perda de fonte aceite.",Manter encerrado no âmbito entregue;reutilizar provas e conferir apenas deltas afectados.,currencyEvents nosnapshot/API/dossier;convertCents existente exportado semmudarlógica,Backup/restauro/destino autenticado;sem schema/permissões alterados ou ensaios sintéticos no activo.,"CIVA Lei13/2016:7(1)–(7),PDF8/p1426(266);8,PDF9/p1426(267);15(8),PDF14/p1426(272),páginas visualmente conferidas.Lei22/2022 eLei10/2025 não alteram7/8;15(8)mantido.RIVADecreto7/2008,21,PDF4:regra histórica5dias úteis e excepções;prazo actual não automatizado,exige disposição/calendário/âmbito identificados.","Desenvolvimento,QA e entrega conjunta concluídos no recorte;L1aberto",Sem esforço funcional pendente neste recorte;não estimativa de todoL1.,"Cotejo documental e revisao do codigo; candidato544068e8 preservado. Sem ensaio funcional deste ramo. | C:\laragon\www\portal-investidor\outputs\iva-l1-currency-events-20261025\preservation-before-tests.json | docs\investmoz\simulations\iva-l1-currency-events-qa-20261025.json | iva_l1_currency_events_P131_P132_partial_P104_homologation_20261025:manifesto/24marcadores/5hashes/simuladorHTTP200,preservação174tabelas/369ficheiros/29fichas/28relações/408geometrias;QA individual reutilizada",G11B,25/10/2026 — entrega conjuntaP131/P132 e8b5ae43,"{""article"": ""7(4–7)"", ""source"": ""CIVA2016 PDF8–9 e alterações aplicáveis"", ""scope"": ""2026 somente quando condicoes e periodo aplicavel forem determinados"", ""next_increment"": ""L1-R1P: período fiscal efectivo, distinto de mês orçamental""}",,,,,,,,,Nao confundir prova dos dez tratamentos anteriores com cobertura deste ramo.,,,,Entregue na homologação e8b5ae43;L1aberto AUD-SIM-L1-P133,Saída de regimes suspensivos e operações de viagens,Refinamento Tempo24/10 do saldoL1; origemAUD-SIM-INT02; CIVA2016 PDF8–9 e alterações aplicáveis,Simulador/IVA — cobertura por operacao,/simulador,"P133 instalado a48e9749: Cessação efectiva de regime7(8), distinta de mudança de armazém/transferência; viagens7(9)/RIVA40 pelo primeiro entre integral e início/primeiro serviço, sem subtrair dia nem inferir ordem intradiária. Exigibilidade8 por factura/recebimento separada, incluindo sinal e saldo integral sem dupla soma. Sem montante de imposto, desembaraço, direito ou ICE apurados.",Disponível na homologação a48e9749; delta instalado conferido no âmbito demonstrado.,29testes frontend; API privada1teste/68asserções; tipos/build; Edge gravação/recuperação/relatório;10operações/5períodos/12eventos.,"Demonstrado em QA e entregue na homologação a48e9749, no âmbito do ramo","Sem pendência de entrega neste recorte de margem/eventos. Sem cálculo de IVA devido ou dedução. Continuidade do apuramento/liquidação em AUD-SIM-INT02; deduções/regularizações nos lotes próprios, incluindoL2/L3, não encerradas. Factura/modelo oficial/regularização não executados.","Fontes do regime fiscal e evento específico cotejadas; moedaMZN para base, âmbito completo por operador/período, dados/datas/referências concretos. P104 não bloqueia classificação/eventos independentes.",Condicoes/fonte/periodo desta operacao -> calculo ou nao aplicacao explicada -> gravacao -> recuperacao -> relatorio coerentes; desconhecido nao e zero. Preservar oportunidade e historico.,Saldo L1; sequencia do incremento indicada,,AUD-SIM-INT02,1,,,,,,,,,,"P129/P133 entregues conjuntamente a48e9749 sobre df43aeb1;123fechos preservados; backup/restauro e delta conferidos; limitação ligada a AUD-SIM-INT02. | Histórico: P133 QA concluído no âmbito demonstrado,123fechos preservados,sem repetição de provas aceites. | Histórico: Preparação QA viagens/eventos:123fechos inventariados antes dos testes; nenhuma perda confirmada. | Histórico: 25/10/2026 impedimento: Falta motor de saída de regimes suspensivos e evento das viagens,no regime específico. | Operacao discriminada do saldo anterior; e desenvolvimento nao demonstrado, nao regressao ou perda de fonte aceite.","Manter encerrado no âmbito de margem/eventos demonstrado, reutilizando provas. Conservar ligação ao trabalho fiscal restante em AUD-SIM-INT02: apuramento/liquidação, deduções e regularizações próprias não concluídos por esta entrega.","Snapshot/API/dossier, moeda, datas UTC, histórico e motor de exigibilidade8 existentes; viagem classificada associada à mesma oportunidade, sem copiar edições deliberadas.","Destino autenticado e backup/restauro; sem migração, alteração de permissões, importação/publicação documental ou ensaio sintético no activo.","RIVA Decreto7/2008,38–46,acervoBR16-I16/04/2008PDF6–8/p104–106 (6/7 conferidas visualmente,46(2) texto extraídoPDF8). CIVA Lei13/2016,4(5)/5(2),PDF7/p1426(265);7(8)/(9)/8,PDF9/p1426(267);14(1),PDF13/p1426(271),páginas visualmente conferidas. CIVA17(1),Lei22/2022PDF3,16% usado no divisor da base;Lei10/2025não altera4/7/8/17. Não confundir regime fiscal com licenciamento turístico.","Desenvolvimento, QA e entrega conjunta concluídos no âmbito de margem/eventos; IVA devido/dedução não calculados e trabalho restante rastreável.",Sem esforço de entrega pendente neste recorte; não representa fecho ou estimativa do restante trabalho fiscal.,Cotejo documental e revisao do codigo; candidato544068e8 preservado. Sem ensaio funcional deste ramo. | C:\laragon\www\portal-investidor\outputs\iva-l1-travel-events-20261025\preservation-before-tests.json | docs\investmoz\simulations\iva-l1-travel-events-qa-20261025.json | iva_l1_travel_events_P129_P133_homologation_20261025:24marcadores/6hashes/simuladorHTTP200;174tabelas/369ficheiros/29fichas/28relações/408geometrias;provasQA reutilizadas;fiscal_continuity:AUD-SIM-INT02,Viagens e eventos P129/P133,25/10/2026 — entrega conjunta a48e9749,"{""article"": ""7(8–9)"", ""source"": ""CIVA2016 PDF8–9 e alterações aplicáveis"", ""scope"": ""2026 somente quando condicoes e periodo aplicavel forem determinados"", ""next_increment"": ""L1-R1P: período fiscal efectivo, distinto de mês orçamental""}",,,,,,,,,Nao confundir prova dos dez tratamentos anteriores com cobertura deste ramo.,,,,Entregue na homologação a48e9749 no âmbito demonstrado;L1 aberto +INE-DEMO-01,"Integração nacional de dados demográficos INE na viabilidade existente, importador em duas etapas, séries/versionamento, comparação territorial e adenda nacional.",Pedido colado pelo proprietário nesta sessão; execução expressamente confirmada; Macate/Vanduzi autorizados apenas em QA em 13/11/2026.,Território; viabilidade; percurso; SWOT; simulador,/localizacoes/demografia; /api/v1/investment/demography; /management/demography,DemographicImport; DemographicEvidence; leitor XLSX; cadastro/mapa/comparação/simulador e fontes SWOT existentes reutilizados.,"investemoz:5432:12lotes/920456observações,incluindo Zambézia126684,de2017–2050;cinco distritos novos consultáveis;onze lotes anteriores preservados.",154706 observações reais INE; três originais com scan real/hash; repetição sem duplicação; 72 reconciliações entre exemplares; comparação GONDOLA/GURO.,Todos os ficheiros provinciais fornecidos instalados/verificados no portal operacional local;12lotes aprovados,Nenhuma importação provincial fornecida pendente. Conferência visual administrativa e limites estatísticos/documentais mantidos;sem extrapolação ou dados fabricados.,PostgreSQL/PostGIS QA; ClamAV; Python stdlib; autenticação e MFA existentes; nenhum novo aprovador.,"Três ficheiros associados aos territórios, valores exactos, séries 2017–2050, consulta sectorial/temporal, duas localizações, fontes/versões, inconsistências e acessos demonstrados em QA. Homologação manual restante registada no relatório.",Alta,,,,,"Consulta pública desktop/mobile conferida; visual administrativa pendente, testes HTTP aprovados.",11 testes de integração aprovados.,Três lotes QA; 154706 observações; idempotência e unicidade verificadas.,Consulta por território/ano/exemplar; desactivação/reaprovação preservam histórico.,"População/idade/residência, vitais, fontes e limitações; sem extrapolação, procura automática ou probabilidade de sucesso.",,,,,"Sem pendência de importação dos ficheiros provinciais fornecidos. Conferência visual administrativa,ressalvas/unidades ausentes e indicadores sem valores mantidos;outros ambientes não instalados por esta operação.","PortalProfileInstallation/MFA existentes; DemographicInstallation; DemographicImport; InvestmentGeography; simulador, mapa/comparação e fontes SWOT existentes.",,Proprietário executou a disponibilização autorizada de Zambezia.xlsx e cinco distritos;recibo autenticado e resultado confirmados sem repetição.,,,"outputs/demography-20261113/zambezia/installation-status.json e verification.json:recibo autenticado09:33:38UTC,hash/lote/count126684,total12lotes/920456,preservação11lotes e oito tabelas de negócio,série provincial e cinco distritos públicos. operational-status.json actualizado;ensaios e backup/restauro anteriores preservados.",demografia-ine,13/11/2026 — instalação autenticada concluída; conferência técnica de leitura sem repetição da operação,,,,,,,,,,,,,, diff --git a/docs/investmoz/v2/demografia-ine-homologacao-2026-11-13.md b/docs/investmoz/v2/demografia-ine-homologacao-2026-11-13.md new file mode 100644 index 00000000..3d91fa0a --- /dev/null +++ b/docs/investmoz/v2/demografia-ine-homologacao-2026-11-13.md @@ -0,0 +1,142 @@ +## 13/11/2026 — entrega remota autorizada, em execução + +Destino autorizado pelo proprietário: `https://teste-investidor.tempo.co.mz`, base `teste_investidor:5432`. A revisão anterior confirmada é `f2767818`; a demografia ainda não estava instalada nesse servidor. Backup de 190 tabelas e 369 ficheiros com restauro isolado integral aprovado. Doze originais privados transferidos e conferidos por SHA256, sem copiar a base local. O exemplar partilhado actual de Inhambane diverge do aprovado; foi usada a cópia privada aceite, de hash `51a9b91dfb6e32e5b49def115cb007f21faa97b3d0584b16ef911b22b89bd818`, preservando ambas as versões. + +Adaptação delimitada: activação explícita de consulta na homologação, identidade real da base conferida e pasta privada configurável para originais. Permanecem autenticação/MFA, backup/restauro, controlo de integridade, operações idempotentes e preservação dos dados. Testes focados: 13/45 asserções de consumidores, 5/12 dos controlos de instalação e 1/6 do destino remoto. A entrega Git não executa a importação nem a aprovação dos lotes: os dados continuam sujeitos à operação autenticada existente. Instalação remota e conferência de contagens ainda por confirmar neste ponto do histórico. + +## 13/11/2026 — Zambézia instalada; doze lotes demográficos verificados + +A operação autenticada daZambézia terminou às **11:33:38Africa/Johannesburg (09:33:38UTC)**. Verificação posterior exclusivamente de leitura confirmou `Zambezia.xlsx`,SHA256 `8d502e25e1e1fec0cc381ba0aa47b35cfa1eea586de53cb69ffa201d3b5ffeb7`,lote `9c8f1c48-a29d-4ca7-9ae5-23bd8ca2d05b`,estado `approved` e126684observações de2017–2050. Recibo autenticado confirmado;nenhuma repetição da importação pelo agente. + +**Disponível no portal operacional local `investemoz:5432`:12lotes aprovados,total920456observações.** Todos os ficheiros provinciais fornecidos foram incorporados,além do exemplar nacional. A consulta provincial daZambézia devolve dados e os cinco distritos autorizados(Dérre,Luabo,Mocubela,Molumbo,Mulevala) estão consultáveis. Onze lotes anteriores preservados por contagens/SHA de metadados,observações e eventos,assim como as oito tabelas de negócio protegidas. Não há pendência de importação desta província. + +Provas `outputs/demography-20261113/zambezia/installation-status.json`,`verification.json` e `outputs/demography-20261113/operational-status.json`. As advertências/unidades ausentes dos exemplares anteriores continuam preservadas;nenhuma correcção de estatísticas,recálculo de fórmulas ou preenchimento de lacunas. O novo original não apresentou advertências detectadas. Permanecem separados a conferência visual administrativa,indicadores sem valores no acervo e a instalação em ambientes diferentes deste portal local. Não se declara o portal inteiro concluído. + +Este registo substitui as pendências históricas de ficheiro em falta ou operação autenticada daZambézia descritas abaixo,sem apagar o histórico. + +## 13/11/2026 — oito províncias concluídas; Zambézia fornecida e preparada separadamente + +A extensão anterior foi executada comMFA às11:18:05Africa/Johannesburg (09:18:05UTC) e verificada em leitura:11lotes aprovados/793772observações,recibo autenticado único,oito séries provinciais2017–2050 disponíveis,oito distritos novos consultáveis e preservação integral das oito tabelas de negócio e dos três lotes originais(importações/observações/eventos). Não foi repetida a importação. Recibo `outputs/demography-20261113/remaining-provinces/installation-status.json`;essa extensão deixa de ser pendência. + +O proprietário forneceu depois `Zambezia.xlsx`,SHA256 `8d502e25e1e1fec0cc381ba0aa47b35cfa1eea586de53cb69ffa201d3b5ffeb7`:126684observações de2017–2050,sem advertências detectadas. Autorizou expressamente Dérre,Luabo,Mocubela,Molumbo,Mulevala;referências sem códigos oficiais ou geometrias inferidos. Restantes correspondências únicas no cadastro existente,sem nova fusão ou renomeação. + +Coorte separada `zambezia` no mesmo instalador:uma entrada,sem reimportar os onze lotes ou invalidar a recuperação dos recibos das coortes anteriores. O estado protegido abrange agora as793772observações anteriores,metadados e eventos,conferidos em páginas500. O backup/restauro mantém comparação exacta dos bytes com cursores de250linhas e ordenaçãoC,sem materializar tabelas inteiras emPHP. Novo backup/restauro299tabelas/1268ficheiros. Dois testes focados/32asserções com limite256MiB confirmaram acréscimo126684,total920456/12lotes,repetição sem duplicação,preservação dos onze lotes,MFA e os cinco distritos consultáveis;tipos,análisePHP e build aprovados. Provas anteriores de importação e integridade NDJSON reutilizadas,não reexecutadas globalmente. + +**Estado:** código/interface e readiness disponibilizados. Falta a operação autenticada do proprietário no botão **Disponibilizar Zambézia**,em `/management/demography/install`,e conferir o recibo. Os onze lotes anteriores permanecem disponíveis. A indicação histórica de ficheiro daZambézia em falta está ultrapassada pela recepção deste original;não confundir preparação com importação concluída. Recibos `outputs/demography-20261113/zambezia/verification.json`, `release-readiness.json` e posterior `installation-status.json`. Conferência visual administrativa e ressalvas das séries anteriores permanecem separadas. + +## 13/11/2026 — restantes províncias preparadas; correcção de memória verificada + +Pedido expresso de instalar os oito ficheiros disponíveis:Cabo Delgado92808,Gaza82618,Maputo Província49504,Maputo Cidade44064,Nampula131400,Niassa93632,Sofala77108,Tete67932. Acréscimo previsto639066observações,total793772com os três lotes iniciais. Zambézia não tem ficheiro provincial no acervo fornecido;os dados nacionais2017 não são declarados cobertura anual dessa província. O proprietário autorizou explicitamente Chongoene/Limpopo/Mapai(Gaza),Larde/Liupo(Nampula),Chimbonila(Niassa),Doa/Marara(Tete),sem códigos oficiais ou geometria inferidos. Confirmou que os rótulos Nampula/Lichinga/Xai-Xai se ligam às cidades,preservando Rapale/Chimbonila/Limpopo separados. Correspondências históricas são apresentadas antes da confirmação autenticada;cadastro existente não é renomeado ou fundido. + +Leitor adaptado aos títulos “Cidade da”/“Distrito Municipal”,conservando cabeçalhos e valores originais. Células com fórmulas usam somente a cache numérica do original,com advertência e fórmula conservada;nenhuma fórmula é executada/recalculada e cache ausente continua bloqueante. Valores em falta e divergências não são substituídos. Três lotes aprovados permanecem intactos e protegidos pela extensão,que não reexecuta a migração nem cria permissões. + +A tentativa operacional às11:07foi revertida por esgotar256MiB na conferência de preservação. Corrigidas leitura/hash em páginas500 e importação porNDJSON vinculado à prévia porSHA256,com confirmação transaccional de contagens e compatibilidade com préviasJSON antigas. Relatórios completos permanecem guardados;consulta pública carrega contagens de advertências uma vez por lote. A interface passa a distinguir resposta sem reciboJSON e orienta conferência antes de repetir. + +**Verificação:** oito testes do leitor;seis testes de instalação/50asserções incluindo639066novas observações,11lotes/793772total,preservação e replay com o mesmo limite256MiB do servidor;12testes de integração/42asserções,incluindo adulteração e contagemNDJSON;tipos,análisePHP focada,lint e build aprovados. Novo backup/restauro299tabelas/1157ficheiros. Código/interface e readiness actualizados;nenhum dado adicional aplicado pelo agente. Resta a operação autenticada no botão **Disponibilizar restantes províncias** em `/management/demography/install` e a conferência do recibo. Os três lotes originais continuam disponíveis. Provas `outputs/demography-20261113/remaining-provinces/verification.json`,`release-readiness.json` e`installation-status.json`. + +## 13/11/2026 — instalação demográfica concluída e verificada no portal operacional local + +A operação autenticada foi concluída em **13/11/2026 às10:39:19 Africa/Johannesburg (08:39:19UTC)** no destino confirmado `investemoz:5432`. Verificação posterior exclusivamente de leitura confirmou os três identificadores apresentados pelo operador,estado `approved`,hashes exactos dos originais e **154706observações**:Manica71604,Inhambane82620,nacional482. Recibo autenticado único,sem repetição da instalação/importação. A prova anterior desactualizada após a correcção do interpretador foi reconciliada com a versão actual;cinco testes focados das guardas/12asserções passaram emQA,sem alterar MFA ou dispensar conferências. + +**Utilizável:** `https://portal-investidor.test/localizacoes/demografia`. GONDOLA eGURO,sectorIndústria,2017–2050 devolveram estado disponível,uma série e1836valores por distrito;Macate eVanduzi constam dos territórios consultáveis. As oito tabelas protegidas constantes do recibo mantêm contagens eSHA idênticos:projectos,dossiers/oportunidades,necessidades de competências,clusters,preparação e simulações. As seis advertências deManica,24valores ausentes e sete cabeçalhos sem unidade continuam preservados;nenhuma correcção estatística presumida. + +**Estado actual:** instalação/importação e conferência técnica deste recorte concluídas. Restam conferência visual administrativa e ressalvas estatísticas já identificadas;outras províncias/indicadores e instalação noutros ambientes não estão concluídos por esta operação. A API sem selecção territorial devolve indisponível por ausência de contexto;a consulta comGONDOLA/GURO foi confirmada disponível. Não confundir esse estado inicial com falha da instalação. + +Recibos `outputs/demography-20261113/installation-verified.json` e `operational-status.json`;este registo substitui as pendências históricas de execução abaixo,sem apagar as provas anteriores. + +# Demografia INE — entrega em desenvolvimento e QA, 13/11/2026 + +## Adenda posterior — homologação e disponibilização autorizadas em 13/11/2026 + +O proprietário pediu «homologar e disponibilizar» e confirmou o destino **portal operacional local, `investemoz` em `127.0.0.1:5432`, incluindo a instalação das tabelas, importação dos três ficheiros e Macate/Vanduzi**. Esta decisão substitui, para este recorte concreto, o limite anterior de QA. Não autoriza alterações noutros produtos ou concessão de permissões. + +**Estado actual:** homologação funcional em QA aprovada; frontend e instalador publicados no portal operacional. As tabelas e os dados no activo aguardam a execução autenticada em `https://portal-investidor.test/management/demography/install`, com a identidade de instalação e MFA de sessão existentes. Não foi criada ou simulada uma sessão de utilizador operacional. Última conferência: zero observações demográficas no activo e nenhuma execução autenticada registada. A página pública responde, mas ainda comunica indisponibilidade de séries neste destino. + +Preparação realizada: + +- Backup consistente do activo e restauro numa base nova `demography_restore_20261113_075052_test:55441`: **296 tabelas e 872 ficheiros conferidos**, preservados em armazenamento privado. A primeira comparação diferiu apenas na ordenação das mesmas 14 sessões entre collations dos servidores; a comparação pelo multiconjunto exacto de bytes passou. Nenhuma linha foi omitida ou normalizada para obter igualdade. +- Cinco testes adicionais de instalação, 21 asserções, aprovados na cópia restaurada. Exercitaram migração exacta, importação real de 154 706 observações, novos distritos, repetição sem duplicação, fontes e preservação do estado protegido. As identidades de ensaio e todas as mutações do ensaio ficaram numa transacção QA revertida; não foram usadas identidades operacionais para simular autorização. +- Os 11 testes de regressão da integração voltaram a passar, agora com 36 asserções. Mantêm-se as seis verificações do leitor e os 38 testes frontend já aceites para o recorte inalterado. TypeScript, análise PHP focada e build de disponibilização aprovados. As falhas globais preexistentes continuam separadas. +- A pendência TOTP foi delimitada ao envelope criado para a **conta sintética QA**: `encryptString` era incompatível com o `decrypt` do Fortify. Corrigida apenas essa conta, com `encrypt` serializado; palavra-passe, TOTP real e acesso à prévia administrativa passaram por HTTP autenticado. Nenhuma credencial, autenticação ou permissão operacional foi alterada. Conferência visual administrativa continua dependente da sessão do operador, pois o acesso automatizado ao navegador está indisponível. +- Assets produzidos primeiro em `outputs/demography-20261113/release-build`, conferidos e copiados para `public/build`, mantendo os chunks anteriores para compatibilidade de páginas abertas. Configuração `.env` preservada. Recibo `release-readiness.json`; dump, ficheiros e readiness autenticada mantidos privados. A prova vincula código, manifest, hashes dos assets, destino, backup/restauro e ensaio. +- O instalador reutiliza `PortalProfileInstallation::authorize`, incluindo o MFA efectivamente concluído na sessão. A migração operacional só é permitida dentro dessa acção; não há comando CLI de migração operacional sem actor. A importação utiliza a prévia homologada, confere os hashes exactos e contagens, faz scan dos originais e regista actor, motivo e recibo. Reenvios são serializados e idempotentes. Não é executada qualquer migração pendente fora deste recorte. +- A autorização específica de Macate/Vanduzi é reflectida como origem `ine-demography`, com hash do exemplar e auditoria. Os dois identificadores territoriais ficam disponíveis nos selectores existentes, sem inventar código oficial, limites, geometria, vigência jurídica, licenças ou direitos. A disponibilidade territorial mantém-se independente da desactivação de uma série estatística. +- Smoke test do kernel operacional: instalador anónimo redirecciona para autenticação; página pública e API respondem 200. Esta prova é de aplicação, não de navegador/TLS. O cliente HTTPS Windows não conseguiu conferir revogação e o cliente Python recusou a cadeia por ausência de Authority Key Identifier; não foram desactivadas verificações TLS nem alterados certificados. A navegação real deve ser conferida no navegador habitual, sem ultrapassar avisos de segurança. + +**Reversão preparada:** o backup privado contém a configuração, código, documentos e build anteriores. Se for necessário suspender a demografia depois da instalação, desactivar as séries pelo fluxo autenticado, conservando observações e eventos; não usar rollback destrutivo ou eliminar os novos distritos ligados a investimentos. Para reverter a apresentação, repor os manifests/assets do arquivo conferido. Recuperação integral da base exige intervenção delimitada com o dump privado, nunca reposição indiscriminada sobre actividade posterior. + +**Acção final do operador:** abrir o instalador, autenticar-se com a conta habitual e MFA, conferir o destino/ficheiros/advertências, confirmar e executar «Instalar e disponibilizar». Depois conferir o recibo autenticado, três lotes aprovados, 154 706 observações, consulta de duas localizações e contagens/checksums protegidos. A decisão de autorização já está registada; esta etapa cumpre o controlo de execução autenticada existente. + +Ficheiros adicionais desta adenda: `app/Services/DemographicInstallation.php`, extensão da guarda de `DemographicImport` e da migração, referências em `InvestmentGeography`, métodos/rotas do controlador, `resources/js/pages/management/demography-install.tsx`, rótulos administrativos, `tests/Feature/DemographicInstallationTest.php`, ferramentas de backup/preparação/estado da entrega. Não foi necessário alterar as regras de autenticação. + +O restante texto abaixo conserva a entrega QA original e as suas evidências históricas; a adenda acima prevalece quanto à autorização e ao estado actual. + +Implementação local, sem instalação ou importação no activo. Base nova `investmoz_demography_test`, PostgreSQL/PostGIS em `127.0.0.1:55441`; servidor QA `http://127.0.0.1:18813`. `.env` operacional não foi alterado. A configuração operacional aponta para `investemoz:5432`; foi usada exclusivamente uma transacção de leitura para inventariar referências territoriais públicas, encerrada com rollback. Não foram copiados investidores, dossiers, credenciais ou outros dados privados. + +## Resultado e componentes reutilizados + +- Modelo nacional com observações por território/ano/indicador/sexo/idade/residência, unidade, tipo estatístico, valor original exacto, exemplar/hash, folha/célula, importação, validação e histórico. Edições coexistem; não há eliminação ou substituição automática. +- Leitor XLSX por relações, títulos e cabeçalhos; valores decimais conservados como texto numérico exacto. Não executa fórmulas/macros. Duas etapas: preparação privada com scan ClamAV e prévia; confirmação transaccional. Aprovação para utilização e desactivação são acções separadas e auditadas. Hash único do original e chave única das dimensões impedem duplicação. +- Cadastro territorial, identidades e regras de acesso existentes reutilizados. Normalização de acentos/espaços e prefixos administrativos sem correspondência aproximada; ambiguidades ficam pendentes. Correspondências manuais verificam nível, província e fusões indevidas. Macate e Vanduzi acrescentados **somente em QA**, com referência ao hash de Manica, por resposta expressa do proprietário nesta sessão. Nenhuma alteração no cadastro operacional. +- Consulta pública `/localizacoes/demografia`, API `/api/v1/investment/demography`: até quatro territórios, sector, ano inicial/final, horizonte até 50 anos, edições separadas e anos em falta. Diferenças numéricas só para mesmo nível, ano, unidade, tipo e identificação de edição; explicação e fontes visíveis. Sem extrapolação ou percentagem de sucesso. +- Consulta demográfica incorporada no simulador existente, nas oportunidades, na comparação de oportunidades e nas localizações documentadas de projectos/clusters. A comparação existente conserva os seus factores económicos/sectoriais; a demografia acrescenta evidência, sem alterar regras fiscais. Localização principal, implantação e área de influência não são fundidas. +- `InvestmentPreparationWorkspace` acrescenta a evidência demográfica às fontes da SWOT do contexto escolhido; conclusões e revisão continuam no fluxo existente. O contexto deliberado e os dados fiscais não são sobrescritos. +- Administração em `/management/demography`: envio, prévia, correspondências, advertências, confirmação, aprovação QA, desactivação e eventos. Mantidos `manage-portal`, exclusão do auditor, MFA e guarda da identidade real da base QA. Não são concedidos novos papéis ou direitos. + +Migração: `database/migrations/2026_11_13_100000_create_demographic_series.php`, com três tabelas: `demographic_imports`, `demographic_observations`, `demographic_events`. A migração só admite QA isolado e recusa rollback que apague histórico existente. O código de consulta está limitado a local/testing; esta entrega não autoriza activação em produção. + +## Importações efectivas + +| Original | Observações gravadas | Territórios | Anos | Rejeições numéricas | +| --- | ---: | --- | --- | ---: | +| Manica.xlsx | 71 604 | 1 província + 12 distritos | 2017–2050 | 0 | +| Inhambane.xlsx | 82 620 | 1 província + 14 distritos | 2017–2050 | 0 | +| Dados demograficos.xlsx | 482 | 11 províncias | 2017 | 0 | +| Total | 154 706 | 11 províncias + 26 distritos distintos | — | 0 | + +Originais preservados, copiados apenas para armazenamento privado QA; scans reais ClamAV 1.5.4 com resultado `clean`. Hashes, correspondências individuais, folhas, anos, recibos e tempos em `outputs/demography-20261113/verification.json`. Preparar/importar/verificar repetição/aprovar demorou aproximadamente 14,1 s para Manica, 15,3 s para Inhambane e 1,5 s para o ficheiro nacional nesta máquina; não é um benchmark de capacidade nacional. Repetir a confirmação manteve as contagens. + +Inventário integral da pasta demografia: 22 ficheiros, incluindo originais adicionais, PDFs, documentos e ficheiros temporários, com tamanho e SHA256 em `source-inventory.json`. Os restantes exemplares foram inventariados, sem importação ou activação automática. Não se pressupõe a mesma estrutura para todas as províncias. + +## Resultados estatísticos e limitações concretas + +Inhambane passou a reconciliação de sexo, residência, grupos etários e soma dos distritos. Em Manica há seis advertências em **2031**, preservadas: + +| Quadro/célula | Verificação | Diferença (total menos parcelas) | +| --- | --- | ---: | +| Mossurize, E204 | Sexo | 200824.43870750687 | +| Mossurize, C204 | Residência, homens | 99260.016965195867 | +| Mossurize, D204 | Residência, mulheres | 101564.421742311014 | +| Mossurize, F204 | Soma etária, homens urbanos | -99260.01696519587193 | +| Mossurize, G204 | Soma etária, mulheres urbanas | -101564.42174231099699 | +| Manica, B4 | Total provincial versus distritos | -69384.494114521566 | + +Não foram corrigidos valores por inferência. Tolerância de reconciliação: `0.000001` pessoa, exclusivamente para resíduos de representação numérica do Excel; não arredonda valores gravados. As advertências acompanham a série, inclusive quando aprovada em QA, e devem ser consideradas ao usar o ano afectado. + +O ficheiro nacional contém população por sexo/residência, três grandes grupos etários e seis famílias de indicadores vitais: esperança de vida, mortalidade infantil, mortalidade bruta, natalidade, fecundidade e crescimento. Esperança de vida e mortalidade infantil estão discriminadas por sexo. Há **sete cabeçalhos de unidade ausente**, abrangendo cinco famílias: três colunas de mortalidade infantil e quatro outros indicadores. Esses valores mantêm unidade `unspecified`; a esperança de vida usa anos. Não são assumidas percentagens ou valores por mil. + +Há 24 valores ausentes de população urbana/rural de Maputo Cidade, mantidos ausentes. A folha de população não imprime ano: 2017 foi fornecido expressamente nos metadados de importação, em coerência com a adenda; as folhas etária e vital imprimem 2017. A edição de publicação não consta dos exemplares: o rótulo declara essa ausência e o SHA256 identifica cada versão. As séries anuais dizem “projectada”; o ficheiro nacional não declara observado/projectado, pelo que fica `unspecified`. + +Reconciliação independente de população total e grandes grupos etários de Manica/Inhambane em 2017: **72 comparações coincidentes dentro da precisão**, zero divergências/incompletudes nestas comparações. As somas das faixas etárias são evidência calculada de reconciliação, não novos valores oficiais importados. A igualdade numérica não funde exemplares nem prova igualdade de metodologia/edição. + +`Outros indicadores` contém somente 11 títulos, sem valores. Escolaridade, pobreza, água, saneamento e electricidade podem usar o modelo por indicador/unidade/dimensões, mas nenhum valor foi inventado. População em idade activa não é mão-de-obra disponível/qualificada; população residente não é procura efectiva ou poder de compra. Densidade não é calculada sem área territorial aplicável. + +## Verificação + +- Leitor: seis testes automatizados de cabeçalhos deslocados, decimais exactos, duplicados, incompletude, totais e idade — aprovados. +- Integração: 11 testes — aprovados. Cobrem consulta pública, versões, anos ausentes, comparação exacta, confidencialidade territorial/ancestral, estados aprovados/desactivados, permissões, MFA, guarda QA, idempotência, fontes SWOT, hash, chave única e preservação do histórico no rollback. +- Regressão existente: 38 testes frontend de mapa, preparação/SWOT e formulário/cálculos do simulador — aprovados. Não foi executada a suite integral; não se declara aceitação integral do portal. +- TypeScript e análise PHP focada nos serviços/controlador alterados: aprovados. Compilação em `public/build-qa-opportunities`: aprovada; os assets operacionais não foram compilados/publicados. +- Verificações globais: `npm run check` encontrou problemas de formatação em 56 ficheiros, incluindo ficheiros intactos; os quatro componentes/páginas novos foram formatados e passaram lint focado. PHPStan global encontrou 19 erros em `GlobalSearchController`, `FederatedSearch` e `SearchTerms`, ficheiros não alterados por esta tarefa. Estes problemas preexistentes não foram ocultados ou corrigidos fora do âmbito. +- Consulta pública conferida visualmente em Chromium a 1440 e 390 px, com filtros mantidos, duas tabelas, comparação e sem transbordo da página. Conferência visual administrativa pendente: a conta sintética chegou ao desafio TOTP, mas duas tentativas não avançaram após o código. O diagnóstico conservou URL e apresentação; essa frente foi interrompida sem contornar MFA. Alternativa concreta: conferência manual com login/MFA QA, mantendo os testes HTTP já aprovados. +- Provas: `verification.json`, `source-reconciliation.json`, `frontend-regression.log`, `build.log`, `browser-public-verification.json`, `browser-admin-verification.json` e screenshots em `outputs/demography-20261113/`. Conferência visual e saldo final registados no manual existente. + +## Homologação e próximas províncias + +1. Usar exclusivamente o servidor/base QA identificados acima. As credenciais da conta sintética de ensaio permanecem privadas; não são contas operacionais. +2. Em Administração → Demografia INE, consultar os três lotes, as correspondências e as advertências. Repetir a confirmação de um lote deve conservar as contagens. Desactivar/aprovar em QA deve retirar/repor a série da consulta, mantendo os eventos e observações. +3. Em Localizações → demografia, seleccionar GONDOLA e GURO, sector Indústria, 2017–2050. Conferir anos, faixas etárias, exemplares e diferenças; seleccionar um ano fora da cobertura deve mostrar ausência de dados. Repetir para províncias em 2017 para consultar exemplares nacionais e provinciais separados. +4. Num dossier QA com território seleccionado, abrir preparação/SWOT e conferir `Contexto demográfico INE` como fonte. No simulador, consultar demografia e voltar ao rascunho sem alterar os valores fiscais. Em projectos/clusters, conferir a evidência dentro do papel territorial documentado. +5. Registar a decisão de homologação, incluindo o tratamento das divergências de 2031. Homologar esta entrega não implica instalar, publicar, migrar ou importar no activo. + +Recomendação: o modelo/importador estão preparados para **pré-visualizar** os restantes XLSX, um exemplar de cada vez, conferindo cabeçalhos, nomes territoriais, anos e totais antes de confirmar. O inventário também contém XLS legado e indicadores de outras naturezas: exigem adaptador/âmbito próprio, sem converter ou sobrescrever originais. Não se declara já demonstrada a importação das restantes províncias nem se autoriza execução desse trabalho. diff --git a/resources/js/components/demographic-context.tsx b/resources/js/components/demographic-context.tsx new file mode 100644 index 00000000..98968b7a --- /dev/null +++ b/resources/js/components/demographic-context.tsx @@ -0,0 +1,58 @@ +import { useState } from 'react'; +import DemographicEvidence, { + type DemographicAnalysis, +} from './demographic-evidence'; + +export default function DemographicContext({ + territoryId, +}: { + territoryId?: string | null; +}) { + const [evidence, setEvidence] = useState(null); + const [message, setMessage] = useState(''); + const [busy, setBusy] = useState(false); + if (!territoryId) return null; + return ( +
+ Demografia na análise de viabilidade +

+ Consulte a população e a estrutura etária da localização + escolhida, com fontes, anos e limitações. +

+ + {message &&

{message}

} + {evidence && } + + Escolher período, sector e comparar localizações + +
+ ); +} diff --git a/resources/js/components/demographic-evidence.tsx b/resources/js/components/demographic-evidence.tsx new file mode 100644 index 00000000..8fe41603 --- /dev/null +++ b/resources/js/components/demographic-evidence.tsx @@ -0,0 +1,231 @@ +export type DemographicAnalysis = { + state: string; + start_year: number; + end_year: number; + limitations: string[]; + comparisons: { + year: number; + left: string; + right: string; + left_value: string; + right_value: string; + left_import: string; + right_import: string; + difference: string | null; + explanation: string; + }[]; + differences: { + territory_id: string; + dimension: string; + state: string; + values: { import_id: string; value: string; data_kind: string }[]; + }[]; + territories: { + id: string; + name: string; + level: string; + factors_to_assess: string[]; + series: { + import_id: string; + source: string; + version: string; + sha256: string; + file_name: string; + missing_years: number[]; + issue_counts: Record; + values: { + year: number; + indicator: string; + age_group: string; + residence: string; + value: string; + original_value: string; + unit: string; + data_kind: string; + sheet: string; + cell: string; + validation_status: string; + }[]; + }[]; + }[]; +}; + +const indicators: Record = { + population: 'População', + life_expectancy: 'Esperança de vida', + infant_mortality: 'Mortalidade infantil', + crude_death_rate: 'Mortalidade bruta', + crude_birth_rate: 'Natalidade bruta', + fertility_rate: 'Fecundidade', + population_growth_rate: 'Crescimento populacional', +}; +export default function DemographicEvidence({ + evidence, +}: { + evidence: DemographicAnalysis; +}) { + return ( +
+ {evidence.state !== 'available' && ( +

Sem séries demográficas aprovadas para esta selecção.

+ )} + {evidence.territories.map((t) => ( +
+

+ {t.name} —{' '} + {t.level === 'district' ? 'Distrito' : 'Província'} +

+ {t.factors_to_assess.map((f) => ( +

{f}

+ ))} + {t.series.length === 0 && ( +

Sem dados no período escolhido.

+ )} + {t.series.map((s) => ( +
+ + {s.source} · {s.version} · {s.file_name} + +

+ SHA256: {s.sha256} +

+ {s.missing_years.length > 0 && ( +

+ Anos sem dados: {s.missing_years.join(', ')} +

+ )} + {Object.keys(s.issue_counts).length > 0 && ( +
+ Advertências da série +
+                                        {JSON.stringify(
+                                            s.issue_counts,
+                                            null,
+                                            2,
+                                        )}
+                                    
+
+ )} +
+ + + + + {[ + 'Ano', + 'Indicador', + 'Idade', + 'Residência', + 'Valor', + 'Unidade', + 'Tipo', + 'Referência', + ].map((h) => ( + + ))} + + + + {s.values.map((v) => ( + + + + + + + + + + + ))} + +
+ Valores originais por ano e dimensão — + versões apresentadas separadamente +
+ {h} +
+ {v.year} + + {indicators[v.indicator] ?? + v.indicator} + + {v.age_group === 'all' + ? 'Todas' + : v.age_group} + + { + { + all: 'Total', + urban: 'Urbana', + rural: 'Rural', + }[v.residence] + } + {v.original_value} + {v.unit === 'unspecified' + ? 'Não indicada na fonte' + : v.unit} + + {v.data_kind === 'projected' + ? 'Projecção' + : 'Não especificado'} + + {v.sheet}!{v.cell} +
+
+
+ ))} +
+ ))} + {evidence.comparisons.length > 0 && ( +
+

+ Diferenças entre localizações +

+ {evidence.comparisons.map((c) => ( +

+ {c.year}: {c.left} ({c.left_value}) / {c.right} ( + {c.right_value}). Diferença:{' '} + {c.difference ?? 'não comparável'}. {c.explanation} +

+ ))} +
+ )} + {evidence.differences.length > 0 && ( +
+ + Reconciliação entre exemplares:{' '} + {evidence.differences.length} dimensões comuns + +
    + {evidence.differences.map((d) => ( +
  • + {d.dimension}:{' '} + {d.state === 'matching_values' + ? 'valores coincidentes; conservar ambas as fontes' + : 'valores divergentes'}{' '} + —{' '} + {d.values + .map((v) => `${v.value} (${v.data_kind})`) + .join(' / ')} +
  • + ))} +
+
+ )} +
    + {evidence.limitations.map((l) => ( +
  • {l}
  • + ))} +
+
+ ); +} diff --git a/resources/js/components/simulation-form.tsx b/resources/js/components/simulation-form.tsx index d96de413..0106bfeb 100644 --- a/resources/js/components/simulation-form.tsx +++ b/resources/js/components/simulation-form.tsx @@ -1,4 +1,5 @@ import { SimulationIrpcAnnual } from '@/components/simulation-irpc-annual'; +import DemographicContext from '@/components/demographic-context'; import { SimulationIrpcNormal } from '@/components/simulation-irpc-normal'; import { SimulationIrpcWithholdings } from '@/components/simulation-irpc-withholdings'; import { SimulationIspcResiduals } from '@/components/simulation-ispc-residuals'; @@ -3077,6 +3078,10 @@ export function SimulationForm() { ))} + ))} + ['province', 'district'].includes(t.location_type)) + .at(-1)?.id} + /> {location.coordinates.map((point) => (

Coordenadas documentadas ( diff --git a/resources/js/pages/investment/catalogue.tsx b/resources/js/pages/investment/catalogue.tsx index 420323ad..c885b413 100644 --- a/resources/js/pages/investment/catalogue.tsx +++ b/resources/js/pages/investment/catalogue.tsx @@ -3,6 +3,7 @@ import { persistOpportunitySelection, } from '@/lib/opportunity-selection'; import CatalogueGuideLinks from '@/components/catalogue-guide-links'; +import DemographicContext from '@/components/demographic-context'; import OpportunityCorridorGroups, { type CorridorGroup, } from '@/components/opportunity-corridor-groups'; @@ -22,7 +23,7 @@ import type { QuantitativeMapContext } from '@/components/investment-map-indicat import type { InvestmentMapArea } from '@/components/interactive-investment-map'; import { type TerritoryOption } from '@/components/investment-territory'; import { Frame, button, card, money, api } from './shared'; -import type { Opportunity, References } from './shared'; +import type { Opportunity, References, Context } from './shared'; import { ArrowUpRight, Bookmark, @@ -171,7 +172,9 @@ export default function Catalogue({ const [territoryPath, setTerritoryPath] = useState(territorySelection); const [saved, setSaved] = useState(favourites); const [selected, setSelected] = useState([]); - const [comparison, setComparison] = useState<{ record: Opportunity }[]>([]); + const [comparison, setComparison] = useState< + { record: Opportunity; context?: Context }[] + >([]); const comparisonRef = useRef(null); useEffect(() => { if (view === 'corridors' && comparison.length) @@ -406,6 +409,21 @@ export default function Catalogue({ : 'Catálogo de investimento' } > + ['province', 'district'].includes(t.location_type)) + .at(-1)?.id + ? '?territories[]=' + territoryPath + .filter((t) => ['province', 'district'].includes(t.location_type)) + .at(-1)?.id + : '') + } + > + Comparar demografia e evolução das localizações + {!!territoryPath.length && ( ))} + + Demografia INE + {comparison.map(({ record: r, context: c }) => ( + + ['province', 'district'].includes(t.location_type)) + .at(-1)?.id} + /> + + ))} + diff --git a/resources/js/pages/investment/demography.tsx b/resources/js/pages/investment/demography.tsx new file mode 100644 index 00000000..63bdc181 --- /dev/null +++ b/resources/js/pages/investment/demography.tsx @@ -0,0 +1,128 @@ +import { router } from '@inertiajs/react'; +import { useState } from 'react'; +import DemographicEvidence, { + type DemographicAnalysis, +} from '@/components/demographic-evidence'; +import { Frame, button } from './shared'; + +export default function Demography({ + evidence, + filters, + territories, + sectors, +}: { + evidence: DemographicAnalysis; + filters: { + territories?: string[]; + start_year?: number; + end_year?: number; + sector?: string; + }; + territories: { + id: string; + name: string; + location_type: string; + parent_id: string | null; + }[]; + sectors: Record; +}) { + const [selected, setSelected] = useState(filters.territories ?? []); + const [start, setStart] = useState( + filters.start_year ?? new Date().getFullYear(), + ); + const [end, setEnd] = useState(filters.end_year ?? start); + const [sector, setSector] = useState(filters.sector ?? 'general'); + return ( + +

+ Compare até quatro localizações no mesmo sector e período. Use + esta evidência em conjunto com as condições económicas, fiscais + e territoriais do investimento. +

+
{ + e.preventDefault(); + router.get( + '/localizacoes/demografia', + { + territories: selected, + start_year: start, + end_year: end, + sector, + }, + { preserveState: true }, + ); + }} + > + +
+ + + + +
+
+ + + ); +} diff --git a/resources/js/pages/investment/detail.tsx b/resources/js/pages/investment/detail.tsx index e5a3b94a..e595cb03 100644 --- a/resources/js/pages/investment/detail.tsx +++ b/resources/js/pages/investment/detail.tsx @@ -1,4 +1,5 @@ import { ProactiveSummary } from '@/components/proactive-investment'; +import DemographicContext from '@/components/demographic-context'; import EducationalGuides from '@/components/educational-guides'; import InvestmentComplements, { type ComplementOption, @@ -183,6 +184,12 @@ export default function Detail({ filters={{ opportunity_id: r.id }} territoryId={c.primary_territory_path?.at(-1)?.id} /> + ['province', 'district'].includes(t.location_type)) + .at(-1)?.id} + /> {c.primary_territory_path && c.primary_territory_path.length > 0 && (

diff --git a/resources/js/pages/management/demography-install.tsx b/resources/js/pages/management/demography-install.tsx new file mode 100644 index 00000000..af8382e1 --- /dev/null +++ b/resources/js/pages/management/demography-install.tsx @@ -0,0 +1,180 @@ +import { router } from '@inertiajs/react'; +import { useState } from 'react'; +import { createOperationKey } from '@/lib/operation-key'; +import { Management, button, control } from './shared'; + +type Plan = { + mode: 'initial' | 'remaining' | 'zambezia'; + pending_count: number; + aliases: Record; + alias_sources: string[]; + missing_province_source: string | null; + hash: string; + ready: boolean; + installed: boolean; + consistent: boolean; + backup_verified: boolean; + mfa_confirmed: boolean; + target: { database: string; port: number }; + migration: string; + code_sha256: string; + files: Record }>; + new_districts: string[]; + notice: string; +}; + +export default function DemographyInstallation({ plan }: { plan: Plan }) { + const [reason, setReason] = useState( + 'Disponibilização autorizada pela Tempo em 13/11/2026, preservando valores, advertências e histórico.', + ); + const [confirmed, setConfirmed] = useState(false); + const [busy, setBusy] = useState(false); + const [message, setMessage] = useState(''); + const [operation] = useState(createOperationKey); + async function apply() { + setBusy(true); + setMessage(''); + try { + const cookie = + document.cookie + .split('; ') + .find((c) => c.startsWith('XSRF-TOKEN=')) + ?.split('=') + .slice(1) + .join('=') ?? ''; + const response = await fetch('/management/demography/install', { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'X-XSRF-TOKEN': decodeURIComponent(cookie), + }, + body: JSON.stringify({ + hash: plan.hash, + mode: plan.mode, + confirm: confirmed, + operation_key: operation, + reason, + }), + }); + const body = await response.text(); + if (!body.trim() || !response.headers.get('content-type')?.includes('application/json')) { + throw new Error(`O servidor não devolveu um recibo JSON (HTTP ${response.status}). Consulte o estado antes de repetir a operação.`); + } + const result = JSON.parse(body); + if (!response.ok) + throw new Error( + result.message ?? + 'Não foi possível disponibilizar os dados.', + ); + router.visit('/management/demography'); + } catch (error) { + setMessage( + error instanceof Error + ? error.message + : 'Falha de comunicação. Consulte o estado antes de repetir.', + ); + } finally { + setBusy(false); + } + } + return ( + +

+ Destino:{' '} + + {plan.target.database}:{plan.target.port} + + . {plan.mode !== 'initial' ? 'Disponibiliza os ficheiros pendentes deste conjunto e acrescenta apenas os distritos autorizados, preservando todos os lotes já aprovados.' : 'Instala as tabelas demográficas e disponibiliza os três exemplares homologados.'} Mantém os dados existentes, as versões e os valores originais. +

+
+
Backup e restauro da entrega
+
+ {plan.backup_verified + ? 'Conferidos' + : 'Pendentes ou desactualizados'} +
+
Estrutura
+
+ {plan.consistent + ? plan.installed + ? 'Instalada' + : 'Preparada' + : 'Divergente — reconciliar'} +
+
MFA da sessão
+
+ {plan.mfa_confirmed + ? 'Confirmado' + : 'Conclua o MFA da sua conta antes de executar'} +
+
+ + + + + + + + + + {Object.entries(plan.files).map(([name, file]) => ( + + + + + ))} + +
+ Pré-visualização aprovada para disponibilização +
ExemplarObservações
{name}{file.records.toLocaleString('pt-MZ')}
+

+ Distritos a acrescentar quando ausentes:{' '} + {plan.new_districts.join(' e ')}. Não são criados limites + geográficos, licenças ou direitos territoriais. +

+

{plan.notice}

+ {plan.mode !== 'initial' &&
Conferir advertências por ficheiro

Nas células com fórmulas, são conservados apenas os valores numéricos guardados no original. O portal não executa nem recalcula fórmulas. Valores ausentes não se tornam zero.

    {Object.entries(plan.files).map(([name,file])=>
  • {name}
      {Object.entries(file.issues ?? {}).map(([code,count])=>
    • {({cached_formula_value:'Valores guardados em células com fórmula',missing_value:'Valores em falta',age_total_mismatch:'Divergências na soma de idades',sex_total_mismatch:'Divergências na soma por sexo',residence_total_mismatch:'Divergências entre urbano/rural',district_total_mismatch:'Divergências na soma de distritos'} as Record)[code] ?? code}: {count.toLocaleString('pt-MZ')}
    • )}
  • )}
} + {plan.mode !== 'initial' &&

{plan.pending_count} ficheiros ainda por disponibilizar. {plan.missing_province_source && <>{plan.missing_province_source}: ficheiro provincial não fornecido; não se presume cobertura anual.}

} + {Object.keys(plan.aliases).length > 0 &&
Conferir correspondências com o cadastro existente
    {Object.entries(plan.aliases).map(([key,name])=>
  • {key.split('|').slice(0,2).join(' — ')} → {name}
  • )}

Designações originais preservadas; os identificadores do cadastro não são renomeados ou fundidos.

} + {plan.pending_count === 0 &&

Todos os ficheiros deste conjunto já estão aprovados. Não é necessário repetir a operação.

} +