From 042ffbde44cac27704d6f8b7ec25b525a42e3575 Mon Sep 17 00:00:00 2001 From: nala Date: Thu, 22 Oct 2026 10:14:46 +0200 Subject: [PATCH] Preserve legacy draft shape when no compatible context is inherited --- docs/investmoz/unification/traceability-and-manual.md | 7 +++++++ resources/js/lib/context-inheritance.ts | 2 ++ tests/frontend/context-inheritance.test.mjs | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 6803f14c..494ca7f1 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -2129,3 +2129,10 @@ O original v3 conserva exactamente os bytes/hash anteriores; a cópia está expl **Dependências para integração após a avaliação da Tempo:** ancestralidade confirmada `57fc9148 → a76369eb → 52fbb146 → a1fbda06`. `a76369eb` fornece a continuidade comum do contexto/edições e é dependência funcional de `a1fbda06`; pode ser integrado independentemente. `52fbb146` é a preparação documental intermédia, sem código executável. A branch `codex/private-investment-path-executable-QA` inclui essa ancestralidade e a presente prova documental; não aplicar apenas o diff de `a1fbda06` num destino sem a continuidade ou alteração equivalente. Se a76369eb já tiver sido integrado, o merge normal reconhece a ancestralidade e não o reaplica como um segundo desenvolvimento. Procedimento: após a decisão, recuperar o main actual, rever a comparação e fazer integração Git que preserve as alterações concorrentes; resolver apenas conflitos efectivos, sem reset/force-push de main. A leitura desta continuação encontrou main em `57fc914821d0cefa02caa80a74b3d42e663f2742`; é fotografia do estado, não autorização para ignorar commits posteriores. Conferir a revisão servida e só o delta no destino. A habilitação `PRIVATE_INVESTMENT_PREPARATION_ENABLED` é configuração distinta; não publica nem activa regras fiscais. Nesta execução a branch permanece separada, sem integração/habilitação na homologação. Limitações sectoriais/fiscais explícitas mantêm âmbito próprio e não bloqueiam este recorte concluído. + + +### Integração autorizada do percurso adaptativo — 22/10/2026 + +A Tempo autorizou a implementação após o fecho do recorte. Main remoto foi actualizado por avanço directo de `57fc9148` para `064296e1`, preservando a sequência `a76369eb → 52fbb146 → a1fbda06 → 064296e1`; não havia alteração concorrente ou conflito no momento do envio. A cadeia automática recusou a primeira tentativa no teste frontend «server draft snapshots split private identity from economic values»: 188/189 passaram. A versão servida anterior `57fc9148` foi conservada, conforme o mecanismo de recuperação; não se contornou a verificação. + +Causa concreta: o adaptador de continuidade acrescentava `compatible_fields_snapshot` vazio na recuperação de um rascunho legado sem nenhuma origem compatível. Correcção delimitada na branch `codex/adaptive-delivery-compatibility-QA`: devolver o rascunho original quando não há origem compatível nem metadados de herança anteriores. A herança com origem/metadados continua executada, preservando edições e limites por dossier. Nove controlos dirigidos da herança e o teste exacto da partição/recuperação passaram; não se reabriram os cálculos, relatórios ou cenários aceites. A correcção deve seguir o mesmo processo automático; não altera regras fiscais, esquema ou dados activos. Recibos da tentativa e da disponibilização final em `outputs/investmoz-adaptive-path-delivery-20261022`. diff --git a/resources/js/lib/context-inheritance.ts b/resources/js/lib/context-inheritance.ts index 897d245d..6a93ed5c 100644 --- a/resources/js/lib/context-inheritance.ts +++ b/resources/js/lib/context-inheritance.ts @@ -57,6 +57,8 @@ export function inheritSimulatorFields>(draft:T if(/^\d{4}-\d{2}-\d{2}$/.test(start)) source.monthly_iva_start=start.slice(0,7); else if(/^\d{4}$/.test(String(draft.fiscal_period)) && draft.fiscal_periodicity==='monthly' && /^(0?[1-9]|1[0-2])$/.test(String(draft.fiscal_month))) source.monthly_iva_start=`${draft.fiscal_period}-${String(draft.fiscal_month).padStart(2,'0')}`; if(!settingsValid) delete source.monthly_iva_start; + // Legacy drafts without a compatible source need no inheritance marker or autosave churn. + if (!Object.keys(source).length && !draft.compatible_fields_snapshot) return draft; const values={...draft,monthly_iva_start:settings.start ?? ''}; const patch=inheritCompatibleFields('simulator-compatible-fields',values,source,draft.compatible_fields_snapshot); const next:Record={...draft,...patch.patch,compatible_fields_snapshot:patch.metadata}; diff --git a/tests/frontend/context-inheritance.test.mjs b/tests/frontend/context-inheritance.test.mjs index 1371a773..41259c8f 100644 --- a/tests/frontend/context-inheritance.test.mjs +++ b/tests/frontend/context-inheritance.test.mjs @@ -1,5 +1,11 @@ import { createProjectDossierReport } from '../../resources/js/lib/project-dossier-report.ts'; import assert from 'node:assert/strict'; + +test('legacy draft without a compatible source keeps its shape and identity',()=>{ + const legacy={activity_id:'legacy-activity',infrastructure_needs:['energia']}; + assert.equal(inheritSimulatorFields(legacy),legacy); + assert.equal(Object.hasOwn(inheritSimulatorFields(legacy),'compatible_fields_snapshot'),false); +}); import test from 'node:test'; import { inheritCompatibleFields, inheritSimulatorFields } from '../../resources/js/lib/context-inheritance.ts'; import { serializeBusinessPlanSnapshot } from '../../resources/js/lib/business-financial-plan.ts';