Compare commits

..
7 changed files with 858 additions and 7 deletions
@@ -1403,3 +1403,29 @@ O relatório comum tinha um conflito de imports. Foram conservados ambos e as ch
Retomar na sessão local com SSH autenticado, usando a autorização já registada: medir espaço/inodes na partição efectiva, comparar com compilação e backup, conferir main e revisão activa, criar e ensaiar backup fresco, instalar L8 e conferir apenas o seu delta. Depois repetir as guardas necessárias para a candidata conjunta e conferir o delta proactivo preservando L8. Manter a versão activa até a nova estar pronta. Excluir fixtures QA dos inputs de instalação; não executar seeders/importações de amostras, não publicar pilotos privados nem usar o pacote QA como cópia da base activa. SGF TEMPO separado.
Recibo de preparação: `docs/investmoz/unification/sequential-delivery-preparation-20261027.json`. Provas e instrução de passagem: `outputs/sequential-delivery-20261027/`. Os recibos de execução e as duas revisões servidas serão registados apenas depois de execução real na sessão autenticada; este recibo não os substitui.
## 27/10/2026 — L8 e percurso proactivo instalados pela sequência autorizada
Entrega1: **L8 `c85e772d`**, anterior `f8d57bdd`. Entrega2, apenas após conferir a primeira: **percurso proactivo `9fda6d6e`**, incluindo `56c0c6a7` e preservando L8. As duas revisões foram conferidas no registo do instalador e no recurso público `/build/revision.json`, com hash do manifest e marcadores compilados dos deltas. `c85e772d` conserva o código aceite de `14360748`; o merge proactivo mantém ambos os fornecedores de linhas do relatório. A referência final servida passa a `9fda6d6e`.
A tentativa proactiva em `56c0c6a7` não foi activada: um teste dependia de um ficheiro de outputs existente apenas no QA local. L8 permaneceu em serviço. A correcção `9fda6d6e` torna esse teste portátil com um exemplar mínimo sintético da projecção pública da API, sem perfis, credenciais ou pilotos reais e sem escrita em outputs. O teste dirigido passou; o código da aplicação é byte a byte idêntico a `56c0c6a7`. Não se transportou a base QA nem se saltou a guarda do instalador. A nova tentativa usou o backup/restauro ainda fresco, com capacidade e fonte activa novamente conferidas.
A ligação SSH foi restabelecida pelo responsável na janela local, sem credenciais na conversa ou nos recibos. A medição inicial encontrou91,6GiB livres e inodes suficientes; a capacidade foi novamente conferida depois de cada backup. Instalador existente e suas guardas preservados; a versão anterior permaneceu activa até a nova release estar pronta. Os controlos automáticos do instalador foram mantidos, sem nova ronda manual das provas funcionais/económicas aceites.
**Backup/restauro fresco em cada etapa:** `/var/backups/investmoz-sequential-20261027/l8/backup` e `/var/backups/investmoz-sequential-20261027/proactive/backup`. Em cada uma, dump consistente e369ficheiros persistentes/configuração verificados; restauro das174tabelas num contentor sem rede, porta55441, com contagens/checksums iguais. Recibos `backup-receipt.json`, `restore-receipt.json`, `schema-permissions-before.json`, `schema-permissions-after.json`, `preservation-receipt.json` e `operational-delta-receipt.json` conservados nesses directórios. Hashes exactos no recibo consolidado.
**Preservação demonstrada:**172tabelas de negócio intactas em cada comparação; apenas cache/sessões operacionais reconciliados individualmente por identidade/timeouts e pedidos públicos de entrega. Schema, papéis, grants, permissões e originais persistentes conservados. Fontes instaladas comparadas aos commits:996ficheiros após L8 e1000após o proactivo. Sem migrations na base activa, importação de amostras QA, seeders ou publicação dos pilotos. O instalador manteve base e storage sintéticos isolados; o storage QA fica fora da árvore servida, e a release usa os mesmos `.env` e storage persistentes por ligação.
**Âmbito:** L8 continua parcial, com PEC e créditos de regra própria separados; os resultados continuam simulações. Songo permanece privado e pendente de respostas externas; Gurué continua hipótese agrícola privada. Disponibilização técnica não confirma clientes, procura, sustentabilidade ou publicação comercial. L3, ISPC, câmbio, L6/L7 e SGF TEMPO preservados.
Recibo consolidado: `docs/investmoz/unification/sequential-delivery-installed-20261027.json`. Provas locais: `outputs/l8-proactive-install-20261027/`. Os recibos históricos de preparação/suspensão mantêm-se como histórico e deixam de representar pendência de instalação destas duas candidatas.
Recibo remoto consolidado: `/var/backups/investmoz-sequential-20261027/installed-receipt.json`;SHA256 `62584b5abb50a05303a24379a0563e8dc147e25e682dc3566bb8edf015ba9d0b`. A fixture sintética portátil é apenas input de teste, sem importação na aplicação e sem dados dos pilotos.
## 27/10/2026 — utilização real do percurso proactivo: exercício preparado, execução por observar
Reutilizadas a entrega `9fda6d6e` e as provas técnicas aceites. Roteiro no manual existente, secção «avaliação de utilização pela equipa, sem Codex»: análise privada de trabalho → evidências com proveniência → ideia com hipótese/pendências → guardar/recuperar → mesmo dossier → revisão sem duplicação. A equipa utiliza a própria conta autorizada e devolve referências internas, passo, dificuldade concreta e apoio consultado. Estado desta avaliação: **pendente de execução real**, sem resultados de participantes inventados e sem nova aprovação obrigatória da entrega.
As quatro linhas proactivas existentes (RF-CLU-003, MASTER-471012ab-0010, MASTER-9dee08d0-0067 e MASTER-471012ab-0067) conservam as provas e limitações; esta nota não promove os requisitos globais a concluídos. Não houve testes técnicos, nova instalação, alteração no portal ou contacto externo. Songo/Gurué privados; L8 parcial, PEC/créditos próprios separados. Registo: `docs/investmoz/unification/proactive-team-use-evaluation-20261027.json`. Retoma: tratar apenas os obstáculos observados pela equipa.
@@ -0,0 +1,40 @@
{
"date": "2026-10-27",
"status": "exercise_prepared_awaiting_real_team_use",
"installed_reference_from_accepted_receipt": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"installation_receipt": "docs/investmoz/unification/sequential-delivery-installed-20261027.json",
"guide": "docs/investmoz/unification/traceability-and-manual.md#27102026--avaliação-de-utilização-pela-equipa-sem-codex",
"evaluation_scope": [
"prepare a private work analysis using an existing authorised source",
"record evidence with source,period,coverage and distinction between fact and hypothesis",
"structure a complementary idea with clients/payer,conditions and unknowns",
"save and recover through the interface",
"preview/confirm and recover in the same dossier",
"revise a pending point and recover the new version without duplication"
],
"existing_guide_reused": true,
"technical_proofs_reused": true,
"new_technical_tests": 0,
"new_installations": 0,
"active_application_writes": 0,
"private_pilots_modified": false,
"team_messages_sent": 0,
"team_execution_observed": false,
"participants": [],
"observed_results": [],
"Codex_executes_team_exercise": false,
"existing_authorised_accounts_only": true,
"new_permissions_or_roles": false,
"not_a_new_approval_gate": true,
"results_to_return": [
"date and operational profile",
"internal analysis/dossier references in authorised channel",
"steps achieved and guide/human help used",
"step/field and concrete difficulty",
"exact message or behaviour and expected result"
],
"resume_when": "Real team observations arrive;address only reported usability/access/save-recovery obstacles",
"commercial_validation_separate": true,
"Songo_and_Gurue": "private;external commercial evidence pending",
"L8": "partial;PEC and own credits separate"
}
@@ -0,0 +1,719 @@
{
"date": "2026-10-27T10:51:18.002627+00:00",
"status": "both_deliveries_installed_in_requested_order",
"order": [
"l8",
"proactive"
],
"stages": {
"l8": {
"candidate": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"previous": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
"installed": {
"status": "installed",
"commit": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"release": "/var/www/investmoz-homologacao/releases/c85e772d2fd2be5182eb4d768ddd34d43962bf59-ae7401aa",
"previous_release": "/var/www/investmoz-homologacao/releases/f8d57bddf96b4610604a013fcc5bdd703c7dc6d5-7a31e8ac",
"database_migrations": 0,
"content_imports": 0
},
"served": {
"commit": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"branch": "main",
"built_at": "2026-10-27T10:32:26.854949+00:00",
"manifest_sha256": "f27852b26d53b46f6927ee46c13370db17a4bec1623655552fd8fdca3589005a"
},
"backup": {
"stage": "/var/backups/investmoz-sequential-20261027/l8/backup",
"created_at": "2026-10-27T10:25:59Z",
"target": {
"database": "teste_investidor",
"port": 5432
},
"tables": 174,
"files_verified": 369,
"dump_sha256": "11bc7c8f25edc861b18785a9714845384cf29a5da92f58f55ff53f6913e69d42",
"files_sha256": "52ffe40bcf943ce580047b55c34b60d3ba876d81dd4bc3ff4fbe1ec97a9c6f56",
"restore_verified": false
},
"restore": {
"restore_verified": true,
"tables_verified": 174,
"container_network": "none",
"database": "irpc_l8_first_restore_20261027",
"port": 55441,
"source_dump_sha256": "11bc7c8f25edc861b18785a9714845384cf29a5da92f58f55ff53f6913e69d42",
"active_database_writes": 0
},
"capacity_after_backup": {
"at": "2026-10-27T10:28:35.403687+00:00",
"baseline": "f8d57bddf96b4610604a013fcc5bdd703c7dc6d5",
"capacity_after_backup_satisfied": true,
"volumes": [
{
"path": "/var/www/investmoz-homologacao/releases",
"free_bytes": 98153496576,
"free_inodes": 23860325
},
{
"path": "/var/lib/investmoz-deploy",
"free_bytes": 98153496576,
"free_inodes": 23860325
},
{
"path": "/var/backups",
"free_bytes": 98153496576,
"free_inodes": 23860325
},
{
"path": "/tmp",
"free_bytes": 98153496576,
"free_inodes": 23860325
},
{
"path": "/var/lib/docker",
"free_bytes": 98153496576,
"free_inodes": 23860325
}
],
"backup_age_seconds": 156.403651,
"backup_dump_sha256": "11bc7c8f25edc861b18785a9714845384cf29a5da92f58f55ff53f6913e69d42",
"restore_verified": true,
"tables_verified": 174,
"files_verified": 369,
"backup_paths": {
"dump": "/var/backups/investmoz-sequential-20261027/l8/backup/database.dump",
"files": "/var/backups/investmoz-sequential-20261027/l8/backup/files-before.tar.gz"
},
"active_writes": 0
},
"source": {
"phase": "after",
"installed": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"files_verified": 996,
"source_matches_Git": true,
"active_writes": 0
},
"schema_permissions": {
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
"filesystem_permissions": {
".env": {
"mode": 416,
"uid": 1001,
"gid": 33
},
"storage": {
"mode": 1533,
"uid": 1001,
"gid": 33
},
"storage/app": {
"mode": 1533,
"uid": 1001,
"gid": 33
},
"bootstrap/cache": {
"mode": 1528,
"uid": 1001,
"gid": 33
}
},
"comparison_identity": "postgres;catalogue read only;no passwords collected",
"unchanged": true
},
"preservation": {
"checked_at": "2026-10-27T10:34:53.148104+00:00",
"installed": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"business_tables_unchanged": 172,
"total_tables": 174,
"operational_tables_to_reconcile": {
"cache": {
"before": {
"rows": 106,
"checksum": "6c05e12d73079effd52f3add83104de2"
},
"after": {
"rows": 106,
"checksum": "a9c2d7df6ecc8cabba35d5c6f1d019c5"
}
},
"sessions": {
"before": {
"rows": 11,
"checksum": "b83d84b3894b8fc6ef42b0b8fd937304"
},
"after": {
"rows": 12,
"checksum": "fea9aecf735aa394f40e9a4b6a55e27f"
}
}
},
"persistent_files_unchanged": 369,
"original_configuration_preserved": true,
"synthetic_QA_storage_not_served": true,
"QA_storage_saved_outside_active": "/var/lib/investmoz-deploy/qa-runtime/c85e772d2fd2be5182eb4d768ddd34d43962bf59-ae7401aa",
"fixture_or_content_imports": 0,
"migrations": 0,
"comparison_identity": "postgres;UTC;consistent before snapshot and after read-only transaction",
"active_database_writes": 0
},
"operational_delta": {
"status": "operational_delta_reconciled",
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
"delta": {
"cache": {
"before_rows": 106,
"after_rows": 106,
"changes": [
{
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
"kind": "updated",
"fields": [
"value",
"expiration"
],
"key_pattern": "investemoz-cache-illuminate:queue:restart",
"is_queue_restart_key": true,
"expiration_unchanged": false,
"throttle_timer_pair": false,
"same_value_home_cache_expiry_refresh": false
}
]
},
"sessions": {
"before_rows": 11,
"after_rows": 15,
"changes": [
{
"key_sha256": "7a0b0d7c40ef99d4c033c9df695a5cd69d6433f068463fdf9f8baff6835453f6",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "9f06bc9fb6ef8d45fe1c1093b4e54b59ee080463861b8051271597b0ec5e45a4",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "e66f917f9d71192fe17cf2c7c26046afa6bff0db292d0c232a5b59629be030a3",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "a84b009ac5f5358a0452f4a40968a4826e34ced257930b6ecf08a0289aa6684f",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
}
]
}
},
"business_tables_to_confirm_separately": 172,
"active_data_writes_by_comparison": 0,
"restore_network": "none"
},
"public_delta": {
"stage": "l8",
"served_revision": {
"commit": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"branch": "main",
"built_at": "2026-10-27T10:32:26.854949+00:00",
"manifest_sha256": "f27852b26d53b46f6927ee46c13370db17a4bec1623655552fd8fdca3589005a"
},
"manifest_hash_matches": true,
"compiled_delta_markers": {
"IRPC-annual-settlement/1": [
"assets/project-dossier-BNt4O6Rz.js"
],
"Preparar saldo anual L8": [
"assets/services-BvFvahdE.js"
],
"Calcular e guardar saldo anual L8": [
"assets/services-BvFvahdE.js"
],
"Saldo anual simulado": [
"assets/project-dossier-BNt4O6Rz.js"
],
"PEC e créditos separados": [
"assets/project-dossier-BNt4O6Rz.js"
]
},
"assets": [
{
"file": "assets/simulation-form-zFZ4YNrB.js",
"status": 200,
"sha256": "338068b86cce1c3215ee71b1328a6cb2f754b903ed78ff1886f8554df506d2d6"
},
{
"file": "assets/services-BvFvahdE.js",
"status": 200,
"sha256": "97615f0d113746ee5ac1550a1e59c567dd152ef5ddac68f133bd2cee9e9c16d1"
},
{
"file": "assets/project-dossier-BNt4O6Rz.js",
"status": 200,
"sha256": "8cf6a6678c5c9aed0d7b996147bc2fde35d20f86c73ec7bd894df2ae11aae75c"
},
{
"file": "assets/project-dossier-document-Cj4QX7oF.js",
"status": 200,
"sha256": "302ec6831893f2ef4c09a90273b458c49a6ff281adb01c4594a166a90efe53e2"
}
],
"simulator_status": 200,
"served_component": "portal/services",
"private_operations": 0,
"QA_fixture_imports": 0,
"accepted_QA_proofs_reused": true,
"method": "Read-only served revision/manifest/compiled delta;no synthetic active records or publication"
},
"backup_restore_verified": true
},
"proactive": {
"candidate": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"previous": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"installed": {
"status": "installed",
"commit": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"release": "/var/www/investmoz-homologacao/releases/9fda6d6e12832a3cf25e7314f1f895dd430238c5-88fc859c",
"previous_release": "/var/www/investmoz-homologacao/releases/c85e772d2fd2be5182eb4d768ddd34d43962bf59-ae7401aa",
"database_migrations": 0,
"content_imports": 0
},
"served": {
"commit": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"branch": "main",
"built_at": "2026-10-27T10:50:00.471464+00:00",
"manifest_sha256": "40de38cbf74b475f73de825bfd16af6fabe339faad4817e2857fd9ae36ec7cc0"
},
"backup": {
"stage": "/var/backups/investmoz-sequential-20261027/proactive/backup",
"created_at": "2026-10-27T10:36:28Z",
"target": {
"database": "teste_investidor",
"port": 5432
},
"tables": 174,
"files_verified": 369,
"dump_sha256": "45107e48e18ab2b9a78af08374fe3bfa0af216f34433c10fc81f264400e331ce",
"files_sha256": "f7196314f915e75975a9e580a69ddc4dffae64597ae05e9ae59cfbcbb0b47731",
"restore_verified": false
},
"restore": {
"restore_verified": true,
"tables_verified": 174,
"container_network": "none",
"database": "irpc_l8_first_restore_20261027",
"port": 55441,
"source_dump_sha256": "45107e48e18ab2b9a78af08374fe3bfa0af216f34433c10fc81f264400e331ce",
"active_database_writes": 0
},
"capacity_after_backup": {
"at": "2026-10-27T10:46:06.120042+00:00",
"baseline": "c85e772d2fd2be5182eb4d768ddd34d43962bf59",
"capacity_after_backup_satisfied": true,
"volumes": [
{
"path": "/var/www/investmoz-homologacao/releases",
"free_bytes": 95851429888,
"free_inodes": 23794207
},
{
"path": "/var/lib/investmoz-deploy",
"free_bytes": 95851429888,
"free_inodes": 23794207
},
{
"path": "/var/backups",
"free_bytes": 95851429888,
"free_inodes": 23794207
},
{
"path": "/tmp",
"free_bytes": 95851429888,
"free_inodes": 23794207
},
{
"path": "/var/lib/docker",
"free_bytes": 95851429888,
"free_inodes": 23794207
}
],
"backup_age_seconds": 578.120001,
"backup_dump_sha256": "45107e48e18ab2b9a78af08374fe3bfa0af216f34433c10fc81f264400e331ce",
"restore_verified": true,
"tables_verified": 174,
"files_verified": 369,
"backup_paths": {
"dump": "/var/backups/investmoz-sequential-20261027/proactive/backup/database.dump",
"files": "/var/backups/investmoz-sequential-20261027/proactive/backup/files-before.tar.gz"
},
"active_writes": 0
},
"source": {
"phase": "after",
"installed": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"files_verified": 1000,
"source_matches_Git": true,
"active_writes": 0
},
"schema_permissions": {
"schema_sha256": "5045b3e51d2185377aa3d9ac7fa07a44fad3ec620cdfa83ffe31c8884ee1601d",
"roles_grants_sha256": "1530c33cb016e67bfdc64891ddfce7f185b13b56b2cd87c012871a685e118109",
"filesystem_permissions": {
".env": {
"mode": 416,
"uid": 1001,
"gid": 33
},
"storage": {
"mode": 1533,
"uid": 1001,
"gid": 33
},
"storage/app": {
"mode": 1533,
"uid": 1001,
"gid": 33
},
"bootstrap/cache": {
"mode": 1528,
"uid": 1001,
"gid": 33
}
},
"comparison_identity": "postgres;catalogue read only;no passwords collected",
"unchanged": true
},
"preservation": {
"checked_at": "2026-10-27T10:50:49.400700+00:00",
"installed": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"business_tables_unchanged": 172,
"total_tables": 174,
"operational_tables_to_reconcile": {
"cache": {
"before": {
"rows": 106,
"checksum": "a9c2d7df6ecc8cabba35d5c6f1d019c5"
},
"after": {
"rows": 106,
"checksum": "db78f82003db53db664667b8e6f46088"
}
},
"sessions": {
"before": {
"rows": 15,
"checksum": "4df23659bf65acacc88e1d84d095a243"
},
"after": {
"rows": 20,
"checksum": "64d48443c5027a2fc08615f7528126b5"
}
}
},
"persistent_files_unchanged": 369,
"original_configuration_preserved": true,
"synthetic_QA_storage_not_served": true,
"QA_storage_saved_outside_active": "/var/lib/investmoz-deploy/qa-runtime/9fda6d6e12832a3cf25e7314f1f895dd430238c5-88fc859c",
"fixture_or_content_imports": 0,
"migrations": 0,
"comparison_identity": "postgres;UTC;consistent before snapshot and after read-only transaction",
"active_database_writes": 0
},
"operational_delta": {
"status": "operational_delta_reconciled",
"comparison_identity": "postgres before/after;isolated restored baseline;no RLS visibility inference",
"cache": "queue:restart;requestthrottle;identical home-sector cached value with refreshed expiry(HomeController remember10min);no deletedcache",
"sessions": "anonymous sessions from delivery user-agent or exactUA/time correlated with nginx public request;deleted sessions individually expired beyond configured lifetime,normal database session garbage collection(config/session lottery2/100)",
"delta": {
"cache": {
"before_rows": 106,
"after_rows": 106,
"changes": [
{
"key_sha256": "7f7dd83f47f5bf404d55e6e9f1367948721579970b195680645e356031a070ff",
"kind": "updated",
"fields": [
"value",
"expiration"
],
"key_pattern": "investemoz-cache-illuminate:queue:restart",
"is_queue_restart_key": true,
"expiration_unchanged": false,
"throttle_timer_pair": false,
"same_value_home_cache_expiry_refresh": false
}
]
},
"sessions": {
"before_rows": 15,
"after_rows": 20,
"changes": [
{
"key_sha256": "f78ee9e6f589e1bbda4730d4e71a90c9ad082cc25776c415b6cc815ce4b4d491",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "7eb58435f5d60610be81945c0da4331a1dbfda680f7da3f107dbbeb6b60c39df",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "1d5026f13ace3894011db54d801f72cd76f9b138d54fe2f7b89f579743282db6",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "56820cc8560f13a2c0962a973bd05624712648c2beffd2058dfbae6c9103c7fa",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
},
{
"key_sha256": "a91337e37e71b520dd6d621b0ef7bbf68a9a20d099198ecd8edfdc365a9f52f1",
"kind": "added",
"fields": [
"id",
"ip_address",
"user_agent",
"payload",
"last_activity"
],
"anonymous_user": true,
"delivery_user_agent": true,
"expired_before_comparison": false,
"session_lifetime_minutes": 120,
"anonymous_public_request_logged": true
}
]
}
},
"business_tables_to_confirm_separately": 172,
"active_data_writes_by_comparison": 0,
"restore_network": "none"
},
"public_delta": {
"stage": "proactive",
"served_revision": {
"commit": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"branch": "main",
"built_at": "2026-10-27T10:50:00.471464+00:00",
"manifest_sha256": "40de38cbf74b475f73de825bfd16af6fabe339faad4817e2857fd9ae36ec7cc0"
},
"manifest_hash_matches": true,
"compiled_delta_markers": {
"IRPC-annual-settlement/1": [
"assets/project-dossier-DFH3NDYe.js"
],
"Preparar saldo anual L8": [
"assets/services-CV6TWKfT.js"
],
"Calcular e guardar saldo anual L8": [
"assets/services-CV6TWKfT.js"
],
"Saldo anual simulado": [
"assets/project-dossier-DFH3NDYe.js"
],
"PEC e créditos separados": [
"assets/project-dossier-DFH3NDYe.js"
],
"Território e sector": [
"assets/proactive-investment-CPkgrUFY.js"
],
"Preparar análise e ideia": [
"assets/proactive-investment-CPkgrUFY.js"
],
"Hipótese analítica": [
"assets/project-dossier-DFH3NDYe.js",
"assets/proactive-investment-CPkgrUFY.js"
],
"Documento existente associado": [
"assets/proactive-investment-CPkgrUFY.js"
],
"Origem privada autorizada deste dossier": [
"assets/proactive-investment-CPkgrUFY.js"
]
},
"assets": [
{
"file": "assets/project-dossier-DFH3NDYe.js",
"status": 200,
"sha256": "62f4e47f6efbb7916663604450ee427401080fad6f9332be2cd0dc017866b85a"
},
{
"file": "assets/project-dossier-document-CgBtS4qw.js",
"status": 200,
"sha256": "fb9aa7e305891719ae49cf8bbcee05b3114c05c8ee1df20238964fddb56721dd"
},
{
"file": "assets/catalogue-DRXXB4Y7.js",
"status": 200,
"sha256": "66a2ae7c819f1ac36ffd37e8456c3cfd2537c820845b20eddb4dd7bfaf4a32a2"
},
{
"file": "assets/services-CV6TWKfT.js",
"status": 200,
"sha256": "656da0adacd9141fcd9b1e82ab9959a62ea381a3815e183c5535801c95d92dff"
},
{
"file": "assets/simulation-form-zFZ4YNrB.js",
"status": 200,
"sha256": "338068b86cce1c3215ee71b1328a6cb2f754b903ed78ff1886f8554df506d2d6"
},
{
"file": "assets/proactive-investment-CPkgrUFY.js",
"status": 200,
"sha256": "288cd1005a05c82241a1ddd8c5bb446e297ead7b7605060cec80d268726522ac"
},
{
"file": "assets/opportunity-draft-Da2FBHoN.js",
"status": 200,
"sha256": "ba50f61a39693ebebbe30ba1937d45c92b80f81ab9a98418ef75662f893cdfb2"
},
{
"file": "assets/detail-BfSgTC5d.js",
"status": 200,
"sha256": "234657a2e5ebad7985d78ea49c5536c31e4aac9a143a02e7682d898e47cee530"
},
{
"file": "assets/show-CJYhqIE4.js",
"status": 200,
"sha256": "6579df14a154c98235330f550e13bee20e74f19517cc1d166ae26322f56c74f9"
}
],
"simulator_status": 200,
"served_component": "portal/services",
"public_catalogue_delta": {
"ideas": {
"status": 200,
"component": "investment/catalogue"
},
"needs": {
"status": 200,
"component": "investment/catalogue"
},
"exists": {
"status": 200,
"component": "investment/catalogue"
}
},
"private_operations": 0,
"QA_fixture_imports": 0,
"accepted_QA_proofs_reused": true,
"method": "Read-only served revision/manifest/compiled delta;no synthetic active records or publication"
},
"backup_restore_verified": true
}
},
"main": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"final_served_revision": "9fda6d6e12832a3cf25e7314f1f895dd430238c5",
"private_pilots_preserved_no_publication": true,
"fixtures_not_imported_into_active_database": true,
"QA_runtime_storage_outside_active_release": true,
"active_schema_migrations": 0,
"new_grants": false,
"SGF_TEMPO": "untouched",
"accepted_business_proofs": "reused;post-install checks limited to deltas;existing installer automated checks retained",
"prior_capacity_GiB": 91.60694122314453,
"second_delivery_retry": {
"initial_candidate": "56c0c6a7caa65a4cac54e17f9d455739f8eb6198",
"initial_candidate_activated": false,
"active_L8_preserved": true,
"reason": "One frontend test depended on ignored local outputs/proactive-investment-20261027/recovered-context.json",
"correction": "9fda6d6e12832a3cf25e7314f1f895dd430238c5 changes only the test and a minimal synthetic public API projection;no profile,pilot,credentials or live records",
"application_runtime_identical_to_56c0c6a7": true,
"directed_portability_test": "passed;one test;no skipped test",
"existing_installer_guards_retained": true
}
}
@@ -6924,3 +6924,50 @@ O relatório comum tinha um conflito de imports. Foram conservados ambos e as ch
Retomar na sessão local com SSH autenticado, usando a autorização já registada: medir espaço/inodes na partição efectiva, comparar com compilação e backup, conferir main e revisão activa, criar e ensaiar backup fresco, instalar L8 e conferir apenas o seu delta. Depois repetir as guardas necessárias para a candidata conjunta e conferir o delta proactivo preservando L8. Manter a versão activa até a nova estar pronta. Excluir fixtures QA dos inputs de instalação; não executar seeders/importações de amostras, não publicar pilotos privados nem usar o pacote QA como cópia da base activa. SGF TEMPO separado.
Recibo de preparação: `docs/investmoz/unification/sequential-delivery-preparation-20261027.json`. Provas e instrução de passagem: `outputs/sequential-delivery-20261027/`. Os recibos de execução e as duas revisões servidas serão registados apenas depois de execução real na sessão autenticada; este recibo não os substitui.
## 27/10/2026 — L8 e percurso proactivo instalados pela sequência autorizada
Entrega1: **L8 `c85e772d`**, anterior `f8d57bdd`. Entrega2, apenas após conferir a primeira: **percurso proactivo `9fda6d6e`**, incluindo `56c0c6a7` e preservando L8. As duas revisões foram conferidas no registo do instalador e no recurso público `/build/revision.json`, com hash do manifest e marcadores compilados dos deltas. `c85e772d` conserva o código aceite de `14360748`; o merge proactivo mantém ambos os fornecedores de linhas do relatório. A referência final servida passa a `9fda6d6e`.
A tentativa proactiva em `56c0c6a7` não foi activada: um teste dependia de um ficheiro de outputs existente apenas no QA local. L8 permaneceu em serviço. A correcção `9fda6d6e` torna esse teste portátil com um exemplar mínimo sintético da projecção pública da API, sem perfis, credenciais ou pilotos reais e sem escrita em outputs. O teste dirigido passou; o código da aplicação é byte a byte idêntico a `56c0c6a7`. Não se transportou a base QA nem se saltou a guarda do instalador. A nova tentativa usou o backup/restauro ainda fresco, com capacidade e fonte activa novamente conferidas.
A ligação SSH foi restabelecida pelo responsável na janela local, sem credenciais na conversa ou nos recibos. A medição inicial encontrou91,6GiB livres e inodes suficientes; a capacidade foi novamente conferida depois de cada backup. Instalador existente e suas guardas preservados; a versão anterior permaneceu activa até a nova release estar pronta. Os controlos automáticos do instalador foram mantidos, sem nova ronda manual das provas funcionais/económicas aceites.
**Backup/restauro fresco em cada etapa:** `/var/backups/investmoz-sequential-20261027/l8/backup` e `/var/backups/investmoz-sequential-20261027/proactive/backup`. Em cada uma, dump consistente e369ficheiros persistentes/configuração verificados; restauro das174tabelas num contentor sem rede, porta55441, com contagens/checksums iguais. Recibos `backup-receipt.json`, `restore-receipt.json`, `schema-permissions-before.json`, `schema-permissions-after.json`, `preservation-receipt.json` e `operational-delta-receipt.json` conservados nesses directórios. Hashes exactos no recibo consolidado.
**Preservação demonstrada:**172tabelas de negócio intactas em cada comparação; apenas cache/sessões operacionais reconciliados individualmente por identidade/timeouts e pedidos públicos de entrega. Schema, papéis, grants, permissões e originais persistentes conservados. Fontes instaladas comparadas aos commits:996ficheiros após L8 e1000após o proactivo. Sem migrations na base activa, importação de amostras QA, seeders ou publicação dos pilotos. O instalador manteve base e storage sintéticos isolados; o storage QA fica fora da árvore servida, e a release usa os mesmos `.env` e storage persistentes por ligação.
**Âmbito:** L8 continua parcial, com PEC e créditos de regra própria separados; os resultados continuam simulações. Songo permanece privado e pendente de respostas externas; Gurué continua hipótese agrícola privada. Disponibilização técnica não confirma clientes, procura, sustentabilidade ou publicação comercial. L3, ISPC, câmbio, L6/L7 e SGF TEMPO preservados.
Recibo consolidado: `docs/investmoz/unification/sequential-delivery-installed-20261027.json`. Provas locais: `outputs/l8-proactive-install-20261027/`. Os recibos históricos de preparação/suspensão mantêm-se como histórico e deixam de representar pendência de instalação destas duas candidatas.
Recibo remoto consolidado: `/var/backups/investmoz-sequential-20261027/installed-receipt.json`;SHA256 `62584b5abb50a05303a24379a0563e8dc147e25e682dc3566bb8edf015ba9d0b`. A fixture sintética portátil é apenas input de teste, sem importação na aplicação e sem dados dos pilotos.
## 27/10/2026 — avaliação de utilização pela equipa, sem Codex
**Estado:** roteiro preparado; execução real pela equipa e resultados ainda por observar. O recibo da instalação mantém `9fda6d6e` como referência entregue, incluindo L8 e o percurso proactivo. As provas técnicas aceites mantêm-se válidas. Este exercício avalia utilização e clareza; não constitui outra instalação, ronda de testes técnicos ou nova aprovação obrigatória da entrega.
### Exercício para a equipa
Usar a própria conta e o perfil operacional já autorizado no [portal](https://teste-investidor.tempo.co.mz/), pela interface normal. Escolher uma análise privada de trabalho sobre um tema real, com uma fonte já disponível e autorizada. Preservar Songo e Gurué, que aguardam informação comercial; não é necessário obter novas respostas externas para fazer este exercício. Não usar contas ou amostras QA na aplicação activa. O guia de botões existente em «Guia curto da equipa» pode ser consultado; registar essa consulta para distinguir clareza da interface de apoio documental.
1. **Preparar a análise.** Escolher sector e território existentes, identificar o assunto e guardar como preparação privada, usando apenas a informação conhecida.
2. **Registar evidências.** Identificar fonte/exemplar, trecho, período, abrangência e limitações. Separar facto documentado da interpretação. Associar um documento disponível quando aplicável; recuperar o original pelo gestor documental da ficha após o scan. A falta de resposta comercial permanece informação por confirmar.
3. **Estruturar a ideia.** Descrever a solução complementar, quem poderá beneficiar, quem poderá contratar/pagar, condições, recursos e próxima acção. Manter hipótese onde a procura não esteja demonstrada; montante, frequência e preço desconhecidos não passam a zero.
4. **Guardar e recuperar.** Sair da ficha e voltar a abri-la. Conferir que análise, evidências, documento associado e pendências são os que foram guardados, sem recorrer a scripts ou intervenção do Codex.
5. **Levar ao dossier.** Usar a continuação do investimento pela ficha. Escolher o dossier existente quando for o mesmo investimento; criar outro apenas para um investimento novo. Rever a prévia, conservar o título deliberado e confirmar. Reabrir o dossier e localizar a ideia, a origem e as pendências; o original continua acessível pelos recursos da ficha de origem, sem cópia automática para o dossier.
6. **Rever sem duplicar.** Actualizar uma pendência da própria análise com informação já conhecida e continuar o mesmo dossier. Conferir a nova versão após prévia/confirmação e a conservação da anterior. Guardar/confirmar não publica a análise, o anexo ou o dossier.
**O que observar:** se a pessoa encontra a próxima acção, compreende facto versus hipótese, consegue recuperar o que guardou e continuar o mesmo investimento sem ajuda do Codex. Anotar o que foi conseguido directamente, com o guia, com ajuda de outra pessoa, o que bloqueou e o que não foi tentado. Um impedimento concreto não obriga a repetir os passos já conseguidos; podem continuar os passos independentes.
### Devolução curta da avaliação
Registar por participante, sem enviar palavras-passe ou documentos privados nesta conversa: data e perfil utilizado; referências internas da análise e do dossier; passos conseguidos e tipo de apoio consultado; passo/campo onde surgiu dificuldade; mensagem exacta ou descrição do comportamento; resultado esperado. Distinguir acesso/perfil, linguagem/descoberta de acções, compreensão dos dados e perda ou erro de gravação/recuperação. Duração e sugestões são opcionais. Os identificadores só são partilhados no canal interno autorizado.
O coordenador devolve estes resultados pelo canal habitual da equipa. A avaliação só será marcada como observada depois dessa execução real; preparar o roteiro ou uma demonstração pelo Codex não a substitui. Nesta passagem não houve participante observado, análise criada no portal, alteração de conta/permissões, mensagem enviada à equipa ou publicação. As correcções seguintes serão delimitadas pelos obstáculos efectivamente relatados, sem reabrir provas aceites.
**Âmbitos preservados:** Songo e Gurué privados e pendentes de evidências comerciais. L8 permanece parcial; PEC e créditos com regras próprias continuam separados e não fazem parte deste exercício de utilização. O resultado técnico entregue não declara o IRPC completo nem valida comercialmente os pilotos.
Registo de preparação e resultados ainda em aberto: `docs/investmoz/unification/proactive-team-use-evaluation-20261027.json`. Não é um recibo de execução pela equipa.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
{
"fixture_notice": "Synthetic public projection of accepted API QA consumers;no profiles,real pilots,credentials,dossier or personal data. Test input only;never import into application data.",
"consumer_contexts": [
{
"prefill": {
"simulator": {
"context_applicability_snapshot": "{\"version\":1,\"consumer_opportunity\":\"opportunity:399\",\"opportunity_choices\":[{\"opportunity\":{\"key\":\"opportunity:399\",\"title\":\"SYNTHETIC QA — Cahora Bassa\",\"version\":2,\"analysis\":{\"proactive\":{\"need\":\"SYNTHETIC QA necessidade por verificar.\",\"basis\":\"Fixture pública sintética; não é evidência de procura local.\",\"group\":\"ideas\",\"stage\":\"Apoio — correspondência real por confirmar\",\"state\":\"hypothesis\",\"notice\":\"A ausência de registo não comprova ausência de oferta. Proximidade não comprova contrato, participação, energia acessível, terra disponível ou benefício fiscal. Necessidade confirmada não comprova viabilidade comercial; hipótese de fornecimento não é encomenda.\",\"version\":1,\"chain_id\":null,\"evidence\":[{\"id\":\"3587d2e4-7428-4cd7-994b-60607b20d7da\",\"scope\":\"Cahora Bassa — contexto piloto\",\"period\":\"Exercício2026 — cenário sintético\",\"source\":\"SYNTHETIC QA exemplar público fictício Cahora Bassa\",\"locator\":\"Fixture QA, linha1\",\"purpose\":\"local\",\"category\":\"infrastructure\",\"coverage\":\"Cobertura fictícia; informação real por confirmar\",\"statement\":\"SYNTHETIC QA: capacidade fictícia em Cahora Bassa; não é diagnóstico económico real.\",\"verified_on\":\"2026-10-27\"}],\"proposal\":\"SYNTHETIC QA solução em preparação.\",\"relations\":[],\"limitations\":\"Sem validação económica, contrato, terra ou energia garantidos.\",\"next_action\":\"Confirmar evidências reais antes de decidir.\",\"evidence_ids\":[\"3587d2e4-7428-4cd7-994b-60607b20d7da\"],\"economic_validation\":false,\"availability_confirmed\":false}}}}]}"
}
}
},
{
"prefill": {
"simulator": {
"context_applicability_snapshot": "{\"version\":1,\"consumer_opportunity\":\"opportunity:400\",\"opportunity_choices\":[{\"opportunity\":{\"key\":\"opportunity:400\",\"title\":\"SYNTHETIC QA — Gurué\",\"version\":2,\"analysis\":{\"proactive\":{\"need\":\"SYNTHETIC QA necessidade por verificar.\",\"basis\":\"Fixture pública sintética; não é evidência de procura local.\",\"group\":\"ideas\",\"stage\":\"Apoio — correspondência real por confirmar\",\"state\":\"hypothesis\",\"notice\":\"A ausência de registo não comprova ausência de oferta. Proximidade não comprova contrato, participação, energia acessível, terra disponível ou benefício fiscal. Necessidade confirmada não comprova viabilidade comercial; hipótese de fornecimento não é encomenda.\",\"version\":1,\"chain_id\":null,\"evidence\":[{\"id\":\"1421bb80-78c0-40c9-9de0-f45e18c5a093\",\"scope\":\"Gurué — contexto piloto\",\"period\":\"Exercício2026 — cenário sintético\",\"source\":\"SYNTHETIC QA exemplar público fictício Gurué\",\"locator\":\"Fixture QA, linha1\",\"purpose\":\"local\",\"category\":\"infrastructure\",\"coverage\":\"Cobertura fictícia; informação real por confirmar\",\"statement\":\"SYNTHETIC QA: capacidade fictícia em Gurué; não é diagnóstico económico real.\",\"verified_on\":\"2026-10-27\"}],\"proposal\":\"SYNTHETIC QA solução em preparação.\",\"relations\":[],\"limitations\":\"Sem validação económica, contrato, terra ou energia garantidos.\",\"next_action\":\"Confirmar evidências reais antes de decidir.\",\"evidence_ids\":[\"1421bb80-78c0-40c9-9de0-f45e18c5a093\"],\"economic_validation\":false,\"availability_confirmed\":false}}}}]}"
}
}
}
]
}
+1 -1
View File
@@ -6,7 +6,7 @@ test('absent proactivity is a no-op for accepted dossiers',()=>{assert.deepEqual
test('each idea retains origin,source,need,limits without summing or inventing economic values',()=>{const choices=[{opportunity:source(1,'A')},{opportunity:source(2,'B')}],d={context_applicability_snapshot:JSON.stringify({version:1,opportunity_choices:choices})},r=proactiveInvestmentRows(d);assert.equal(r.filter(x=>x[1]==='Origem da análise e ideia').length,2);assert.match(JSON.stringify(r),/opportunity:1/);assert.match(JSON.stringify(r),/opportunity:2/);assert.match(JSON.stringify(r),/Hipótese analítica/);assert.match(JSON.stringify(r),/não é zero/);assert.equal(d.context_applicability_snapshot,JSON.stringify({version:1,opportunity_choices:choices}));});
test('consumer selection only reports its idea even when other source contexts are present',()=>{const choices=[{opportunity:source(1,'A')},{opportunity:source(2,'B')}],r=proactiveInvestmentRows({context_opportunity:'opportunity:2',context_applicability_snapshot:JSON.stringify({version:1,opportunity_choices:choices})});assert.doesNotMatch(JSON.stringify(r),/opportunity:1/);assert.match(JSON.stringify(r),/opportunity:2/);});
test('explicit consumer snapshot is retained and repeat references do not duplicate report rows',()=>{const a=source(1,'A');let r=proactiveInvestmentRows({context_opportunity_snapshot:JSON.stringify({choice:{opportunity:a}})});assert.equal(r.filter(x=>x[1]==='Origem da análise e ideia').length,1);r=proactiveInvestmentRows({context_applicability_snapshot:JSON.stringify({version:1,opportunity_choices:[{opportunity:a},{opportunity:a}]})});assert.equal(r.filter(x=>x[1]==='Origem da análise e ideia').length,1);});
test('new API-recovered multi idea snapshot produces an independently scoped report',()=>{const d=JSON.parse(fs.readFileSync('outputs/proactive-investment-20261027/recovered-context.json','utf8'));const r=d.consumer_contexts.flatMap(c=>proactiveInvestmentRows(c.prefill.simulator));assert.equal(r.filter(x=>x[1]==='Origem da análise e ideia').length,2);assert.doesNotMatch(JSON.stringify(r),/PRIVATE-QA-/);fs.writeFileSync('outputs/proactive-investment-20261027/recovered-report-rows.json',JSON.stringify(r,null,2));});
test('portable API consumer snapshot produces an independently scoped report',()=>{const d=JSON.parse(fs.readFileSync(new URL('./fixtures/proactive-api-consumers.json',import.meta.url),'utf8'));const before=JSON.stringify(d);const perConsumer=d.consumer_contexts.map(c=>proactiveInvestmentRows(c.prefill.simulator));for(const rows of perConsumer)assert.equal(rows.filter(x=>x[1]==='Origem da análise e ideia').length,1);const r=perConsumer.flat();assert.equal(r.filter(x=>x[1]==='Origem da análise e ideia').length,2);assert.match(JSON.stringify(perConsumer[0]),/opportunity:399/);assert.doesNotMatch(JSON.stringify(perConsumer[0]),/opportunity:400/);assert.match(JSON.stringify(perConsumer[1]),/opportunity:400/);assert.doesNotMatch(JSON.stringify(perConsumer[1]),/opportunity:399/);assert.doesNotMatch(JSON.stringify(r),/PRIVATE-QA-/);assert.equal(JSON.stringify(d),before);});
test('resources,assumptions and selected relationships are retained in the existing dossier report',()=>{const a=source(7,'A');Object.assign(a.analysis.proactive,{resources:'QA recurso declarado',assumptions:'QA pressuposto explícito',conditions:'QA condição',relations:[{kind:'project',target_id:'QA-reference',label:'QA projecto existente',relationship:'hypothesis',basis:'QA fundamento público'}]});const draft={context_applicability_snapshot:JSON.stringify({version:1,opportunity_choices:[{opportunity:a}]})},rows=buildProjectDossierRows(draft);assert.match(JSON.stringify(rows),/QA pressuposto explícito/);assert.match(JSON.stringify(rows),/QA projecto existente/);assert.match(JSON.stringify(rows),/sem contrato, acesso ou participação presumidos/);});