diff --git a/docs/investmoz/unification/main-local-database-qa-20261104.json b/docs/investmoz/unification/main-local-database-qa-20261104.json new file mode 100644 index 00000000..10732714 --- /dev/null +++ b/docs/investmoz/unification/main-local-database-qa-20261104.json @@ -0,0 +1,62 @@ +{ + "date": "2026-11-04", + "scope": "main local; isolated PostgreSQL/PostGIS tests; no push or deployment", + "tested_base_commit": "66a5dbf3118de8ff4787d2a7a5854df578df01ba", + "qa": { + "host": "127.0.0.1", + "port": 55441, + "exclusive_cluster": "C:\\Users\\macbook\\.config\\investmoz\\main-qa-20261104-pgdata", + "databases": [ + "investmoz_test", + "simulator_fiscal_delta_20261021_test", + "proactive_investment_20261027_test", + "main_reference_20261104_test", + "main_extra_20261104_test" + ], + "ready": true + }, + "tests": { + "unique_cases_passed": 1325, + "unique_assertions": 28377, + "failures_remaining": 0, + "feature_files_covered": 274, + "unit_cases": 94, + "schema_lifecycle_assertions": 3106, + "competitiveness": { + "tests": 7, + "assertions": 93 + }, + "province_filters": { + "tests": 4, + "assertions": 364 + } + }, + "initial_diagnostics_preserved": [ + "snapshot encryption mismatch: verified original key used only in process APP_PREVIOUS_KEYS", + "combined RefreshDatabase traits regrouped; aborted reference copy restored", + "fiscal test fixtures separated from snapshot rules", + "GD/WebP loaded for QA CLI processes only", + "outdated audit total corrected: preserve13 business events and verify8 scan events and idempotent replay" + ], + "application_source_changed": false, + "test_correction": { + "file": "tests/Feature/PortalServicesTest.php", + "sha256": "cc2e90c1929b6b2ef050c1c9e58ae2e15ef3c3189459f12ee25d24e26ce9651b", + "reason": "Preserve 13 business audit records and verify the eight existing malware worker start/result events and replay idempotency" + }, + "preservation": { + "historical_files_verified_and_restored": 523, + "generated_outputs_archived": 17, + "original_qa_dumps_unchanged": true, + "matrix": { + "unique_requirements": 3555, + "columns": 49 + }, + "active_database_operations": 0, + "remote_push": false, + "active_migrations": false, + "service_restarts": false + }, + "evidence": "outputs/main-db-qa-20261104/result.json; readiness.json; evidence-preservation.json; *.junit.xml", + "visual_acceptance": "previous pending states preserved; no visual conference performed" +} diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 78c41e2e..46db0c50 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -9087,3 +9087,14 @@ Verificação do delta: 25 testes frontend dirigidos aprovados; TypeScript e com Pedido expresso da Tempo: integrar a reconciliação na `main` local, preservar as alterações, verificar conflitos e testes, sem enviar para o remoto. A `main` anterior (`4b3c7e16`) foi preservada em `backup/main-before-reconciliation-20261104`. A integração de `codex/investemoz-reconciliation-20261029` (`f17e807c`) fez fast-forward: a main anterior é antepassada da origem. Não houve nova resolução automática nem descarte de conteúdo; a árvore integrada foi conferida idêntica à origem. Os oito conflitos gravados já estavam resolvidos no commit de origem e não existem marcadores em app/resources/routes/tests/docs. Sem alterações por gravar anteriores ou alterações nos outros worktrees. Verificação local: 1.672 testes frontend aprovados, zero falhas; TypeScript global aprovado; compilação QA aprovada em `public/build-qa-opportunities` (avisos de fontaine opcional e dimensão dos chunks); sintaxe dos 468 ficheiros PHP alterados aprovada; `git diff --check` limpo. Matriz preservada com 3.555 requisitos únicos e 49 colunas. Recibos e logs: `outputs/reconciliation-main-local-20261104/integrity.json`. Testes dependentes de PostgreSQL não reexecutados: não havia listener da QA isolada em 55441. Provas anteriores preservadas, sem as apresentar como nova execução. Esta integração não declara aceitação funcional/visual integral, disponibilização no portal nem execução de migrações. Sem push, escrita na base activa, publicação de conteúdos ou alteração de serviços/permissões. + + +### 04/11/2026 — base QA exclusiva e testes da main local + +Pedido expresso da Tempo: preparar QA isolada e executar os testes de base de dados da main local, sem tocar na base activa nem enviar alterações ao remoto. Base de código `66a5dbf3`, após integrar a reconciliação. Criado cluster PostgreSQL/PostGIS novo em directório exclusivo `C:/Users/macbook/.config/investmoz/main-qa-20261104-pgdata`, apenas em `127.0.0.1:55441`, com cinco bases terminadas em `_test`. Guardas conferem nome, porta e directório real antes de migrações/testes; sem configuração em cache, DB_URL ou fallback activo. InvesteMoz, SGF e os restantes clusters não foram reiniciados nem reconfigurados. QA permanece disponível; nenhuma instalação de serviço ou alteração global do PHP. + +Resultado final por caso distinto, substituindo o resultado inicial apenas quando houve repetição documentada: **1.325 aprovados, 28.377 asserções, zero falhas por resolver nesta ronda**. Todos os 274 ficheiros Feature cobertos, mais 94 casos unitários e ciclo de schema com 3.106 asserções. Inclui Competitividade 7/93 e filtros provinciais 4/364. A ronda principal inicial teve 877 casos, 873 aprovados, duas falhas e dois erros; os quatro casos passaram em repetição dirigida após carregar GD/WebP apenas no processo QA e corrigir uma expectativa antiga de auditoria. O teste conserva os 13 eventos de negócio, verifica os oito eventos já existentes de início/resultado de quatro scans e confirma ausência de duplicação no replay. Não se alterou o código da aplicação. + +Preparação e diagnósticos preservados: dois snapshots QA anteriores restaurados em bases separadas e actualizados pelas migrações locais; histórico de uma migração da oferta reconciliado só no clone, após comparar colunas, constraints, índices, políticas e RLS com o schema actual. Dois testes com traits combinados de RefreshDatabase tinham sido mal agrupados: executor da cópia de referência interrompido, logs conservados, cópia restaurada e testes separados; não foi perda de dados activos. Fixture fiscal própria executada em schema limpo, sem apagar versões legítimas do snapshot. Chave local compatível do snapshot verificada e disponibilizada apenas ao executor como chave anterior, sem expor, alterar chave ou reescrever registos. Originais editoriais existentes copiados para a fixture QA com hashes verificados. Falhas iniciais não são apagadas nem apresentadas como regressões resolvidas no produto sem causa demonstrada. + +Preservação: 523 JSON históricos conferidos/restaurados por SHA256, 17 saídas novas arquivadas separadamente; dumps originais QA inalterados. Matriz mantém 3.555 requisitos únicos e 49 colunas. Pint, sintaxe do teste alterado e diff-check aprovados. Sem push, publicação, migração/escrita activa ou alteração de permissões activas. Estas provas não substituem a conferência visual autenticada nem encerram requisitos transversais; pendências anteriores conservadas. Recibo: `docs/investmoz/unification/main-local-database-qa-20261104.json`; resultados por teste, tentativas iniciais, executores e JUnit em `outputs/main-db-qa-20261104/`. diff --git a/tests/Feature/PortalServicesTest.php b/tests/Feature/PortalServicesTest.php index 919b30dc..43209209 100644 --- a/tests/Feature/PortalServicesTest.php +++ b/tests/Feature/PortalServicesTest.php @@ -285,7 +285,14 @@ class PortalServicesTest extends TestCase $this->post('/management/portal-services/disclosure-authorization/apply') ->assertRedirect(route('services.manage'))->assertSessionHasNoErrors(); $this->assertDatabaseCount('portal_resource_revisions', 8); - $this->assertDatabaseCount('audit_events', 13); + // Four synchronous scans now retain their start and result in the audit ledger. + $this->assertSame(13, DB::table('audit_events')->where('source_system', '!=', 'document-malware-worker')->count()); + $this->assertDatabaseCount('audit_events', 21); + foreach (DB::table('portal_resources')->whereIn('id', $resourceIds)->pluck('document_id') as $documentId) { + $this->assertSame(['scan_result_recorded', 'scan_started'], DB::table('audit_events') + ->where('source_system', 'document-malware-worker')->where('entity_id', $documentId) + ->orderBy('action')->pluck('action')->all()); + } $this->assertSame(4, DB::table('portal_resources')->where('published', true)->count()); $this->assertSame(4, DB::table('documents')->where('data_classification', 'public')->where('rights_status', 'authorized')->count()); $this->assertDatabaseHas('portal_resources', ['id' => $resourceIds[2], 'published' => true, 'source_confirmation' => 'identified', 'legal_status' => 'unknown']); @@ -308,6 +315,7 @@ class PortalServicesTest extends TestCase $this->assertDatabaseHas('portal_resource_links', ['resource_id' => $resourceIds[0], 'target_type' => 'module', 'target_key' => 'simulator']); $this->post('/management/portal-services/disclosure-authorization/apply')->assertSessionHasNoErrors(); $this->assertDatabaseCount('portal_resource_revisions', 8); + $this->assertDatabaseCount('audit_events', 21); } public function test_qa_library_preserves_an_original_without_inventing_a_topic_or_auto_publishing(): void