From a76369eb865b0335cef065bcfbb88aac3794a18f Mon Sep 17 00:00:00 2001 From: nala Date: Thu, 22 Oct 2026 09:16:15 +0200 Subject: [PATCH] Preserve dossier context and expose contextual applicability in QA --- .../InvestmentSubmissionController.php | 5 +- .../StoreLandAssistanceCaseRequest.php | 3 +- .../StoreSimulationFormDraftRequest.php | 10 +- app/Services/InvestorContext.php | 84 +++++++++++--- app/Services/VirtualDesk.php | 9 +- ...-review-continuation-20261020-receipt.json | 35 ++++++ .../unification/traceability-and-manual.md | 23 ++++ .../v2/auditoria-portal/matriz-requisitos.csv | 28 ++--- resources/js/components/dossier-prefill.tsx | 85 +++++---------- .../investment-context-assessment.tsx | 24 ++++ .../components/simulation-business-plan.tsx | 7 +- resources/js/components/simulation-form.tsx | 9 +- .../js/components/simulation-monthly-iva.tsx | 5 +- .../components/simulation-published-iva.tsx | 19 +++- resources/js/lib/context-inheritance.ts | 66 +++++++++++ resources/js/lib/investor-context.ts | 15 +++ resources/js/lib/monthly-iva.ts | 1 + resources/js/lib/project-dossier-report.ts | 13 +++ resources/js/lib/simulation-form.ts | 3 +- resources/js/pages/desk/request.tsx | 1 + resources/js/pages/investor-path/context.tsx | 30 ++++- .../InvestmentContextContinuityTest.php | 103 ++++++++++++++++++ tests/frontend/context-inheritance.test.mjs | 63 +++++++++++ 23 files changed, 530 insertions(+), 111 deletions(-) create mode 100644 resources/js/components/investment-context-assessment.tsx create mode 100644 resources/js/lib/context-inheritance.ts create mode 100644 tests/Feature/InvestmentContextContinuityTest.php create mode 100644 tests/frontend/context-inheritance.test.mjs diff --git a/app/Http/Controllers/InvestmentSubmissionController.php b/app/Http/Controllers/InvestmentSubmissionController.php index 1c70004b..791a74d3 100644 --- a/app/Http/Controllers/InvestmentSubmissionController.php +++ b/app/Http/Controllers/InvestmentSubmissionController.php @@ -170,8 +170,10 @@ class InvestmentSubmissionController extends Controller // Binding does not save form edits or assert that the context has been reviewed. $this->event($row, $request, 'context_bound'); $desk->event($desk->case($request->user(), $case->id), $request->user(), 'manifestation_context_bound', ['submission_id' => $id, 'previous_case_version' => (int) $case->version]); + return ['case_id' => $case->id, 'version' => $row->version, 'case_version' => (int) $case->version + 1, 'replayed' => false]; }, 3); + return response()->json($result); } @@ -190,11 +192,12 @@ class InvestmentSubmissionController extends Controller { $required = $submitting ? 'required' : 'nullable'; $data = $request->validate(['version' => ['required', 'integer', 'min:1'], - 'payload' => ['required', 'array:full_name,email,phone,country,residence_country_code,incorporation_country_code,organization_country_snapshot,declared_origin_country_code,organisation,representative_role,experience,investment_capacity,profile_id,sector,objective,participation_id,partnership_id,estimated_amount,currency,horizon,location,cluster_ids,corridor_ids,project_ids,contact_consent,other_details'], + 'payload' => ['required', 'array:context_reuse,full_name,email,phone,country,residence_country_code,incorporation_country_code,organization_country_snapshot,declared_origin_country_code,organisation,representative_role,experience,investment_capacity,profile_id,sector,objective,participation_id,partnership_id,estimated_amount,currency,horizon,location,cluster_ids,corridor_ids,project_ids,contact_consent,other_details'], 'payload.organization_country_snapshot' => ['sometimes', 'array', 'max:10'], 'payload.residence_country_code' => ['nullable', 'string', app(CountryCatalogue::class)->rule()], 'payload.incorporation_country_code' => ['nullable', 'string', app(CountryCatalogue::class)->rule()], 'payload.declared_origin_country_code' => ['nullable', 'string', app(CountryCatalogue::class)->rule()], + 'payload.context_reuse' => ['nullable', 'string', 'max:10000'], 'payload.other_details' => ['nullable', 'string', 'max:5000'], 'payload.full_name' => [$required, 'string', ...($submitting ? ['min:3'] : []), 'max:150'], 'payload.email' => [$required, $submitting ? 'email:rfc' : 'string', 'max:150'], 'payload.phone' => ['nullable', 'string', 'max:30'], 'payload.country' => [$submitting ? 'required_without:payload.declared_origin_country_code' : 'nullable', 'nullable', 'string', 'max:100'], diff --git a/app/Http/Requests/StoreLandAssistanceCaseRequest.php b/app/Http/Requests/StoreLandAssistanceCaseRequest.php index 6304be18..9266b885 100644 --- a/app/Http/Requests/StoreLandAssistanceCaseRequest.php +++ b/app/Http/Requests/StoreLandAssistanceCaseRequest.php @@ -33,7 +33,8 @@ class StoreLandAssistanceCaseRequest extends FormRequest return [ 'version' => [$this->isMethod('post') && ! $this->routeIs('land-assistance.support') ? 'nullable' : 'required', 'integer', 'min:1'], 'context_revision' => ['nullable', 'integer', 'min:0'], 'context_reviewed' => ['nullable', 'boolean'], - 'payload' => ['required', 'array:support_kind,request_description,project_reference,investor_path_case_id,applicant_category,full_name,contact_person,email,phone,preferred_contact,country,declared_origin_country_code,nationality,representative_name,representative_role,representation_basis,nuit,constitution_or_residency_note,area_status,parcels,purpose,activity,known_occupants,occupant_description,known_improvements,improvements_description,prior_right_status,prior_right_description,conflict_status,conflict_description,official_process,attachments_to_follow,exploration_plan,consultation,additional_information,truth_declaration,contact_consent'], + 'payload' => ['required', 'array:context_reuse,support_kind,request_description,project_reference,investor_path_case_id,applicant_category,full_name,contact_person,email,phone,preferred_contact,country,declared_origin_country_code,nationality,representative_name,representative_role,representation_basis,nuit,constitution_or_residency_note,area_status,parcels,purpose,activity,known_occupants,occupant_description,known_improvements,improvements_description,prior_right_status,prior_right_description,conflict_status,conflict_description,official_process,attachments_to_follow,exploration_plan,consultation,additional_information,truth_declaration,contact_consent'], + 'payload.context_reuse' => ['nullable', 'string', 'max:10000'], 'payload.support_kind' => ['nullable', 'in:investment,home,family_exploitation,recognition,regularization,delimitation,change_of_use,transfer,existing_process,conflict_guidance,other'], 'payload.request_description' => ['nullable', 'string', 'max:4000'], 'payload.project_reference' => ['nullable', 'string', 'max:160'], diff --git a/app/Http/Requests/StoreSimulationFormDraftRequest.php b/app/Http/Requests/StoreSimulationFormDraftRequest.php index 27b2e957..b92a2385 100644 --- a/app/Http/Requests/StoreSimulationFormDraftRequest.php +++ b/app/Http/Requests/StoreSimulationFormDraftRequest.php @@ -37,7 +37,7 @@ class StoreSimulationFormDraftRequest extends FormRequest 'contact_province', 'contact_district', 'preferred_channel', ]; $economic = [ - 'monthly_iva_settings', 'monthly_iva_snapshot', 'journey_type', 'detail_level', 'business_plan_snapshot', 'financial_tools_snapshot', 'cashflow_snapshot', 'project_team_snapshot', 'project_execution_snapshot', 'purpose', 'manifestation_type', 'preferred_language', 'project_title', 'project_summary', 'project_problem', 'target_customers', 'value_proposition', 'market_assumption', 'market_source', 'project_milestones', 'selection_labels', 'project_type', + 'context_applicability_snapshot', 'investment_regime', 'context_reuse', 'compatible_fields_snapshot', 'published_iva_base', 'published_iva_currency', 'published_iva_date', 'published_iva_scope', 'monthly_iva_settings', 'monthly_iva_snapshot', 'journey_type', 'detail_level', 'business_plan_snapshot', 'financial_tools_snapshot', 'cashflow_snapshot', 'project_team_snapshot', 'project_execution_snapshot', 'purpose', 'manifestation_type', 'preferred_language', 'project_title', 'project_summary', 'project_problem', 'target_customers', 'value_proposition', 'market_assumption', 'market_source', 'project_milestones', 'selection_labels', 'project_type', 'competitor_assumption', 'sales_channel_assumption', 'marketing_approach', 'location_rationale', 'project_risk_responses_snapshot', 'project_questionnaire_version', 'customer_validation_status', 'cost_estimate_status', 'location_assessment_status', 'funding_status', 'receivables_timing_status', 'project_type_other', 'sector_id', 'activity_id', 'products_services', 'maturity_stage', 'expected_start_date', @@ -72,6 +72,14 @@ class StoreSimulationFormDraftRequest extends FormRequest 'economic_snapshot.business_plan_snapshot' => ['nullable', 'string', 'max:60000'], 'economic_snapshot.financial_tools_snapshot' => ['nullable', 'string', 'max:30000'], 'economic_snapshot.cashflow_snapshot' => ['nullable', 'string', 'max:20000'], + 'economic_snapshot.context_applicability_snapshot' => ['nullable', 'string', 'max:20000'], + 'economic_snapshot.investment_regime' => ['nullable', 'in:general,industrial_park,zee,zfi'], + 'economic_snapshot.context_reuse' => ['nullable', 'string', 'max:10000'], + 'economic_snapshot.compatible_fields_snapshot' => ['nullable', 'string', 'max:10000'], + 'economic_snapshot.published_iva_base' => ['nullable', 'string', 'max:40'], + 'economic_snapshot.published_iva_currency' => ['nullable', 'string', 'max:3'], + 'economic_snapshot.published_iva_date' => ['nullable', 'string', 'max:10'], + 'economic_snapshot.published_iva_scope' => ['nullable', 'string', 'in:yes,no'], 'economic_snapshot.monthly_iva_settings' => ['nullable', 'string', 'max:2000'], 'economic_snapshot.monthly_iva_snapshot' => ['nullable', 'string', 'max:60000'], 'economic_snapshot.project_team_snapshot' => ['nullable', 'string', 'max:30000'], diff --git a/app/Services/InvestorContext.php b/app/Services/InvestorContext.php index 059a5e5e..08ea0b51 100644 --- a/app/Services/InvestorContext.php +++ b/app/Services/InvestorContext.php @@ -5,6 +5,7 @@ namespace App\Services; use App\Models\ExistingBusiness; use App\Models\Opportunity; use App\Models\Sector; +use App\Models\SimulationFormDraft; use App\Models\User; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Support\Arr; @@ -21,7 +22,7 @@ final class InvestorContext public const SOURCE = 'investor-context'; - public const FIELDS = ['project_title', 'project_summary', 'sector_id', 'sector', 'province_id', 'district_id', 'admin_post_id', 'locality_id', 'province', 'district', 'location']; + public const FIELDS = ['project_title', 'project_summary', 'sector_id', 'sector', 'province_id', 'district_id', 'admin_post_id', 'locality_id', 'province', 'district', 'location', 'currency', 'expected_start_date', 'fiscal_period', 'fiscal_periodicity', 'fiscal_month', 'investor_origin', 'person_type', 'entity_stage', 'tax_residency_country', 'fiscal_residency_country', 'activity_id', 'project_type', 'maturity_stage', 'special_zone_id', 'investment_regime']; public function __construct(private readonly VirtualDesk $desk) {} @@ -34,8 +35,26 @@ final class InvestorContext { $payload = $this->desk->decode($case->payload); - return $payload['investor_path']['context'] ?? ['revision' => 0, 'selection' => [], + $context = $payload['investor_path']['context'] ?? ['revision' => 0, 'selection' => [], 'fields' => ['project_title' => $case->title], 'provenance' => ['project_title' => ['kind' => 'dossier', 'id' => $case->id, 'version' => $case->version]], 'review_steps' => []]; + // Explicit dossier anchor only: never the account's most recent simulation or another owner's draft. + if (($case->simulation_id ?? null) && request()->user()?->id === (int) $case->user_id) { + $draft = SimulationFormDraft::whereKey($case->simulation_id)->where('owner_user_id', $case->user_id)->whereNull('deleted_at')->first(); + if ($draft) { + $values = [...SimulationFormDraft::decryptSnapshot($draft->personal_snapshot), ...SimulationFormDraft::decryptSnapshot($draft->economic_snapshot)]; + foreach (Arr::only($values, self::FIELDS) as $key => $value) { + if (is_scalar($value) && (string) $value !== '' && (! array_key_exists($key, $context['fields']) || ($context['provenance'][$key]['kind'] ?? null) === 'linked_simulation')) { + $context['fields'][$key] = (string) $value; + $context['provenance'][$key] = ['kind' => 'linked_simulation', 'id' => $draft->id, 'version' => $draft->version_no, 'sha256' => $draft->snapshot_sha256]; + } + } + } + } + $zone = $context['selection']['park'] ?? null; + $context['fields']['investment_regime'] = $zone['fields']['investment_regime'] ?? 'general'; + $context['fields']['special_zone_id'] = $zone['id'] ?? ''; + + return $context; } public function dependencyHash(array $selection): string @@ -53,17 +72,20 @@ final class InvestorContext $documents = []; $visibility = 'public'; $state = null; + $zoneAnalysis = null; if ($kind === 'opportunity') { abort_unless(ctype_digit($id), 422, 'Identificador de oportunidade inválido.'); $o = Opportunity::with('sector')->findOrFail((int) $id); $published = Opportunity::published()->whereKey($o->id)->exists(); - if (!$published) { + if (! $published) { abort_unless(request()->user() && $o->status !== 'archived' && app(PortalProfileAccess::class)->canView(request()->user(), $o), 404, 'Ficha privada indisponível neste âmbito.'); $visibility = 'private'; $state = app(PortalProfileAccess::class)->state($o); } - if (request()->user()) $documents = app(OpportunityLibrarySupport::class)->snapshot(request()->user(), $o); - $draft = !$published ? app(OpportunityManagement::class)->values($o) : []; + if (request()->user()) { + $documents = app(OpportunityLibrarySupport::class)->snapshot(request()->user(), $o); + } + $draft = ! $published ? app(OpportunityManagement::class)->values($o) : []; $title = $draft['canonical']['official_title'] ?? $o->title; $href = $published ? '/oportunidades/'.$o->slug : '/minhas-oportunidades/'.$o->id.'/view'; $version = $o->management_version; @@ -122,19 +144,28 @@ final class InvestorContext $fields = $this->territoryFields($id); } elseif ($kind === 'park') { abort_unless(Str::isUuid($id), 422); - $p = app(InvestmentZones::class)->visible()->where('category', 'industrial_park')->findOrFail($id); + $p = app(InvestmentZones::class)->visible()->whereIn('category', ['industrial_park', 'zee', 'zfi'])->findOrFail($id); $title = $p->name; + $fields = ['special_zone_id' => (string) $p->id, 'investment_regime' => (string) $p->category]; $version = $p->version_no; + $zoneAnalysis = ['conditions' => app(InvestmentZoneOperationalDetails::class)->publicData($p)['conditions'] ?? [], + 'source' => $p->legal_source_id ? DB::table('investment_legal_sources')->where('id', $p->legal_source_id)->first(['title', 'url', 'diploma', 'article', 'valid_from', 'valid_until']) : null, + 'recognition' => 'undetermined', 'executable_benefit' => false]; $href = '/zonas/'.$id; if ($p->primary_territory_id) { - $fields = $this->territoryFields($p->primary_territory_id); + $fields = [...$fields, ...$this->territoryFields($p->primary_territory_id)]; } } else { abort(422, 'Tipo de referência inválido.'); } $fields = array_filter($fields, fn ($v) => is_scalar($v) && trim((string) $v) !== ''); $record = ['key' => $key, 'kind' => $kind, 'id' => $id, 'title' => $title, 'version' => $version, 'href' => $href, 'fields' => $fields]; - if ($documents || $visibility === 'private') $record += ['documents' => $documents, 'visibility' => $visibility, 'state' => $state]; + if ($zoneAnalysis !== null) { + $record['analysis'] = $zoneAnalysis; + } + if ($documents || $visibility === 'private') { + $record += ['documents' => $documents, 'visibility' => $visibility, 'state' => $state]; + } return [...$record, 'sha256' => hash('sha256', json_encode($record, JSON_THROW_ON_ERROR))]; } @@ -170,7 +201,11 @@ final class InvestorContext } if (request()->user()) { $private = app(PortalProfileAccess::class)->scope(Opportunity::query(), request()->user())->where('status', '!=', 'published')->where('status', '!=', 'archived')->when($query, fn ($q) => $q->where('title', 'ilike', '%'.$query.'%'))->orderBy('title')->limit(51)->get(); - foreach ($private as $o) if (app(PortalProfileAccess::class)->canView(request()->user(), $o)) $items[] = ['key' => 'opportunity:'.$o->id, 'title' => $o->title.' — preparação privada', 'kind' => 'opportunity']; + foreach ($private as $o) { + if (app(PortalProfileAccess::class)->canView(request()->user(), $o)) { + $items[] = ['key' => 'opportunity:'.$o->id, 'title' => $o->title.' — preparação privada', 'kind' => 'opportunity']; + } + } } if (config('existing-business.enabled')) { foreach (ExistingBusiness::published()->when($query, fn ($q) => $q->where('public_title', 'ilike', '%'.$query.'%'))->orderBy('public_title')->limit(51)->get(['id', 'public_title']) as $o) { @@ -179,7 +214,7 @@ final class InvestorContext } return ['opportunities' => $items, 'search_limited' => count($items) > 50, 'sectors' => Sector::choices()->orderBy('name')->get(['id', 'name', 'slug']), - 'parks' => app(InvestmentZones::class)->visible()->where('category', 'industrial_park')->orderBy('name')->get(['id', 'name', 'version_no'])]; + 'parks' => app(InvestmentZones::class)->visible()->whereIn('category', ['industrial_park', 'zee', 'zfi'])->orderBy('name')->get(['id', 'name', 'category', 'version_no'])]; } public function current(User $actor): array @@ -235,7 +270,8 @@ final class InvestorContext abort_if(array_diff(array_keys($input), ['version', 'selection', 'declarations', 'replace_fields', 'preview_hash', 'operation_key', 'confirm', '_token']), 422, 'Campo de controlo desconhecido.'); return Validator::make($input, ['version' => 'required|integer|min:1', 'selection' => 'present|array:opportunity,sector,territory,park', - 'selection.*' => 'nullable|string|max:100', 'declarations' => 'nullable|array:project_title,project_summary', 'declarations.project_title' => 'nullable|string|max:200', 'declarations.project_summary' => 'nullable|string|max:5000', + 'selection.*' => 'nullable|string|max:100', 'declarations' => 'nullable|array:project_title,project_summary,currency,expected_start_date,investor_origin,person_type,entity_stage,tax_residency_country,fiscal_residency_country,project_type,maturity_stage', 'declarations.project_title' => 'nullable|string|max:200', 'declarations.project_summary' => 'nullable|string|max:5000', + 'declarations.currency' => 'nullable|regex:/^[A-Z]{3}$/', 'declarations.expected_start_date' => 'nullable|date_format:Y-m-d', 'declarations.investor_origin' => 'nullable|in:national,foreign,mixed', 'declarations.person_type' => 'nullable|in:singular,collective,sole_trader,consortium', 'declarations.entity_stage' => 'nullable|in:existing,being_formed', 'declarations.tax_residency_country' => ['nullable', 'string', app(CountryCatalogue::class)->rule()], 'declarations.fiscal_residency_country' => ['nullable', 'string', app(CountryCatalogue::class)->rule()], 'declarations.project_type' => 'nullable|string|max:100', 'declarations.maturity_stage' => 'nullable|string|max:100', 'replace_fields' => 'nullable|array', 'replace_fields.*' => 'string|in:'.implode(',', self::FIELDS)])->validate(); } @@ -299,7 +335,7 @@ final class InvestorContext } // Remove inherited subordinate geography only when its source was actually replaced. foreach ($fields as $key => $value) { - if (! array_key_exists($key, $proposed) && in_array($key, ['province_id', 'district_id', 'admin_post_id', 'locality_id', 'province', 'district', 'location', 'sector_id', 'sector'], true) && isset($provenance[$key]['key'])) { + if (! array_key_exists($key, $proposed) && in_array($key, ['province_id', 'district_id', 'admin_post_id', 'locality_id', 'province', 'district', 'location', 'sector_id', 'sector', 'special_zone_id', 'investment_regime'], true) && isset($provenance[$key]['key'])) { unset($fields[$key],$provenance[$key]); } } @@ -314,11 +350,16 @@ final class InvestorContext $changed[] = $slot; } } - $dependencyChanged = $this->dependencyHash($old['selection']) !== $this->dependencyHash($selection); + $changedFields = array_column($replaced, 'field'); + $conditionsChanged = (bool) array_intersect($changedFields, array_diff(self::FIELDS, ['project_title', 'project_summary'])); + $dependencyChanged = $this->dependencyHash($old['selection']) !== $this->dependencyHash($selection) || $conditionsChanged; $payload = $this->desk->decode($case->payload); $results = $payload['investor_path']['results'] ?? []; $requests = DB::table('desk_requests')->where('case_id', $id)->orderBy('id')->get(['id', 'status', 'protocol', 'version'])->all(); $steps = $dependencyChanged ? array_values(array_unique([...(array_intersect($changed, ['opportunity', 'sector']) ? ['S02', 'S03', 'S04', 'S08', 'S12', 'S13', 'S14', 'S15', 'S17'] : []), ...(array_intersect($changed, ['territory', 'park']) ? ['S08', 'S09', 'S10', 'S11', 'S17'] : [])])) : []; + if ($conditionsChanged) { + $steps = array_values(array_unique([...$steps, 'S02', 'S03', 'S08', 'S12', 'S13', 'S17'])); + } $plan = ['case_id' => $id, 'version' => (int) $case->version, 'revision' => (int) $old['revision'], 'selection' => $selection, 'fields' => $fields, 'provenance' => $provenance, 'updated' => $replaced, 'maintained' => $kept, 'changed_dimensions' => $changed, 'dependent_results' => (int) $case->user_id === $actor->id && $dependencyChanged ? array_map(fn ($r) => ['id' => $r['id'], 'engine' => $r['engine']], $results) : [], 'requests' => $requests, 'review_steps' => $steps, 'dependency_changed' => $dependencyChanged, 'documents_preserved' => DB::table('desk_documents')->where('case_id', $id)->count(), @@ -362,7 +403,7 @@ final class InvestorContext $review[$step] = ['revision' => $revision, 'reason' => 'O contexto mudou; reveja os pressupostos e a evidência aplicável.']; } $context = ['revision' => $revision, 'selection' => $plan['selection'], 'fields' => $plan['fields'], 'provenance' => $plan['provenance'], 'review_steps' => $review, - 'dependency_hash' => $this->dependencyHash($plan['selection']), 'updated_at' => now()->toIso8601String(), 'updated_by' => $actor->id]; + 'dependency_hash' => $this->dependencyHash(['selection' => $plan['selection'], 'fields' => Arr::except($plan['fields'], ['project_title', 'project_summary'])]), 'updated_at' => now()->toIso8601String(), 'updated_by' => $actor->id]; if ($plan['dependency_changed']) { foreach ($payload['investor_path']['results'] ?? [] as $i => $r) { $payload['investor_path']['results'][$i] = [...$r, 'context_state' => 'review_required', 'context_invalidated_revision' => $revision, 'context_invalidated_at' => now()->toIso8601String()]; @@ -384,6 +425,8 @@ final class InvestorContext abort_unless($this->desk->owns($actor, $case, false) || $actor->can('manage-portal'), 403); $ctx = $this->state($case); $path = app(InvestorPath::class)->view($actor, $id); + $ctx['path_applicability'] = ['definition_id' => $path['definition_id'], 'definition_version' => $path['definition_version'], 'source_sha256' => $path['source_sha256'], + 'steps' => array_values(array_map(fn ($step) => Arr::only($step, ['code', 'title', 'applicability', 'reason', 'state', 'context_review_required']), array_filter($path['steps'], fn ($step) => ! empty($step['branch']))))]; $simulatorRevision = null; if ((int) $case->user_id === $actor->id && $case->simulation_id) { @@ -404,10 +447,19 @@ final class InvestorContext public function prefill(array $ctx): array { $f = $ctx['fields']; - $sim = Arr::only($f, ['project_title', 'project_summary', 'sector_id', 'province_id', 'district_id', 'admin_post_id', 'locality_id']); + $sim = Arr::except(Arr::only($f, self::FIELDS), ['sector', 'province', 'district', 'location']); + $zone = $ctx['selection']['park'] ?? null; + $sim['context_applicability_snapshot'] = json_encode([ + 'version' => 1, 'context_revision' => $ctx['revision'], + 'zone' => $zone ? Arr::only($zone, ['id', 'title', 'href', 'version', 'sha256', 'fields', 'analysis']) : null, + 'provenance' => $ctx['provenance'], + 'path' => $ctx['path_applicability'] ?? null, + 'fields' => Arr::only($f, ['investor_origin', 'tax_residency_country', 'entity_stage', 'currency', 'expected_start_date', 'investment_regime']), + 'notice' => 'Referências e declarações para preparação; sem reconhecimento automático de elegibilidade ou benefício.', + ], JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE); return ['simulator' => $sim, 'land' => array_filter(['project_reference' => $f['project_title'] ?? null, 'activity' => $f['sector'] ?? null, 'purpose' => $f['project_summary'] ?? null, 'parcels' => [Arr::only($f, array_keys(InvestmentGeography::FIELDS))]], fn ($v) => $v !== null), 'desk' => array_filter(['title' => $f['project_title'] ?? null, 'territory_id' => $f['locality_id'] ?? $f['admin_post_id'] ?? $f['district_id'] ?? $f['province_id'] ?? null, 'location_source' => isset($f['province_id']) ? 'Referência consultada no contexto v'.($ctx['revision'] ?? 0).': '.($f['location'] ?? 'território identificado').'. Não confirma disponibilidade.' : null, 'description' => $f['project_summary'] ?? null, 'sector' => $f['sector'] ?? null, ...Arr::only($f, array_keys(InvestmentGeography::FIELDS))], fn ($v) => $v !== null), - 'submission' => array_filter(['sector' => $f['sector'] ?? null, 'objective' => $f['project_summary'] ?? null, 'location' => $f['location'] ?? null], fn ($v) => $v !== null)]; + 'submission' => array_filter(['currency' => $f['currency'] ?? null, 'sector' => $f['sector'] ?? null, 'objective' => $f['project_summary'] ?? null, 'location' => $f['location'] ?? null], fn ($v) => $v !== null)]; } } diff --git a/app/Services/VirtualDesk.php b/app/Services/VirtualDesk.php index aeeb6498..6f12ab8b 100644 --- a/app/Services/VirtualDesk.php +++ b/app/Services/VirtualDesk.php @@ -250,7 +250,8 @@ class VirtualDesk * @return array */ public function validateFields(array $payload, array $definition, bool $submitting): array { - $rules = ['payload' => ['required', 'array:'.implode(',', [...array_keys($definition['fields']), 'country', 'declared_origin_country_code'])], + $rules = ['payload' => ['required', 'array:'.implode(',', [...array_keys($definition['fields']), 'country', 'declared_origin_country_code', 'context_reuse'])], + 'payload.context_reuse' => ['nullable', 'string', 'max:10000'], 'payload.country' => ['nullable', 'string', 'max:100', app(CountryCatalogue::class)->legacyCountryRule()], 'payload.declared_origin_country_code' => ['nullable', 'string', app(CountryCatalogue::class)->rule()]]; foreach ($definition['fields'] as $key => $field) { @@ -388,7 +389,7 @@ class VirtualDesk abort_if($this->owns($actor, $case, false), 403, 'O proponente não pode analisar ou decidir o seu próprio pedido.'); abort_unless($actor->can('manage-portal') || (int) $request->analyst_id === $actor->id, 403); if (in_array($data['status'], ['accepted', 'rejected', 'closed'], true)) { - abort_unless(app(ScopedPortalAdministration::class)->deskDecision($actor,$request), 403); + abort_unless(app(ScopedPortalAdministration::class)->deskDecision($actor, $request), 403); } abort_unless(in_array($data['status'], config('virtual-desk.transitions.'.$request->status, []), true), 409, 'Transição inválida.'); } @@ -412,13 +413,13 @@ class VirtualDesk return DB::transaction(function () use ($actor, $id, $data) { $case = $this->case($actor, $id, false, true); - abort_unless($this->owns($actor, $case) || app(ScopedPortalAdministration::class)->deskCaseDecision($actor,$case->id), 403); + abort_unless($this->owns($actor, $case) || app(ScopedPortalAdministration::class)->deskCaseDecision($actor, $case->id), 403); abort_unless((int) $case->version === (int) $data['version'], 409); $workflow = json_decode($case->workflow, true, 512, JSON_THROW_ON_ERROR); $current = $workflow[$data['stage']]; $decision = in_array($data['status'], ['completed', 'not_applicable'], true); if ($decision) { - abort_unless(app(ScopedPortalAdministration::class)->deskCaseDecision($actor,$case->id) && ! $this->owns($actor, $case, false), 403, 'Conclusão documental exige revisão interna por outra pessoa autorizada.'); + abort_unless(app(ScopedPortalAdministration::class)->deskCaseDecision($actor, $case->id) && ! $this->owns($actor, $case, false), 403, 'Conclusão documental exige revisão interna por outra pessoa autorizada.'); abort_unless(trim($data['evidence'] ?? '') !== '', 422, 'Identifique a evidência documental.'); foreach ($current['dependencies'] as $dependency) { abort_unless(in_array($workflow[$dependency]['status'], ['completed', 'not_applicable'], true) || (($data['exception'] ?? false) && ($data['document_id'] ?? null)), 422, 'Dependência '.$dependency.' pendente; uma exceção exige evidência própria.'); diff --git a/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json b/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json index 167f4986..60a27bc6 100644 --- a/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json +++ b/docs/investmoz/simulations/integrated-review-continuation-20261020-receipt.json @@ -1611,5 +1611,40 @@ "new_rules_published": false, "consumer_activation_changed": false, "proof_directory": "outputs/modelo-a-20261021" + }, + "contextual_continuity_qa_20261022": { + "branch": "codex/project-context-continuity-QA", + "base": "57fc914821d0cefa02caa80a74b3d42e663f2742", + "scope": "Primeiro incremento de continuidade e explicação contextual; adaptação jurídica integral não encerrada", + "status": "QA, revisão; sem integração main ou alteração fiscal activa", + "http_tests": { + "tests": 4, + "assertions": 74, + "transaction_rollback": true + }, + "frontend_tests": 8, + "typescript": "passed", + "build": "passed", + "visual_evidence_directory": "outputs/context-continuity-20261022", + "same_project_new_session": true, + "deliberate_edit_preserved": true, + "second_project_isolated": true, + "fiscal_execution_id": "ae401465-834f-4761-9406-5af060c499fb", + "new_executions_today": 1, + "reused_proofs": [ + "13f68f1b: recuperação/exportadores/PDF", + "83d2f97d e 226fd308: precisão/versões/históricos", + "3f5430c3: cálculo mensal", + "0b0cf761: correspondência parcial Modelo A" + ], + "limitations": [ + "Catálogo visual QA sintético; ZEE/ZFI apenas controlos HTTP sintéticos revertidos, sem elegibilidade real demonstrada", + "Condições jurídicas por sector/actividade/regime e benefícios executáveis não concluídos", + "Outros três consumidores usam origem/reconciliador comum; não houve demonstração visual integral de cada processo", + "Sem regra fiscal nova, publicação, activação ou integração em main", + "Edge interrompeu a inspecção após navegação de regresso; endereço e gravação confirmados por inventário/serviço, visual final não observada. Limitação da ferramenta." + ], + "return_evidence_id": "43317c22-50c8-40cf-98e4-e5d4d108c372", + "B_recovered_context_revision": 2 } } diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 833029b3..f32874a5 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -2018,3 +2018,26 @@ Cotejo dirigido: Lei22/2022 art.17-A/aditamento e eficácia; Lei10/2025 arts.18/ Provas novas apenas do incremento:3testes frontend (agendas, zero/falta, sem IVA/dedução fabricados e relatório sem mutar resultado), TypeScript/build, Edge de consulta após recuperação e biblioteca idempotente/scan. Avaliador, selecção publicada, precisão, históricos e exportadores aceites reutilizados. DossierQA e fixtureIVA v4 continuam disponíveis para revisão; este incremento não calcula novamente. Provas privadas outputs/modelo-a-20261021; recibo e inventário existentes actualizados. Branch codex/iva-modelo-a-reconciliation-QA, parent3f5430c3, separada de main; homologação/regra real/interruptor inalterados. Saldo explícito: **reconciliação e primeiro incremento de interface concluídos, apuramento completo não implementado**. Próximo lote: classificação por operação e origem prevista/efectiva, cadastro fundamentado de âmbito/dedução e ligação a totais14–18 propagando indeterminação; 8–16h cadastro/consolidação e20–36h código/aceitação, total28–52h condicionado ao âmbito/consolidação, sem créditos anteriores/substituições/pagamento/reembolso ou simulador integral. O documento contém o delta e critérios concretos. Integração do código, publicação e activação continuam operações distintas; esta preparação não executa nenhuma no destino. + + +### Continuidade e adaptação contextual — primeiro incremento QA, 22/10/2026 + +Instrução expressa da Tempo de 22/10: o contexto do investimento é transversal ao percurso, formulários, documentos e simulações, mesmo sem IA. Base Git e revisão servida confirmadas em leitura: `57fc914821d0cefa02caa80a74b3d42e663f2742`. Trabalho isolado em `codex/project-context-continuity-QA`, sem integração ou publicação/activação fiscal no destino. + +Causas identificadas no código e reprodução dirigida: `InvestorContext` só distribuía título, descrição, sector e geografia; o preenchimento comum copiava apenas campos vazios sem distinguir herança de edição deliberada; o IVA pontual mantinha moeda/data/base em estado local que desaparecia ao desmontar o ecrã. A projecção empresarial sobrepunha a moeda do projecto à moeda de origem do plano ao apresentar/calcular/exportar. No ensaio anterior, projecto guardado em MZN e selector IVA vazio. A primeira tentativa de abertura encontrou uma sessão expirada, confirmada pela leitura sem autenticação e resolvida pelo início de sessão normal; não foi classificada como perda do dossier. + +Correcção comum: consolidar exclusivamente o rascunho explicitamente ligado ao mesmo dossier e proprietário; conservar origem, versão e hash. Não procurar o último projecto da conta. Herança persistida com assinaturas de alteração por campo e âmbito dossier/consumidor; não são tokens de autorização nem prova jurídica. Actualizar valores ainda herdados, preservar alterações deliberadas e campos apagados; manter a hierarquia geográfica e os restantes dados das parcelas. O armazenamento do navegador passa a incluir conta e projecto. Consumidores do padrão: simulador, apoio à terra, Balcão e manifestação de investimento; esta última recebe também a moeda compatível. Campos sem correspondência semântica não são copiados. Nacionalidade, residência e país de constituição não são equiparados. + +O IVA pontual guarda as entradas com o rascunho. A exploração fiscal, oportunidade e componente pontual reutilizam a moeda compatível; a projecção mensal reutiliza o plano e o início previsto. Não se infere exigibilidade fiscal a partir da data prevista de início, nem residência jurídica a partir do país. USD é conservado e explicado como não suportado pela versão MZN. Uma divergência entre moeda guardada no plano e moeda do projecto é apresentada, sem conversão ou reclassificação. O plano conserva a moeda de origem também na apresentação e nos exportadores existentes. Vendas, zero/falta e snapshots de IVA continuam a usar o motor publicado e os históricos aceites; nenhum imposto mensal fixo é introduzido. + +Adaptação deste incremento: o editor existente passa a permitir moeda, início previsto, origem do investidor, tipo/situação da entidade e residência fiscal declarada, sempre pela prévia/confirmar existente. A prévia continua a identificar dados/documentos conservados, resultados e etapas afectados; alterações apenas ao título/descrição não invalidam a aplicabilidade. O selector territorial reutiliza o catálogo público `InvestmentZones` para parques, ZEE e ZFI, preservando versão/hash, fontes e condições públicas já divulgadas no complemento existente. A mesma síntese aparece no contexto e simulador e segue para o relatório do dossier. Os ramos de terra/financiamento reutilizam a definição publicada, factos, estados e razões de `InvestorPath`; não foi criado outro avaliador nem activado benefício. + +Escolher uma zona abre a análise específica: referência consultada, condições documentadas ou em falta, período/fonte cadastrados quando disponíveis e reconhecimento por determinar. O benefício e o cenário condicionado permanecem indeterminados quando não existe ligação executável às condições/reconhecimento. O IVA disponível é identificado como cenário geral sem benefício; não representa automaticamente o regime escolhido nem apuramento final. Reutilizam-se `InvestorContext`, `InvestmentZones`, `InvestmentZoneOperationalDetails`, `InvestorPath`/definição publicada, resolvedor/avaliador fiscal e snapshots existentes. A escolha técnica de exigir uma nova confirmação genérica dos mesmos dados em cada formulário foi retirada por instrução da Tempo; permissões, declarações, submissões formais, revisões independentes aprovadas e campos autorizados de pedidos devolvidos mantêm os controlos existentes. + +Provas novas: 4 testes HTTP/74 asserções, em transacções revertidas na base isolada `simulator_fiscal_delta_20261021_test`/loopback55441; 8 testes frontend de herança, edição/apagamento, isolamento, parcelas, moeda divergente e contexto no relatório; TypeScript/build. Percurso Edge: A nacional/MZN e residência fiscal ZA, vendas guardadas de quatro meses → cálculo mensal → gravação → edição deliberada do título → recarregamento → terminar sessão/iniciar sessão → recuperação e relatório pelos dados efectivamente guardados. Resultado `ae401465-834f-4761-9406-5af060c499fb`, uma única execução nova no dia; Janeiro1000.03/IVA160.0048, Fevereiro2000.06/320.0096, Marçozero e Abrilsem informação. O modelo de relatório recuperado conserva os valores exactos e não altera o snapshot. B estrangeiro/USD, primeiro divergência explícita planoMZN/projectoUSD, depois declaração manual USD no plano, IVA recusado sem conversão; selecção de parque pela prévia e análise específica. Os testes de ZEE/ZFI usam apenas metadados sintéticos revertidos: não demonstram elegibilidade real. Provas privadas em `outputs/context-continuity-20261022`; não entregar fixtures ou credenciais. + +Limites concretos: este é o primeiro incremento utilizável de continuidade e explicação contextual, não a conclusão da adaptação de todos os sectores/regimes. O catálogo QA consultado contém parques sintéticos; a ligação jurídica completa de requisitos/documentos/licenças e benefícios às condições de cada actividade/regime não está demonstrada. Condições sem estrutura/relação executável continuam explicitamente em falta; nenhuma alegação nova de direito ou benefício é feita. Não houve nova validação jurídica nem revalidação genérica de credibilidade das fontes oficiais aceites em08/10. Não repetir cálculo decimal/exportadores/paginação já aceites. A demonstração visual foi feita no percurso e simulador; os outros três consumidores receberam o reconciliador comum, sem se afirmar um ensaio visual integral de cada processo. + +Revisão: abrir o simulador QA com o dossier A `92d0836c-0ffb-4e07-a7f5-0e8ca3f594b9` ou B `1872412f-251a-4f6d-bf18-70388e71a16a`; usar a conta sintética QA existente, nunca actores sintéticos na homologação. O router privado de QA usa a instalação já existente do percurso, activada apenas neste ensaio isolado; não há migration ou nova exigência de funções. Entregar a candidata para revisão pelo processo Git existente, preservando alterações concorrentes. Uma integração futura exige rever o delta relativamente a main e o estado de instalação/configuração do percurso no destino; não publicar regras ou alterar interruptores fiscais como consequência desta correcção. Preservar todos os históricos na suspensão ou reversão de código. + +Fecho da observação deste incremento: o regresso A ao dossier gravou a evidência financeira `43317c22-50c8-40cf-98e4-e5d4d108c372`, rascunho `cf4dec46-c96c-4aa6-aa9c-1a8d6ecb1bea` v8, contexto v1, com hash preservado. A ligação de inspecção do Edge interrompeu-se depois da navegação; o inventário mostrou o endereço do mesmo dossier e a leitura autenticada do serviço confirmou a gravação. A parte visual final do regresso não foi observada e fica como limitação da ferramenta, não falha do simulador. B recuperou contexto v2 e gravou rascunho v6, mantendo USD e sem execução fiscal. O relatório gerado destes dados recuperados conserva a versão do parque e benefício indeterminado. O enriquecimento automático do rascunho privado é exclusivo do proprietário autenticado; o acesso de gestão ao dossier não concede por esta alteração acesso ao rascunho privado da conta. diff --git a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv index 50a5d133..cd43a349 100644 --- a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv +++ b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv @@ -4230,7 +4230,7 @@ AUD-COUNTRY-04,País e origem separados nos formulários públicos e percursos l [B6 QA 13/10/2026] L2.2 técnico satisfeito por correspondência explícita: C133 usou empresa, interesses14/15 paísMZ/PT origemBR/não informada; HTTP/recuperação/filtro/recibo/replay anteriores e SQLatual um recibo/consent/outbox por submissão. Não se repetiu a submissão válida. L2.1/4/5 técnicos satisfeitos: rascunho empresarial existente guardado/submetido com residênciaPT/constituiçãoFR/origemBR; mestreZA v3→MZ v4→ZA v5 auditado sem reescrever declaração/snapshotv2/submissão; nova sessão/revisão3/replay mesmo recibo, estranho404/anónimo401. Interesses16→17→17, desk1/businesses2 intactos; SQL17/1/2, um recibo/consent/outbox; cifra privada preservada. Lista existente18posições, nove critérios técnicos satisfeitos/nove executáveis, oito percursos visuaisL4 abertos; mesmos22grupos. Reestimativa20–34h por saldo finito, não consumo ou prazo;25–43 anterior conservado sem dedução itemizada. Permissões legadas do anúncioC133 são dependência executável concreta, C135 sóvisual. Sem novo reset/chamada/critério/ID/ativação. -[Reconciliação visual14/10/2026 — sem novo ensaio] Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json",Implementado parcialmente,"Restam pesquisa/seleção/erros/resultados visíveis do formulário no navegador e demais formulários públicos. O anúncio usado é fixture sintética: criação do rascunho reutiliza serviço, mas o estado publicado foi preparado para ensaiar o consumidor, não demonstrado pelo workflow; esse critério de publicação pelo fluxo existente permanece pendente. Não usar esta fixture como fecho da preparação/publicação operacional. +[Reconciliação visual14/10/2026 — sem novo ensaio] Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",Implementado parcialmente,"Restam pesquisa/seleção/erros/resultados visíveis do formulário no navegador e demais formulários públicos. O anúncio usado é fixture sintética: criação do rascunho reutiliza serviço, mas o estado publicado foi preparado para ensaiar o consumidor, não demonstrado pelo workflow; esse critério de publicação pelo fluxo existente permanece pendente. Não usar esta fixture como fecho da preparação/publicação operacional. [B QA 13/10/2026] Visual e demais consumidores do âmbitoB; fixtureC133 continua sem prova de publicação própria. Publicação canónica33 é consumidor distinto. @@ -4250,7 +4250,7 @@ AUD-COUNTRY-04,País e origem separados nos formulários públicos e percursos l [Orientações permanentes Tempo — 12/10/2026] Fonte: AGENTS.md, «Regras permanentes do InvesteMoz» e «Aplicação na execução»; instrução expressa do responsável nesta conversa em 12/10/2026. O portal de âmbito nacional atende investidores nacionais e estrangeiros. Preservar a distinção entre país de residência, país de constituição e origem da solicitação nas diferentes etapas e formulários. A referência orienta a execução; não é nova prova funcional nem altera o estado deste requisito.",parcial,interest_requests: 4; leads: 0; investors: 3,"Capacidades/provas específicas anteriores existem, mas o requisito agregado ainda tem os critérios restantes explicitados; fechos parciais preservados. -[Reconciliação visual14/10/2026 — sem novo ensaio] Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json","[B6 QA 13/10/2026] L2.2/3/4 origem persistida/recuperação/replay satisfeitos; L4 apresentação separada da residência/constituição. País declarado deste consumidor, não mestre; publicação do anúncio próprio aindaL1.3 e visualL4. Não usar a oportunidade33 como prova do anúncioC133. Somente ramos finitos incluídos; países/estatísticas globais continuam parciais e UI/L4 aberta. Coleções não são soma de investidores únicos; listagem/estatística têm filtros distintos. Sem nova organização/conta/representação. Planeamento/inspeção de permissões não é fluxo demonstrado. L1.2/3/5 eL3.1/4/5/6/7/8 ainda executáveis; candidata final/backup-restauroQA correspondente pendentes; A/B/C37/COUNTRY02 preservados. +[Reconciliação visual14/10/2026 — sem novo ensaio] Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","[B6 QA 13/10/2026] L2.2/3/4 origem persistida/recuperação/replay satisfeitos; L4 apresentação separada da residência/constituição. País declarado deste consumidor, não mestre; publicação do anúncio próprio aindaL1.3 e visualL4. Não usar a oportunidade33 como prova do anúncioC133. Somente ramos finitos incluídos; países/estatísticas globais continuam parciais e UI/L4 aberta. Coleções não são soma de investidores únicos; listagem/estatística têm filtros distintos. Sem nova organização/conta/representação. Planeamento/inspeção de permissões não é fluxo demonstrado. L1.2/3/5 eL3.1/4/5/6/7/8 ainda executáveis; candidata final/backup-restauroQA correspondente pendentes; A/B/C37/COUNTRY02 preservados. [Reconciliação visual14/10/2026 — sem novo ensaio] A classificação anterior «outrossetepercursos pendentes» é histórica e não invalida critérios visuais válidos. Roteiro atual:12trechos específicos em1/4/5/6/7/8;2/3 sem passos restantes. Sem novo critério, nem fecho global/opçãoB/candidata/ativação. Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas.","investors/contacts/leads/tasks, OpportunityContacts, acompanhamento interno existente",Relações mestre/contexto e autorizações; não depende de CRM externo. C131 sóQA.,Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Completar critérios restantes sem repetir provas válidas,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: acompanhamento. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/reused-evidence-integrity.json: 35 recibos anteriores com hashes correspondentes; o âmbito de cada recibo permanece limitado ao critério ensaiado. outputs/investmoz-audit-current-20261012/http-promoter.json; http-validator.json; http-publisher.json; http-manager.json.; business-country-before.json; business-country-after.json; business-country-variants.json; business-country-persistence.json; country-filter-QA-delta.json; business-feedback-QA-delta.json; business-feedback-build-QA.json; business-feedback-assets.json @@ -4260,7 +4260,7 @@ AUD-COUNTRY-04,País e origem separados nos formulários públicos e percursos l [B6 QA 13/10/2026] L2.2 técnico satisfeito por correspondência explícita: C133 usou empresa, interesses14/15 paísMZ/PT origemBR/não informada; HTTP/recuperação/filtro/recibo/replay anteriores e SQLatual um recibo/consent/outbox por submissão. Não se repetiu a submissão válida. L2.1/4/5 técnicos satisfeitos: rascunho empresarial existente guardado/submetido com residênciaPT/constituiçãoFR/origemBR; mestreZA v3→MZ v4→ZA v5 auditado sem reescrever declaração/snapshotv2/submissão; nova sessão/revisão3/replay mesmo recibo, estranho404/anónimo401. Interesses16→17→17, desk1/businesses2 intactos; SQL17/1/2, um recibo/consent/outbox; cifra privada preservada. Lista existente18posições, nove critérios técnicos satisfeitos/nove executáveis, oito percursos visuaisL4 abertos; mesmos22grupos. Reestimativa20–34h por saldo finito, não consumo ou prazo;25–43 anterior conservado sem dedução itemizada. Permissões legadas do anúncioC133 são dependência executável concreta, C135 sóvisual. Sem novo reset/chamada/critério/ID/ativação. -outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json","acompanhamento +outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","acompanhamento [B QA 13/10/2026] Opção B aprovada em QA: ambito-B-aceitacao-QA.md. Sem nova ativação, regra ou módulo.",12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,"[QA Response/materialidade/consumidores/candidata 11/10/2026] Acrescentado percurso fundiário de suporte com paísMZ e origemPT separados e recuperados no pedido ligado. Não encerra todos os formulários públicos/legados: restam serviços/condições, origem desconhecida, cancelamento/arquivo e filtros combinados por consumidor já enumerado. Constituição da organização não é residência nem origem da solicitação.",Nenhuma migration; usar interest_requests.metadata e recibos existentes,PortalServicesController; InterestRequestController; InvestorWorkspaceController; componentes ISO,"Portal Audit Continuation Test: 5 testes / 203 asserções; phpunit-followup-recovery-final.log; API /Inertia/persistência demonstradas, browser indisponível; Portal Origin Compatibility Test; Investment Portfolio Test; Balcão nos três serviços: país PT /origem ZA cifrados, GET recupera, ZZ 422; devolução permite só campos autorizados, versão 5 /conflito409/perfil403 | continuation-consumer-qa.xml: provas individuais país /origem/filtro/estatística , incluindo quatro tipos de apoio e três serviços Balcão após correção; continuation-profile-qa.xml: perfil /empresa/submissão/CRM ; continuation-business-journey-qa.xml: formulário de interesse em negócio público PT /ZA/recibo/replay/GET/filtro/estatística e jornada PT =1 /MZ=0 sem inferir país. Ver cobertura-percursos-i0-i3.md , sem promover API /props a UI. | [QA independente 10 /10/2026 ] countries-independent-qa.xml: métodos específicos Investment Workspace Test(perfil /empresa/manifestação/CRM ), Portal Audit Continuation Test(público /quatro apoios /catálogo/Balcão territorial), Portal Audit Next Lot Test(negócios /fundiário ), Portal Origin Compatibility Test(origem legada) e Investor Guidance Test(Balcão). countries-forms-independent-qa.xml: métodos próprios do interesse público em negócio, jornada da carteira, três serviços Balcão e simulador. Cobertura por formulário em cobertura-percursos-i0-i3.md ; a expressão original em nomes de testes também seleciona testes documentais, não contar 22 requisitos /percursos de países. | [Visual QA 10 /10/2026 ] Chromium QA18 : residência PT no perfil de investimento guardada e F 5 recuperada; negócio privado e apoio fundiário DRAFT país PT /origemFR guardados e recuperados por UI. Balcão A /B DRAFT país PT /origemZA recuperados noutra sessão. Quatro formulários públicos /investidor/empresa/manifestação/apoio mostram 249 países (250 opções incluindo vazio), mas sem submissão /gravação desta prova. Gestor 14: filtro origem ZA e Não informado /unknown ; UI estatísticas mostra 4 manifestações Não informado e 0 pedidos ZA submetidos, excluindo corretamente rascunhos A /B. CRM filtrounknown renderizado. consumers-mobile-accessibility-chromium-20261010.json ; visual-followup-chromium-20261010.json . Não inferir origem da residência ou constituição. | [Visual QA 10/10/2026] Chromium QA18: residênciaPT no perfil de investimento guardada eF5 recuperada; negócio privado e apoio fundiárioDRAFT paísPT/origemFR guardados e recuperados por UI. BalcãoA/B DRAFT paísPT/origemZA recuperados noutra sessão. Quatro formulários públicos/investidor/empresa/manifestação/apoio mostram249países (250opções incluindo vazio), mas sem submissão/gravação desta prova. Gestor14: filtro origemZA eNãoinformado/unknown; UI estatísticas mostra4manifestaçõesNãoinformado e0pedidosZA submetidos, excluindo corretamente rascunhos A/B. CRM filtrounknown renderizado. consumers-mobile-accessibility-chromium-20261010.json; visual-followup-chromium-20261010.json. Não inferir origem da residência ou constituição. | [QA A/B e países 10/10/2026] country-paths-chromium-20261010.json + country-paths-persistence-qa.json: formulários/investidor,empresa,apoio e manifestar-interesse:249países, PT/ZA, UI→POST→protocolo→gestão autorizada→filtros independentes→origemZA=4. Uma linha/consentimento/recibo de idempotência por envio; SQLQA READONLY. ResidênciaPT, negócio/fundiárioPT/FR recuperados emnova sessão sem regravar. C89 nomes acessíveis dos seletores corrigidos; quatro exames390px sem overflow/violações automáticas. C90 source_page dos novos envios mantém página de entrada mesma origem; formulário/investidor demonstrado por UI/API/SQL e página da gestão, form-entry-source-*qa.json; registos antigos não reescritos. Rejeições DNS dos emails sintéticos foram validação esperada; notificaçõesQA desativadas. Ativo não alterado. | [QA A/B e países 10/10/2026] country-search-chromium-20261010.json: quatro formulários públicos, pesquisa Portugal→PT, França→FR conservando seleçãoPT e pesquisa independente África do Sul→ZA; Chromium390px, somente leitura, sem autenticação ou novos envios. | [QA Response/materialidade/consumidores/candidata 11/10/2026] QA21 /investidor/terra-duat/01a12568-c330-73ec-a1ac-543ac0116a26: paísMZ/origemPT→grava apoio302→support_requestedv5→nova sessão recupera→gestor14recupera→estranho23=404. Rascunho incompleto01a1284f-8b99-7384-bc6a-8bc6b5d68dab conserva erros e foco na etapa certa. País do requerente e País de origem declarado com nomes distintos. Recibos revision-land/land-errors/land-replay e SQLREADONLY. | GET /management/interests?origin=PT mostra interestsPT1/deskPT0/businessesPT0; repetiçãoPOSTassistência409 conserva versão/referência; SQLREADONLY comprova uma ligação case→interest_request, sem duplicação. Não somar coleções diferentes como demonstração universal. Evidência ligada:revision-final-scope-qa-20261011.json. Sem ativação.","POST API interest-requests / apoio / percurso legado; ISO inválido 422 e replay | [QA independente 10/10/2026] Ensaios de rotas reais no kernel QA: códigos ISO inválidos422 sem escrita, replay idempotente, versões409 e acesso indevido403/404, conforme formulário. | [QA A/B e países 10/10/2026] Públicos POST302/201, protocolo, recuperação na gestão e filtros PT/ZA; estatística positiva. Business/land/profile GET nova sessão. C90 referente externo/não permitido é ignorado. | [QA Response/materialidade/consumidores/candidata 11/10/2026] Pedidos reais18097/alvoQA; estados por consumidor nos recibos;GETResponse sem gravação e recusas403/404/409 preservadas.","[B QA 13/10/2026] B-LAND-C138 @@ -4276,7 +4276,7 @@ VISUAL-B396C-REUSE-20261014","| BUSINESS-COUNTRY-HTTP-SQL: Consumidor /negocios/ [B6 QA 13/10/2026] L2.2 técnico satisfeito por correspondência explícita: C133 usou empresa, interesses14/15 paísMZ/PT origemBR/não informada; HTTP/recuperação/filtro/recibo/replay anteriores e SQLatual um recibo/consent/outbox por submissão. Não se repetiu a submissão válida. L2.1/4/5 técnicos satisfeitos: rascunho empresarial existente guardado/submetido com residênciaPT/constituiçãoFR/origemBR; mestreZA v3→MZ v4→ZA v5 auditado sem reescrever declaração/snapshotv2/submissão; nova sessão/revisão3/replay mesmo recibo, estranho404/anónimo401. Interesses16→17→17, desk1/businesses2 intactos; SQL17/1/2, um recibo/consent/outbox; cifra privada preservada. Lista existente18posições, nove critérios técnicos satisfeitos/nove executáveis, oito percursos visuaisL4 abertos; mesmos22grupos. Reestimativa20–34h por saldo finito, não consumo ou prazo;25–43 anterior conservado sem dedução itemizada. Permissões legadas do anúncioC133 são dependência executável concreta, C135 sóvisual. Sem novo reset/chamada/critério/ID/ativação. -[Reconciliação visual14/10/2026 — sem novo ensaio] Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json","| Lote: browser indisponível; build/HTML/HTTP não substituem apresentação. Anúncio publicado é fixture, não prova de transição/publicação. Critérios de entidade/proponente e consumidores diferentes não foram extrapolados. +[Reconciliação visual14/10/2026 — sem novo ensaio] Filtros de origem não informada/PT/MZ e coleções separadas têm prova visual17. Restam ramos empresarial/fundiário e snapshots indicados; sem novas submissões indiscriminadas. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json","Lote: browser indisponível; build/HTML/HTTP não substituem apresentação. Anúncio publicado é fixture, não prova de transição/publicação. Critérios de entidade/proponente e consumidores diferentes não foram extrapolados. [B QA 13/10/2026] Visual e demais consumidores do âmbitoB; fixtureC133 continua sem prova de publicação própria. Publicação canónica33 é consumidor distinto. @@ -4284,7 +4284,7 @@ VISUAL-B396C-REUSE-20261014","| BUSINESS-COUNTRY-HTTP-SQL: Consumidor /negocios/ [B6 QA 13/10/2026] L2.2/3/4 origem persistida/recuperação/replay satisfeitos; L4 apresentação separada da residência/constituição. País declarado deste consumidor, não mestre; publicação do anúncio próprio aindaL1.3 e visualL4. Não usar a oportunidade33 como prova do anúncioC133. Somente ramos finitos incluídos; países/estatísticas globais continuam parciais e UI/L4 aberta. Coleções não são soma de investidores únicos; listagem/estatística têm filtros distintos. Sem nova organização/conta/representação. Planeamento/inspeção de permissões não é fluxo demonstrado. L1.2/3/5 eL3.1/4/5/6/7/8 ainda executáveis; candidata final/backup-restauroQA correspondente pendentes; A/B/C37/COUNTRY02 preservados. -Reutilização por mesmo consumidor/ação/campo/resultado e destinoQA, não por semelhança ou nome de ficheiro. Novos ramos/dados, licenças e obrigações identificados separadamente. Tentativa automáticaC135 conservada como histórico, não saldo 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.",,, +Reutilização por mesmo consumidor/ação/campo/resultado e destinoQA, não por semelhança ou nome de ficheiro. Novos ramos/dados, licenças e obrigações identificados separadamente. Tentativa automáticaC135 conservada como histórico, não saldo global. | Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores.","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.",,,Incremento contextual QA para revisão; sem integração main/activação fiscal. AUD-STATS-01,"Estatísticas internas por origem, incluindo filtro e não informado","Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md",CRM/solicitações,/management/crm/leads,"investors/contacts/leads/tasks, OpportunityContacts, acompanhamento interno existente. 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. | Delta C133/C134 apenas QA; originais ativos preservados, nenhuma ativação deste lote.","outputs/investmoz-audit-current-20261012/reused-evidence-integrity.json: 35 recibos anteriores com hashes correspondentes; o âmbito de cada recibo permanece limitado ao critério ensaiado. outputs/investmoz-audit-current-20261012/http-promoter.json; http-validator.json; http-publisher.json; http-manager.json.; correspondência explícita de prova agrupada: FILTERS | Lote independente C133/C134: Interesses de negócio: submissão nova incrementa origem BR uma vez; replay mantém contagem; origem ausente permanece no grupo não informado. Um recibo, outbox pendente e consentimento por registo; coleções não somadas. Conflito409 com dados diferentes na mesma chave. Não comprova alterações/cancelamentos de outros consumidores. Provas: business-country-before.json; business-country-after.json; business-country-variants.json; business-country-persistence.json; country-filter-QA-delta.json; business-feedback-QA-delta.json; business-feedback-build-QA.json; business-feedback-assets.json [B QA 13/10/2026] Fundiário: filtro paísPT/origemBR encontra1recibo; repetição conserva estatísticas de origem. SQL:1pedido/recibo/consentimento/outbox/evento support_requested, versão3. Coleções de origem separadas, não somadas. Provas agrupadas em proof-groups.json e execução-B-QA.md. @@ -5593,7 +5593,7 @@ AUD-DESK-02,"Reutilizar investimento, percurso, pedido e responsável no Balcão [B8 QA 13/10/2026] Recursos32/56: hierarquia, erro pai/país422, retirada explícita dos filhos na troca MZ→PT→MZ, quatroIDs guardados/nova sessão. Ancuabe-Sede sem geometria própria e3limites ancestrais. Parcela32 coberta pelo limite INE Ancuabe e área medida12001.7448sqm; declaração12001.74 preservaunidade/histórico. Não é prova da limpeza por clique nem cálculo apresentado na UI. Caso de entidade: pai errado422, retirar/repor filhos/nova sessão, constituiçãoZA distinta de territórioMZ e recibo antigo intacto. C145: associação explícita opcional ao dossier em payload cifrado, links de preparação/continuação e retorno recuperados noutra sessão; outro dossier403/422 e troca do vínculo422. Casos antigos sem vínculo não são inferidos. Campo existente do pedidoBalcão territory_id/fonte: UUID não cadastrado422, hierarquia e contexto do mesmo pedido/dossier recuperados. FonteINE administrativa e ausência da geometria própria explícitas; não existe mapa autónomo do dossier e não foi criado um. 18/18posições técnicas satisfeitas na mesma checklist;8visuaisabertos,22grupos preservados. Restante6–10h apenasL4/consolidação; não é percentagem do produto, fecho global ou candidatafinal. Sete fontesQA/bundle recompilado, sem alteraçõesativas;A/B/C37/COUNTRY02 preservados;C132 separado. -[Reconciliação visual14/10/2026 — sem novo ensaio] A/B fechado preservado. Apenas vínculo explícitoC145, quatroseletores/anexos da entidade, linkadministrativoC144 e recursos/recibo/revogaçãoBalcão específicos aguardam visual. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json",Implementado parcialmente,"Contexto/reutilização A/B demonstrados. Restam entidades, pedidos e submissões legados com representação autorizada e preservação de snapshot; não duplicar dossier. +[Reconciliação visual14/10/2026 — sem novo ensaio] A/B fechado preservado. Apenas vínculo explícitoC145, quatroseletores/anexos da entidade, linkadministrativoC144 e recursos/recibo/revogaçãoBalcão específicos aguardam visual. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",Implementado parcialmente,"Contexto/reutilização A/B demonstrados. Restam entidades, pedidos e submissões legados com representação autorizada e preservação de snapshot; não duplicar dossier. [B QA 13/10/2026] Compatibilidade dos estados/contextos ainda sem cobertura e demonstração integrada dos critérios visuais novos. A/B e C37 permanecem fechados; não os repetir. @@ -5621,7 +5621,7 @@ AUD-DESK-02,"Reutilizar investimento, percurso, pedido e responsável no Balcão [Reconciliação visual14/10/2026 — sem novo ensaio] A/B fechado preservado. Apenas vínculo explícitoC145, quatroseletores/anexos da entidade, linkadministrativoC144 e recursos/recibo/revogaçãoBalcão específicos aguardam visual. Referência: outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-20261014.json -[RECONCILIACAO-43-20261019] 10: Motor, contexto e recuperação instalados; falta observação do caso legítimo. Variantes societárias/fiscais/contratuais em11,16,17,22. | 31: Só project-preparationv5 registado. project-change/project-follow-up existem na configuração e faltam versões internas. Gestão/decisão da equipa ainda usa gate global. | 32: Prova positiva no destino exige dossier real autorizado; dependência de verificação/dados, não reconstrução. Ligação documental por referência adicional em39. | 39: Integrar306e3ebc8a70 e31 referências a2 originais. Preservar permissões, versão/citação/hash e compatibilidade de reversão. Dossier legítimo para verificação final.","[B8 QA 13/10/2026] Somente oito percursos visuaisL4/C135 e consolidação/backup-restauroQA da revisãofixa restam na checklistB; não há exigência técnica genérica nova. Requisito agregado continua parcial; critérios foraB e ativação separados. +[RECONCILIACAO-43-20261019] 10: Motor, contexto e recuperação instalados; falta observação do caso legítimo. Variantes societárias/fiscais/contratuais em11,16,17,22. | 31: Só project-preparationv5 registado. project-change/project-follow-up existem na configuração e faltam versões internas. Gestão/decisão da equipa ainda usa gate global. | 32: Prova positiva no destino exige dossier real autorizado; dependência de verificação/dados, não reconstrução. Ligação documental por referência adicional em39. | 39: Integrar306e3ebc8a70 e31 referências a2 originais. Preservar permissões, versão/citação/hash e compatibilidade de reversão. Dossier legítimo para verificação final. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","[B8 QA 13/10/2026] Somente oito percursos visuaisL4/C135 e consolidação/backup-restauroQA da revisãofixa restam na checklistB; não há exigência técnica genérica nova. Requisito agregado continua parcial; critérios foraB e ativação separados. [Reconciliação visual14/10/2026 — sem novo ensaio] A classificação anterior «outrossetepercursos pendentes» é histórica e não invalida critérios visuais válidos. Roteiro atual:12trechos específicos em1/4/5/6/7/8;2/3 sem passos restantes. Sem novo critério, nem fecho global/opçãoB/candidata/ativação. A/B fechado preservado. Apenas vínculo explícitoC145, quatroseletores/anexos da entidade, linkadministrativoC144 e recursos/recibo/revogaçãoBalcão específicos aguardam visual. @@ -5654,7 +5654,7 @@ outputs/investmoz-audit-current-20261012/acceptance-396c-visual-reconciliation-2 [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.","balcão +[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. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","balcão [B QA 13/10/2026] Opção B aprovada em QA: ambito-B-aceitacao-QA.md. Sem nova ativação, regra ou módulo.",12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,"[QA A/B e países 10/10/2026] Reutilização contextual A/B concluída em QA; C88 preenchimento explícito da descrição vazia corrigido com fonte/revisão. Restam entidades empresariais, submissões e pedidos legados/representação organizacional por consumidor, conferência documental e demais critérios S01–S19; sem copiar dossier ou conta. | Histórico preservado/superado apenas nos critérios identificados: [Visual QA 10/10/2026] A/B completos para o cenário interno aprovado, em desktop isolado; Balcão apenas preparaçãoDRAFT, não submissão/decisão externa. Restantes contratos, documentos, fiscalidade/parâmetros legais, etapas externas e todos os consumidores/perfis não encerrados. Móvel A/B teve achados anteriores: correção comum verificada com dossier próprioQA21, sem substituir repetição final A/B móvel ou aceitação manual. | Histórico preservado: [Visual QA 10 /10/2026 ] A /B completos para o cenário interno aprovado, em desktop isolado; Balcão apenas preparação DRAFT, não submissão /decisão externa. Restantes contratos, documentos, fiscalidade /parâmetros legais, etapas externas e todos os consumidores /perfis não encerrados. Móvel A /B teve achados anteriores: correção comum verificada com dossier próprio QA21 , sem substituir repetição final A /B móvel ou aceitação manual. | Histórico preservado: Percurso visual completo com reutilização pendente | Execução estrutural QA aprovada e preparada; instalação ativa, cenários A /B na interface e cobertura de todos os consumidores permanecem pendentes. | C37 corrigido por código /HTTP/persistência QA; repetir cenário A na interface com investidor sintético MFA, preservando o erro manual como histórico. | Histórico da reabertura C37 , antes da captura: localizar perda; corrigir causa e demonstrar /investimentos →reload→logout→novo login /MFA no navegador. | C37 após captura: causa conhecida e seleção /feedbackQA corrigidos; falta entrada visual bem-sucedida da conta 18, reload /logout/nova sessão e retoma A /B. ","Nenhuma decisão; referências por ID e consentimento existentes | I1–I3 autorizados exclusivamente em QA: concluir demonstração A/B na interface, cobertura de contexto/prefill e provas da versão. Ativação ativa não autorizada. I0 continua independente.","Contextos da conta; investor_journeys; interest_requests | InvestorPath/InvestorPathDefinition, InvestorPathController, /investimentos e painel; entidades existentes, flag e definição versionada. Sem conversão dos roteiros antigos.","QA Investor Guidance Test | Complemento de leitura: investor-consolidation-runtime.json (2026-10-09 T 19:03:32+00:00, READ ONLY), assistant-source-full.json ; Entidades existentes reutilizadas; dados do simulador por ID /versão e descrição prefills no Balcão com evento e hash. Resultados financeiros privados com entradas congeladas, recuperados pelas fórmulas existentes. Prefill de todos os campos /consumidores ainda incompleto. Execução QA aprovada I 1–I 3. Revisão QA atual: ba 3781 ad 7 af 15 b 02 c 3021 e 69081 f 4129 a 2 a 19339 fd 740094 d 39 e 913 f 3657977 c, com provas dirigidas /HTTP identificadas abaixo. Regressão histórica: 384 ensaios globais, hash e 29 eb 8 c 4 b 11 fce 6 aa 78 c 798 e 24330 bbf 96 efbea 7 ac 2 eb 39 c 3 f 03 b 978 caeef 076; path-focused.xml (32 /541 ) e path-followup.xml (26 /551 ) são anteriores. Cenários A /B API /persistência , UI pendente; execucao-percurso-i1-i3.md . | Complemento 2026-10-09 T 20:55:14.594455+00:00: investor-path-http-qa.json , login /logout e novo cookie jar autenticado; A /B próprios, pedidos /tarefas recuperados; troca de contexto 403, outra conta 403 /draft404. Roteiro manual: roteiro-manual-qa-i0-i3.md . Sem UI observada. | C35 : campos data /emissor opcionais omitidos causavam 500; corrigidos sem inventar dados. C36 : original cifrado clean devolvia 404 em consumidores por comparar ciphertext ao hash original; Verified Document Binary partilhado recupera bytes verificados, mantendo permissões /cifra. document-consumers-real-qa.xml: Portal Real Document Consumers Test ( ClamD real) verifica biblioteca privada→scan→classificação→publicação separada→download,409 versão /dedup/404hash/403gestão , Balcão upload→scan→download /dedup/confidential/403estranho , reutilização do original cifrado sem duplicar documents, downloads gestão /Balcão/biblioteca e view PDF bytes /MIME/CSP , publicação separada e adulteração 404. Clam DQ ueue Worker Integration Test verifica worker database. Outros testes usam fixtures /mock ou schema compatibility, identificados separadamente. Estes ensaios não são sessões novas do navegador nem renderização visual. | C37 bloqueou cenário A na tentativa manual reportada: stack completa aponta users.two_factor_secret em Two Factor Login Request::has Valid Code, não Preserve Form Feedback. mfa-key-diagnosis-qa.json demonstra segredo /recovery da conta 13 legada incompatíveis com chave QA; conta 13 preservada, duas sessões QA invalidadas. Preparação /web agora partilham configuração estável /cache próprio, sem key:generate /rekey. mfa-auth-qa.xml e mfa-http-qa.json (2026-10-09 T 20:58:13.959848+00:00): novo investidor sintético com inscrição MFA normal Fortify , login /MFA/logout/nova sessão; falhas segredo /recovery controladas sem autenticação, redirect login com mensagem. Cenário A 413 ba 1 f 6-bdf 6-402 a-a 561-c 4 e 2 d 4098 d 1 a criado, recuperado por nova sessão MFA, adaptado, ferramenta /resultado próprios, Balcão e tarefa interna concluída. Cookies /XSRF/OTP/corpos não exportados. Retoma visual continua pendente. | Histórico C37 REABERTO /P0 , antes da captura 21:22–21:24 UTC: ciclo login da conta 18 no navegador 18097. auth-cookie-config-qa.json confirma atributos /guard QA; auth-session-trace-qa.jsonl preparado para primeira perda antes /depois MFA. Causa e continuidade visual não demonstradas; provas HTTP anteriores não fecham este caso. | C37 DIAGNÓSTICO CONFIRMADO /P0 : manual 21:22–21:24 UTC desafia conta 13, não 18; POST /MFA21 :23:04 falha na desencriptação e invalida intencionalmente; GET /login aceita nova sessão. Sem autenticação concluída /perda posterior /conflito de cookies. c37-manual-2122-2124-qa.json e c37-auth-redirect-qa.json : QA seleciona 18, bloqueia restauradas antes MFA, apresenta erro da página; MFA 18→ /investimentos →reload→logout→nova sessão /dossier HTTP passou; visual 18 pendente. | [Visual QA 10 /10/2026 ] Chromium desktop 18: dois dossiers próprios A /B criados, guardados e recuperados noutra sessão; cinco fases e 19 etapas preservadas. A dispensa S10 ; B espera externa S10 com S02 independente. Plano contextual guardado /reaberto , resultados devolvidos e recuperados no dossier: ponto de equilíbrio 20 unidades; défice A 0 /B70000MZN. Balcão preparado como DRAFT, países PT /origemZA guardados; tarefa interna atribuída /assumida/iniciada/concluída no UI pelo gestor 14 e recuperada pelo investidor. Gestor sem acesso a resultados financeiros privados; QA23 dossier 403 /rascunho404 ; sem mistura entre projetos. investor-ab-chromium-20261010.json e visual-persistence-qa.json . C80 : bloquear edição /avanço enquanto GET do rascunho não terminou; diagnóstico guardado, correção e resposta deliberadamente atrasada no Chromium demonstrados em portal-simulator-loading-visual-qa.cjs /recibo. | [Visual QA 10/10/2026] Chromium desktop18: dois dossiers próprios A/B criados, guardados e recuperados noutra sessão; cinco fases e19 etapas preservadas. A dispensaS10; B espera externaS10 comS02 independente. Plano contextual guardado/reaberto, resultados devolvidos e recuperados no dossier: ponto de equilíbrio20unidades; défice A0/B70000MZN. Balcão preparado comoDRAFT, paísesPT/origemZA guardados; tarefa interna atribuída/assumida/iniciada/concluída no UI pelo gestor14 e recuperada pelo investidor. Gestor sem acesso a resultados financeiros privados; QA23 dossier403/rascunho404; sem mistura entre projetos. investor-ab-chromium-20261010.json e visual-persistence-qa.json. C80: bloquear edição/avanço enquanto GET do rascunho não terminou; diagnóstico guardado, correção e resposta deliberadamente atrasada no Chromium demonstrados em portal-simulator-loading-visual-qa.cjs/recibo. | [QA A/B e países 10/10/2026] A/B internos concluídos em QA: provas anteriores de criação/gravação/nova sessão/permissões compostas com investor-ab-remaining-chromium-20261010.json e investor-ab-remaining-persistence-qa.json. A terra/financiamento=no, S10 dispensada, equilíbrio20, necessidade0MZN; B=yes, S10waiting_external, equilíbrio20, necessidade70000MZN. Resultado/draft/dossier corretos, BalcãoDRAFT com título do dossier/resumo da ferramenta/PT/ZA, tarefaS02done posterior à esperaS10 e preparação independente habilitada; cinco fases/19etapas preservadas. Seis verificações390/320px sem overflow ou violações axe. C88 ação explícita recuperou descrição vazia de A, guardando revisão antiga/fonte(v3)/auditoria. Sem recriar dossiers/resultados/tarefas ou repetir C37. Ativo não alterado."," | POST /investimentos , aplicabilidade /etapas/resultados/tarefas e drafts por context; GET por ID /conta ; permissões e versões ensaiadas. | Fortify enable /confirm/login/MFA/logout e negativas de desencriptação verificadas no mesmo servidor 18097. | c37-auth-redirect-qa.json : redirects Inertia /HTML no servidor 18097, MFA 18 e negativas diferenciadas. | [Visual QA 10 /10/2026 ] Respostas guardadas por método /rota/status , sem corpos de autenticação; QA23 negado 403 /404. | [Visual QA 10/10/2026] Respostas guardadas por método/rota/status, sem corpos de autenticação; QA23 negado403/404. | [QA A/B e países 10/10/2026] Respostas UI e GET de recuperação com destino QA verificado; evidências vinculadas a IDs do mesmo dossier/formulário. Regresso ao Balcão DRAFT, sem decisão externa.","[B QA 13/10/2026] B-PATH-READY @@ -5690,7 +5690,7 @@ VISUAL-B396C-REUSE-20261014","[B QA 13/10/2026] OpçãoB fixada antes de executa [B8 QA 13/10/2026] Somente oito percursos visuaisL4/C135 e consolidação/backup-restauroQA da revisãofixa restam na checklistB; não há exigência técnica genérica nova. Requisito agregado continua parcial; critérios foraB e ativação separados. -Reutilização por mesmo consumidor/ação/campo/resultado e destinoQA, não por semelhança ou nome de ficheiro. Novos ramos/dados, licenças e obrigações identificados separadamente. Tentativa automáticaC135 conservada como histórico, não saldo 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.",,, +Reutilização por mesmo consumidor/ação/campo/resultado e destinoQA, não por semelhança ou nome de ficheiro. Novos ramos/dados, licenças e obrigações identificados separadamente. Tentativa automáticaC135 conservada como histórico, não saldo global. | Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores.","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.",,,Incremento contextual QA para revisão; sem integração main/activação fiscal. AUD-CRM-01,Converter e acompanhar internamente com responsável/próxima ação,"Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md | Proposta consolidação 09/10/2026; DOCX aa13c53138ec15cd808de43d9dc2fc6808da86943d09d3352c9dd0944bdae364; texto P22–P40, estados P76–P88, aprovação P326/P497; proposta-consolidacao-percurso.md | Aprovação expressa da execução I1–I3 exclusivamente QA; execução 09/10/2026, execucao-percurso-i1-i3.md, C25/C26. | Pedido direto 09/10/2026: corrigir HTTP500 POST /two-factor-challenge na QA18097 após conta13; preservar conta/chave/MFA, invalidar sessão exposta e retomar cenárioA. [Segmentação bf26caeee043 — identidade confirmada; nome local v1.docx] SEG-bf26caee-p114 §1.0.2; SEG-bf26caee-p124 §1.0.2; SEG-bf26caee-p129 §1.0.2; SEG-bf26caee-p134 §1.0.2; SEG-bf26caee-p469 §3.2; SEG-bf26caee-p470 §3.2; SEG-bf26caee-p471 §3.2; SEG-bf26caee-p472 §3.2; SEG-bf26caee-p473 §3.2; SEG-bf26caee-p474 §3.2; SEG-bf26caee-p475 §3.2; SEG-bf26caee-p476 §3.2; SEG-bf26caee-p477 §3.2; SEG-bf26caee-p618 §6",CRM/solicitações,/management/interests; /management/crm/leads; /management/crm/leads/{lead},"investors/contacts/leads/tasks, OpportunityContacts, acompanhamento interno existente. 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/reused-evidence-integrity.json: 35 recibos anteriores com hashes correspondentes; o âmbito de cada recibo permanece limitado ao critério ensaiado. outputs/investmoz-audit-current-20261012/http-promoter.json; http-validator.json; http-publisher.json; http-manager.json. outputs/investmoz-audit-current-20261012/contact-normalization-http.json; contact-whitespace-before.json; contact-whitespace-after.json. C131 corrigido apenasQA; validação HTTP curta já era protegida por TrimStrings.,Implementado com falha,"Acompanhamento interno A/B válido. Restam conversão sem duplicação, responsável e próxima tarefa por outros consumidores. C131: normalizar antes de validar contacto, repetição e nova sessão demonstradas por HTTP; apresentação visual atual pendente.",Relações mestre/contexto e autorizações; não depende de CRM externo. C131 sóQA. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,"AUD-CRM-01: Converter sem duplicar investidor; responsável autorizado; próxima tarefa antes de encerrar última | Para consolidação: critérios individuais S01–S19 e cenários A/B na proposta, com UI→API→gravação→nova sessão→resultado e ação independente.",P0,"AUD-CRM-01: Relatórios históricos mantidos; estado ativo apurado por leitura nesta auditoria @@ -10518,9 +10518,9 @@ 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.",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",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.","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,"Inventário reconciliado: 17 artigos e cinco imagens publicados; 31 artigos com corpo por integrar (5 setoriais, 8 trabalho doméstico, 18 históricos/noticiosos); Mercado Financeiro vazio e post 74364 sem título separados. Onze variantes de URL e 43 capturas adicionais de artigos já cobertas, sem novas identidades. Demais referências, anexos técnicos e sitemap misto conservam recorte próprio.",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.,URL antigo recupera a mesma fonte; login/retorno preservam a escolha; nova sessão recupera; nenhuma mistura entre projetos nem conversão de roteiro legado.,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-06,1,"[{""id"":""USR-LEG-20261010-06"",""pedido"":""Preservar contexto ao entrar/regressar ao percurso, URLs existentes e correspondências de migração"",""fontes"":[""Pedido direto10/10/2026 §6""],""aceitacao"":""URL antigo recupera a mesma fonte; login/retorno preservam a escolha; nova sessão recupera; nenhuma mistura entre projetos nem conversão de roteiro legado."",""estado"":""parcial"",""variantes"":""IntegraçãoprogressivaQA, sem substituição de pendências anteriores"",""modulo"":""legado/biblioteca/percurso"",""confirmacao_manual"":{""recebida_em"":""2026-10-10"",""fonte"":""Mensagem do responsável nesta conversa"",""conta"":""não indicada"",""perfil"":""não indicado"",""dispositivo"":""não indicado"",""criterios"":[{""criterio"":""criar_ou_escolher_dossier"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""guardar_referencia"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""nova_sessao"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""recuperar_dossier"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""abrir_artigo"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""}],""exclusoes"":[""móvel"",""acessibilidade"",""outros perfis"",""C37 conta18"",""cenários A/B"",""cobertura integral""]},""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""]},""incremento_visual_qa_20261010"":{""atualizado_em"":""2026-10-10T17:57:54.604301+00:00"",""ambito"":""QA18097/55441 exclusivamente"",""evidencia"":""FalhasC77–C83 corrigidas emQA: landmarks, nomeARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal/hash, tabelas financeiras focáveis por teclado, reflow de tarefas/select/data no dossier, langpt-MZ apenas no routerQA e proteção da recuperação assíncrona do simulador. Após correções15execuções axe/390–320–1440px,0violações automáticas/0overflow e idiomaPT; skiplink primeiroTab→conteúdo em3páginas; tabelas financeiras focadas/teclas no Chromium. Não equivale a leitor de ecrã, zoom/dispositivo real ou cobertura de todo oportal. LegacyContentTest5/84 e rastreioMFA1/14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos."",""lacuna_atual"":""Cobertura integral, mais perfis/dispositivos, leitor de ecrã e editor administrativoC74 não demonstrados. Mercado Financeiro permanece privado/corpo vazio confirmado na origem; rotas404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia/Mineração."",""estado_global_preservado"":""parcial"",""ativacao"":false}}]","[Interface legado QA 10 /10/2026 ] Render /cliques observados no Chromium QA, com recuperação noutra sessão /F5 e negação à conta 23. Não é o navegador pessoal do utilizador nem o ensaio C37 /QA18. | Evidência anterior preservada: React preparado e build QA; dados Inertia recuperados. Navegador indisponível; roteiro manual em legado-piloto-qa.md . Aceitação visual pendente. | [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 Inertia 200. Chromium desktop:16 artigos, pesquisa /imagens , Energia e Mineração distintas, C72 título preservado; QA21 criou 4 dossiers, retorno, logout /novaMFA/F5/replay ; QA23 negado 403 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. | [Visual QA 10 /10/2026 ] Leitura pública /móvel dirigida, teclado e 4 consumidores do mapa demonstrados;15 execuções de acessibilidade sem violação automática. | [Visual QA 10/10/2026] Leitura pública/móvel dirigida, teclado e4consumidores do mapa demonstrados;15execuções de acessibilidade semviolação automática.","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. | [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.","[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. | [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.",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-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",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.","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 | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",Implementado parcialmente — entradas setoriais e três artigos ativos,"Inventário reconciliado: 17 artigos e cinco imagens publicados; 31 artigos com corpo por integrar (5 setoriais, 8 trabalho doméstico, 18 históricos/noticiosos); Mercado Financeiro vazio e post 74364 sem título separados. Onze variantes de URL e 43 capturas adicionais de artigos já cobertas, sem novas identidades. Demais referências, anexos técnicos e sitemap misto conservam recorte próprio.",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.,URL antigo recupera a mesma fonte; login/retorno preservam a escolha; nova sessão recupera; nenhuma mistura entre projetos nem conversão de roteiro legado.,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-06,1,"[{""id"":""USR-LEG-20261010-06"",""pedido"":""Preservar contexto ao entrar/regressar ao percurso, URLs existentes e correspondências de migração"",""fontes"":[""Pedido direto10/10/2026 §6""],""aceitacao"":""URL antigo recupera a mesma fonte; login/retorno preservam a escolha; nova sessão recupera; nenhuma mistura entre projetos nem conversão de roteiro legado."",""estado"":""parcial"",""variantes"":""IntegraçãoprogressivaQA, sem substituição de pendências anteriores"",""modulo"":""legado/biblioteca/percurso"",""confirmacao_manual"":{""recebida_em"":""2026-10-10"",""fonte"":""Mensagem do responsável nesta conversa"",""conta"":""não indicada"",""perfil"":""não indicado"",""dispositivo"":""não indicado"",""criterios"":[{""criterio"":""criar_ou_escolher_dossier"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""guardar_referencia"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""nova_sessao"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""recuperar_dossier"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""abrir_artigo"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""}],""exclusoes"":[""móvel"",""acessibilidade"",""outros perfis"",""C37 conta18"",""cenários A/B"",""cobertura integral""]},""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""]},""incremento_visual_qa_20261010"":{""atualizado_em"":""2026-10-10T17:57:54.604301+00:00"",""ambito"":""QA18097/55441 exclusivamente"",""evidencia"":""FalhasC77–C83 corrigidas emQA: landmarks, nomeARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal/hash, tabelas financeiras focáveis por teclado, reflow de tarefas/select/data no dossier, langpt-MZ apenas no routerQA e proteção da recuperação assíncrona do simulador. Após correções15execuções axe/390–320–1440px,0violações automáticas/0overflow e idiomaPT; skiplink primeiroTab→conteúdo em3páginas; tabelas financeiras focadas/teclas no Chromium. Não equivale a leitor de ecrã, zoom/dispositivo real ou cobertura de todo oportal. LegacyContentTest5/84 e rastreioMFA1/14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos."",""lacuna_atual"":""Cobertura integral, mais perfis/dispositivos, leitor de ecrã e editor administrativoC74 não demonstrados. Mercado Financeiro permanece privado/corpo vazio confirmado na origem; rotas404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia/Mineração."",""estado_global_preservado"":""parcial"",""ativacao"":false}}]","[Interface legado QA 10 /10/2026 ] Render /cliques observados no Chromium QA, com recuperação noutra sessão /F5 e negação à conta 23. Não é o navegador pessoal do utilizador nem o ensaio C37 /QA18. | Evidência anterior preservada: React preparado e build QA; dados Inertia recuperados. Navegador indisponível; roteiro manual em legado-piloto-qa.md . Aceitação visual pendente. | [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 Inertia 200. Chromium desktop:16 artigos, pesquisa /imagens , Energia e Mineração distintas, C72 título preservado; QA21 criou 4 dossiers, retorno, logout /novaMFA/F5/replay ; QA23 negado 403 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. | [Visual QA 10 /10/2026 ] Leitura pública /móvel dirigida, teclado e 4 consumidores do mapa demonstrados;15 execuções de acessibilidade sem violação automática. | [Visual QA 10/10/2026] Leitura pública/móvel dirigida, teclado e4consumidores do mapa demonstrados;15execuções de acessibilidade semviolação automática.","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. | [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.","[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. | [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.",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.","Inventário reconciliado: 20 artigos e cinco imagens publicados; 28 artigos com corpo por integrar (2 setoriais, 8 trabalho doméstico, 18 históricos/noticiosos); Mercado Financeiro vazio e post 74364 sem título separados. Onze variantes de URL e 43 capturas adicionais de artigos já cobertas, sem novas identidades. Demais referências, anexos técnicos e sitemap misto conservam recorte próprio. | 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. +[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. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","Inventário reconciliado: 20 artigos e cinco imagens publicados; 28 artigos com corpo por integrar (2 setoriais, 8 trabalho doméstico, 18 históricos/noticiosos); Mercado Financeiro vazio e post 74364 sem título separados. Onze variantes de URL e 43 capturas adicionais de artigos já cobertas, sem novas identidades. Demais referências, anexos técnicos e sitemap misto conservam recorte próprio. | 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.","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. | 15/10/2026: outputs/investmoz-legado-inventario-reconciliado-20261015/SALDO-LEGADO.md; RECONCILIACAO-LEGADO.json; LEITURA-ESTADO.json; inventários existentes atualizados por identidade/versão/hash. | 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. | 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. @@ -10528,7 +10528,7 @@ AUD-LEG-06,"Preservar contexto ao entrar/regressar ao percurso, URLs existentes [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.",documentos e legado,15/10/2026 — fecho do piloto ativo e preparação por leitura dos restantes setores; sem novos testes funcionais.,,,"[Visual QA 10/10/2026] Cobertura integral, mais perfis/dispositivos, leitor de ecrã e editor administrativoC74 não demonstrados. Mercado Financeiro permanece privado/corpo vazio confirmado na origem; rotas404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia/Mineração. | Histórico preservado: [Visual QA 10 /10/2026 ] Cobertura integral, mais perfis /dispositivos , leitor de ecrã e editor administrativo C74 não demonstrados. Mercado Financeiro permanece privado /corpo vazio confirmado na origem; rotas 404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia /Mineração. | Histórico preservado: 17 caminhos com texto preservados incluindo agronegócio e 4 novos retornos; restante mapa URL /aliases/acervo ainda incompleto. C37 /QA18 e A /B não encerrados. | Histórico anterior: Contexto /retorno do piloto observados; mapa de migração dos restantes URL s ainda pendente. C37 /QA18 e cenários A /B completos não foram executados neste 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.,Mantido /agronegocio; /explorar/agronegocio novo. Referência comID/hash/versão/ator/data e retorno autorizado ao mesmo dossier; replay sem duplicação; cinco fases/19etapas conservadas.,"[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. Conta 23: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 : recursos 6 /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 Inertia 200. Chromium desktop:16 artigos, pesquisa /imagens , Energia e Mineração distintas, C72 título preservado; QA21 criou 4 dossiers, retorno, logout /novaMFA/F5/replay ; QA23 negado 403 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. | [Visual QA 10 /10/2026 ] Falhas C77 – C83 corrigidas em QA: landmarks, nome ARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal /hash , tabelas financeiras focáveis por teclado, reflow de tarefas /select/data no dossier, langpt-MZ apenas no router QA e proteção da recuperação assíncrona do simulador. Após correções 15 execuções axe /390 –320–1440 px,0 violações automáticas /0overflow e idioma PT; skiplink primeiro Tab→conteúdo em 3 páginas; tabelas financeiras focadas /teclas no Chromium . Não equivale a leitor de ecrã, zoom /dispositivo real ou cobertura de todo oportal. Legacy Content Test 5 /84 e rastreio MFA 1 /14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos. | [Visual QA 10/10/2026] FalhasC77–C83 corrigidas emQA: landmarks, nomeARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal/hash, tabelas financeiras focáveis por teclado, reflow de tarefas/select/data no dossier, langpt-MZ apenas no routerQA e proteção da recuperação assíncrona do simulador. Após correções15execuções axe/390–320–1440px,0violações automáticas/0overflow e idiomaPT; skiplink primeiroTab→conteúdo em3páginas; tabelas financeiras focadas/teclas no Chromium. Não equivale a leitor de ecrã, zoom/dispositivo real ou cobertura de todo oportal. LegacyContentTest5/84 e rastreioMFA1/14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos.","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.","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. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",documentos e legado,15/10/2026 — fecho do piloto ativo e preparação por leitura dos restantes setores; sem novos testes funcionais.,,,"[Visual QA 10/10/2026] Cobertura integral, mais perfis/dispositivos, leitor de ecrã e editor administrativoC74 não demonstrados. Mercado Financeiro permanece privado/corpo vazio confirmado na origem; rotas404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia/Mineração. | Histórico preservado: [Visual QA 10 /10/2026 ] Cobertura integral, mais perfis /dispositivos , leitor de ecrã e editor administrativo C74 não demonstrados. Mercado Financeiro permanece privado /corpo vazio confirmado na origem; rotas 404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia /Mineração. | Histórico preservado: 17 caminhos com texto preservados incluindo agronegócio e 4 novos retornos; restante mapa URL /aliases/acervo ainda incompleto. C37 /QA18 e A /B não encerrados. | Histórico anterior: Contexto /retorno do piloto observados; mapa de migração dos restantes URL s ainda pendente. C37 /QA18 e cenários A /B completos não foram executados neste 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.,Mantido /agronegocio; /explorar/agronegocio novo. Referência comID/hash/versão/ator/data e retorno autorizado ao mesmo dossier; replay sem duplicação; cinco fases/19etapas conservadas.,"[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. Conta 23: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 : recursos 6 /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 Inertia 200. Chromium desktop:16 artigos, pesquisa /imagens , Energia e Mineração distintas, C72 título preservado; QA21 criou 4 dossiers, retorno, logout /novaMFA/F5/replay ; QA23 negado 403 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. | [Visual QA 10 /10/2026 ] Falhas C77 – C83 corrigidas em QA: landmarks, nome ARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal /hash , tabelas financeiras focáveis por teclado, reflow de tarefas /select/data no dossier, langpt-MZ apenas no router QA e proteção da recuperação assíncrona do simulador. Após correções 15 execuções axe /390 –320–1440 px,0 violações automáticas /0overflow e idioma PT; skiplink primeiro Tab→conteúdo em 3 páginas; tabelas financeiras focadas /teclas no Chromium . Não equivale a leitor de ecrã, zoom /dispositivo real ou cobertura de todo oportal. Legacy Content Test 5 /84 e rastreio MFA 1 /14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos. | [Visual QA 10/10/2026] FalhasC77–C83 corrigidas emQA: landmarks, nomeARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal/hash, tabelas financeiras focáveis por teclado, reflow de tarefas/select/data no dossier, langpt-MZ apenas no routerQA e proteção da recuperação assíncrona do simulador. Após correções15execuções axe/390–320–1440px,0violações automáticas/0overflow e idiomaPT; skiplink primeiroTab→conteúdo em3páginas; tabelas financeiras focadas/teclas no Chromium. Não equivale a leitor de ecrã, zoom/dispositivo real ou cobertura de todo oportal. LegacyContentTest5/84 e rastreioMFA1/14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos.","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. | Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores.","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.",,,Incremento contextual QA para revisão; sem integração main/activação fiscal. AUD-LEG-07,"Verificar imagens, anexos, links, pesquisa, permissões e duplicações, registando aceitação visual separadamente","Pedido direto do responsável,10/10/2026, integração do legado emQA §7; 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.","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,"Inventário reconciliado: 17 artigos e cinco imagens publicados; 31 artigos com corpo por integrar (5 setoriais, 8 trabalho doméstico, 18 históricos/noticiosos); Mercado Financeiro vazio e post 74364 sem título separados. Onze variantes de URL e 43 capturas adicionais de artigos já cobertas, sem novas identidades. Demais referências, anexos técnicos e sitemap misto conservam recorte próprio.",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.,Cada consumidor apresenta ficheiro/link/resultado íntegro; importação/pesquisa/recuperação/permissões verificadas e resultados visuais registados por ação.,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-07,1,"[{""id"":""USR-LEG-20261010-07"",""pedido"":""Verificar imagens, anexos, links, pesquisa, permissões e duplicações, registando aceitação visual separadamente"",""fontes"":[""Pedido direto10/10/2026 §7""],""aceitacao"":""Cada consumidor apresenta ficheiro/link/resultado íntegro; importação/pesquisa/recuperação/permissões verificadas e resultados visuais registados por ação."",""estado"":""parcial"",""variantes"":""IntegraçãoprogressivaQA, sem substituição de pendências anteriores"",""modulo"":""legado/biblioteca/percurso"",""confirmacao_manual"":{""recebida_em"":""2026-10-10"",""fonte"":""Mensagem do responsável nesta conversa"",""conta"":""não indicada"",""perfil"":""não indicado"",""dispositivo"":""não indicado"",""criterios"":[{""criterio"":""guardar_referencia"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""recuperar_dossier"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""},{""criterio"":""abrir_artigo"",""estado"":""confirmado manualmente"",""ambito"":""piloto agronegócio QA""}],""exclusoes"":[""móvel"",""acessibilidade"",""outros perfis"",""C37 conta18"",""cenários A/B"",""cobertura integral""]},""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""]},""incremento_visual_qa_20261010"":{""atualizado_em"":""2026-10-10T17:57:54.604301+00:00"",""ambito"":""QA18097/55441 exclusivamente"",""evidencia"":""FalhasC77–C83 corrigidas emQA: landmarks, nomeARIA do mapa, hierarquia de títulos do texto legado sem alteraroriginal/hash, tabelas financeiras focáveis por teclado, reflow de tarefas/select/data no dossier, langpt-MZ apenas no routerQA e proteção da recuperação assíncrona do simulador. Após correções15execuções axe/390–320–1440px,0violações automáticas/0overflow e idiomaPT; skiplink primeiroTab→conteúdo em3páginas; tabelas financeiras focadas/teclas no Chromium. Não equivale a leitor de ecrã, zoom/dispositivo real ou cobertura de todo oportal. LegacyContentTest5/84 e rastreioMFA1/14 são provas específicas, não contagem substituta de percursos. visual-followup-chromium-20261010.json e screenshots; históricos de falhas mantidos."",""lacuna_atual"":""Cobertura integral, mais perfis/dispositivos, leitor de ecrã e editor administrativoC74 não demonstrados. Mercado Financeiro permanece privado/corpo vazio confirmado na origem; rotas404. Sem associação automática Turismo→cadastro territorial, sem fundir Energia/Mineração."",""estado_global_preservado"":""parcial"",""ativacao"":false}}]","[Interface legado QA 10 /10/2026 ] Render /cliques observados no Chromium QA, com recuperação noutra sessão /F5 e negação à conta 23. Não é o navegador pessoal do utilizador nem o ensaio C37 /QA18. | Evidência anterior preservada: React preparado e build QA; dados Inertia recuperados. Navegador indisponível; roteiro manual em legado-piloto-qa.md . Aceitação visual pendente. | [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 Inertia 200. Chromium desktop:16 artigos, pesquisa /imagens , Energia e Mineração distintas, C72 título preservado; QA21 criou 4 dossiers, retorno, logout /novaMFA/F5/replay ; QA23 negado 403 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. | [Visual QA 10 /10/2026 ] Leitura pública /móvel dirigida, teclado e 4 consumidores do mapa demonstrados;15 execuções de acessibilidade sem violação automática. | [Visual QA 10/10/2026] Leitura pública/móvel dirigida, teclado e4consumidores do mapa demonstrados;15execuções de acessibilidade semviolação automática.","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. | [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.","[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. | [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.",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.","Inventário reconciliado: 20 artigos e cinco imagens publicados; 28 artigos com corpo por integrar (2 setoriais, 8 trabalho doméstico, 18 históricos/noticiosos); Mercado Financeiro vazio e post 74364 sem título separados. Onze variantes de URL e 43 capturas adicionais de artigos já cobertas, sem novas identidades. Demais referências, anexos técnicos e sitemap misto conservam recorte próprio. | 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. @@ -10652,9 +10652,9 @@ AUD-SEARCH-T10,Consistência transversal da pesquisa e navegação — Bibliotec AUD-SEARCH-T11,Consistência transversal da pesquisa e navegação — Legislação,Instruções expressas da Tempo na conversa de 20/10/2026; AGENTS.md; RF-MN-010 e AUD-GEO-01 preservados.,navegação/pesquisa,/legislacao,portal/services; portal/document — Reutiliza a correcção da biblioteca e preserva filtros jurídicos/documentais pertinentes.,Sem alteração remota nesta execução; revisão apenas na branch codex/opportunity-search.,HTTP/Inertia: resources.total=0; consumidor e query pública partilhados.,QA — delta delimitado; revisão Tempo pendente,"Situação jurídica, consulta e cálculo continuam independentes.",,"Filtros, contagem, resultados e URL coerentes; universos identificados; erro distinto de vazio; permissões e contexto conservados.",P1,,RF-MN-010; AUD-GEO-01,,,,,,,,,,,Mesmo padrão da biblioteca; não deve expor um universo concorrente.,"Situação jurídica, consulta e cálculo continuam independentes.",portal/services; portal/document; SearchState; SearchFeedback; TerritoryFields; portalNavigation,,"Integração em main apenas após revisão; assistência NLP, contratos e P7 separados.",Correcção/simplificação em QA,,HTTP/Inertia: resources.total=0; consumidor e query pública partilhados.,Pesquisa transversal QA 20/10/2026,20/10/2026,,,,,,,,,,"Provas comuns cobrem o componente reutilizado; HTTP vazio não demonstra operações de gestão ou publicação. Situação jurídica, consulta e cálculo continuam independentes.",,falha funcional; navegação; apresentação visual,,Disponível para revisão na aplicação QA local. AUD-GUIDE-CARD-20261020,"Related educational cards: image, source summary, clear actions",Tempo 20/10/2026; independent delta after 0e7d51f18fb4,educational presentation,/sectores/{slug}; /explorar/{group}; articles; /oportunidades and detail,EducationalArticleCard; EducationalGuides; LegacyContent; SectorInvestment,QA only,1 test / 8 assertions; PHP syntax; TypeScript/build; desktop2048/mobile390; keyboard,QA review pending,Normal QA sector and article verified against existing library resource 10 and local image 25; previous dossier proof retained,,Source-derived summary; public images; conditional opportunity action; context preserved,P1,,,,,,,,,,,,,,,,,,presentation,,,,20/10/2026,,,,,,,,,,,,content; navigation; visual presentation,,Ready for QA review AUD-SIM-INT01,Invalid one-off fiscal date can throw instead of returning validation state,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Fixed in QA; invalid-date checks; 38 directed frontend tests passed,Previous inline-date proof retained; unchanged delta not repeated,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P0,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,, | [Saldo consolidado21/10/2026] Concluído no recorte. Nenhum delta de validação de data por demonstrar; prova anterior preservada. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.,,20/10/2026,,,,,,,,,,,,,, -AUD-SIM-INT02,Review actual fiscal parameters sources periods and eligibility,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Verification pending; no parameter activation,Recorte IVA geral sobre base declarada disponibilizado: 4a4d1212 integrado na revisao servida d3fe8a02; regra real v1 publicada e consumidor activo. Nao conclui o simulador fiscal integral.,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P0,,,,,,,,,,,,,,"Nenhuma operacao de disponibilizacao pendente neste lote delimitado. Outras componentes, regimes e coberturas fiscais permanecem fora do recorte; nao repetir provas aceites.",,,"Tempo autorizou incorporacao de 4a4d1212, cadastro/publicacao da regra real e activacao. Mesma administracao real nala@tempo.co.mz, login normal e MFA, sem quatro designacoes; sem parecer juridico ou revisao independente atribuidos a Tempo.",Ligacao de consumidor publicada concluida em QA; decisoes operacionais separadas.,Recorte executado; sem saldo de implementacao ou disponibilizacao identificado neste lote. Nao converter estimativas anteriores em implementacao fiscal integral.," | [Leitura SSH 21/10/2026 08:17 Maputo] Zero regras em simulation_tax_rule_versions na homologação, incluindo todos os estados por leitura administrativa sem ocultação RLS. Seis referências em investment_legal_sources; não são parâmetros executáveis. QA também tinha zero regras. BEGIN READ ONLY/SELECT/ROLLBACK; zero escritas. Prova homologation-fiscal-readonly.json. O git HEAD registado é do checkout consultado, não certifica a revisão do build servido. A ausência de cadastro não é ausência de fontes oficiais nem reabre a aceitação da Tempo de 08/10. Não implementa a ligação funcional ao motor fiscal. | [Saldo consolidado21/10/2026] Parcial. Leitura remota concluída: zero regras de todos os estados na homologação, tal como QA; seis referências jurídicas não são parâmetros executáveis. Falta cadastro fundamentado por componente/âmbito/período e ligação funcional ao motor fiscal. Fontes e análises existentes reutilizáveis; aceitação oficial da Tempo de08/10 preservada. Não activar taxas nem importar/publicar por esta reconciliação. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Candidata21/10/2026] Diagnóstico fiscal separado no manual existente: fontes/analises já disponíveis; zero parâmetros executáveis na QA e homologação por leitura de todos os estados; governação/resolvedor temporal/DSL existentes; RunSimulation ainda aritmética personalizada sem consumir regras fiscais. Saldo: cadastro fundamentado, orquestração, contrato de resultado/histórico e ligação ao dossier/relatório, com casos por componente/período. Nenhuma regra criada nem activada; implementação fiscal integral aberta e excluída das1–2h de exportações. | [Proposta21/10/2026] Primeiro lote proposto: uma regra IVA geral sobre base liquida/MZN, cobertura demonstrada2026 sem inventar caducidade legal. Reutilizar fontes/analises/governacao/resolvedor/avaliador existentes; arredondamento e ambito aplicavel explicitamente por fundamentar antes de publicar. Cadastro4-8h e codigo/aceitacao12-20h, total16-28h condicionado ao acervo, separado das1-2h de exportacao. Criterios e exclusoes no manual existente. Nenhuma regra cadastrada/activada; nao e implementacao fiscal integral. | [QA IVA v1.2 21/10/2026] Orientacao posterior Tempo: calcular com precisao decimal exacta sem arredondamento automatico, separando apresentacao monetaria; arredondamento generico deixa de ser bloqueio deste lote. Cadastro draft versionado em clone QA; resolvedor/avaliador existentes; proveniencia, historico e relatorio imutavel ligados. 5 feature (51 assercoes), 7 unit (25), 3 frontend; types/build/Pint aprovados. Contexto declarado; nao e saldo a pagar. Zero regras publicadas; sem main/activacao. Recorte QA autorizado verificado (0h engenharia identificada restante); produto fiscal integral continua parcial. Limites e provas no mesmo manual e ficha v1.2; sem atribuicao de validacao juridica ao utilizador. | [Revisao 83d2f97d] Ambito/periodo/exclusoes e procedimentos de integracao, publicacao, activacao e suspensao consolidados no mesmo manual. Lacuna concreta de ecra QA fechada: entradas 1000.03/MZN/2026-10-21; calculo exacto 160.0048; gravacao fa6d17f2-5f47-4cb6-b8cb-40850c12505f; recarga; recuperacao do mesmo ID; relatorio d13e2ad5-3ba8-4d01-9d30-5815496da774 com mesmo valor/proveniencia e hash igual ao resultado. Uma execucao persistida, draft e zero regras publicadas. 1 teste novo de rota/17 assercoes, TypeScript/build e browser aprovados; restantes provas reutilizadas. Interrupcao inicial da ferramenta resolvida, sem atribuicao de falha ao simulador. Revisao do recorte demonstrada; sem nova preparacao generica identificada, main ou activacao; nao fecha aplicabilidade fiscal universal nem simulador integral. | 21/10/2026: proposta do consumidor IVA no simulador existente no manual: falta ligacao a regra publicada e activacao explicita. Integrar codigo desligado, publicar versao e activar consumidor sao tres operacoes distintas. Reutiliza permissoes, governanca, historico e provas aceites; sem ampliar cobertura ou executar estas operacoes. | 21/10/2026: implementado delta de 2ced7b79 no simulador normal QA, activacao desligada por omissao. 8 testes/75 assercoes, 2 testes frontend novos, TypeScript/build/Pint. Edge: indeterminacao, calculo, repeticao sem duplicar, fila admitida antes de suspensao concluida depois, nova execucao recusada e historicos/relatorios preservados. Mesmo manual e recibo consolidam provas e tres operacoes. Fixture isolada suspensa; sem merge ou publicacao/activacao na homologacao. | 21/10/2026: origem da condicao fiscal localizada em e65cb269/servico/CHECKs de 03/10 e nota de implementacao; sem decisao expressa aplicavel encontrada. Correccao QA: administracao existente, mesma pessoa, fonte oficial identificada e eventos preservados. 6 testes/86 assercoes apenas do controlo, sem calculos/exportadores; constraints de outras tabelas iguais. Esquema activo nao alterado; backup/restauro de 171 tabelas confirmado; sem fixture ou publicacao real. | [Execucao autorizada 21/10/2026 10:56 UTC] Servido d3fe8a02ec7f5dcd01984c4f4a1eba18b5a0cf19 contendo 4a4d1212; DDL fiscal aplicado autenticadamente com backup/restauro de171tabelas e registos preservados. Tres fontes reais v1 com hashes/citacoes e aceitacao fiscal Tempo08/10/2026, sem validacao geral automatica. Regra IVA-GERAL-BASE-LIQUIDA rule_version1, ID01a15e1a-5338-700f-8a45-f87707d696a7, published, version_no5, actor15 emtodasetapas;5eventos. Activacao separada ligada a esseID/versao; APIHTTP200 enabled=true e resolvedor16percent no contexto delimitado sem calculo novo. FixtureQA nao importada; calculos/exportadores/PDF aceites nao repetidos. Suspensao de novas admissoes conserva snapshots/historicos/relatorios. Recibo e manual existentes actualizados; limitacoes de abertura de consola/extensao registadas como ferramenta. | [Diagnostico IVA QA21/10/2026] Falha estrutural reproduzida na consulta anual: fiscal_operation nao satisfaz operation e moeda nao era comunicada. Sem presumir respostas originais. Cada condicao tem campo/recebido/esperado/categoria; notas junto ao campo, resumo com foco e Ver fundamento semDSL/codigo. Moeda fiscal explicita, sem conversao/copia.5unitarios24assercoes+1API16assercoes, Edge comUSD dirigido preservado apos recuperacao; fixtureQA v3suspensa, consumidorQAoff. Nao altera regra/activacao da homologacao; calculos e exportadores nao repetidos. Branch codex/iva-diagnostics-QA. | [IVA mensal QA21/10/2026] Vendas por produto/mes reutilizadas; base liquida explicita; versao publicada seleccionada no servidor, sem taxa/manual no formulario. Zero distinto de falta; preco com IVA indeterminado. Actualizacao dependente cria versao, historicos/relatorios preservados. IVA separado de recebimentos/custos/imposto final; manual apenas cenario personalizado. 3API/46assercoes+4frontend e Edge: vendas alteradas, bruto, zero, falta, recuperacao e relatorio. Fixture sintetica v4 ligada apenas no clone QA para revisao. Sem main/HML ou alargamento fiscal; provas anteriores reutilizadas. Mesmo manual/recibo; branch codex/iva-monthly-projection-QA. | [Modelo A QA21/10/2026] Exemplar Tempo e imagem incorporada conferidos/preservados privados na biblioteca QA, hashes/scans/idempotencia; quadros e campos01-27 mapeados no mesmo registo. Componente01/02 existente; apuramento14-18 indeterminado. Correspondencia consultavel e compras/encomendas reutilizadas sem fabricar base/IVA/deducao. Divergencias de remissao registadas; edicao vigente nao afirmada.3testes novos/types/build/Edge; calculo/exportadores aceites reutilizados. Delta seguinte8-16h cadastro+20-36h codigo, condicionado e sem creditos/substituicao/pagamento/reembolso; nao e cobertura integral. Sem main/HML, nova regra publicada ou activacao. Ver docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md.",,20/10/2026,,,,,,,,,,,,,, +AUD-SIM-INT02,Review actual fiscal parameters sources periods and eligibility,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,"Verification pending; no parameter activation | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",Recorte IVA geral sobre base declarada disponibilizado: 4a4d1212 integrado na revisao servida d3fe8a02; regra real v1 publicada e consumidor activo. Nao conclui o simulador fiscal integral.,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P0,,,,,,,,,,,,,"22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.","Nenhuma operacao de disponibilizacao pendente neste lote delimitado. Outras componentes, regimes e coberturas fiscais permanecem fora do recorte; nao repetir provas aceites.",,,"Tempo autorizou incorporacao de 4a4d1212, cadastro/publicacao da regra real e activacao. Mesma administracao real nala@tempo.co.mz, login normal e MFA, sem quatro designacoes; sem parecer juridico ou revisao independente atribuidos a Tempo.",Ligacao de consumidor publicada concluida em QA; decisoes operacionais separadas.,Recorte executado; sem saldo de implementacao ou disponibilizacao identificado neste lote. Nao converter estimativas anteriores em implementacao fiscal integral.,"[Leitura SSH 21/10/2026 08:17 Maputo] Zero regras em simulation_tax_rule_versions na homologação, incluindo todos os estados por leitura administrativa sem ocultação RLS. Seis referências em investment_legal_sources; não são parâmetros executáveis. QA também tinha zero regras. BEGIN READ ONLY/SELECT/ROLLBACK; zero escritas. Prova homologation-fiscal-readonly.json. O git HEAD registado é do checkout consultado, não certifica a revisão do build servido. A ausência de cadastro não é ausência de fontes oficiais nem reabre a aceitação da Tempo de 08/10. Não implementa a ligação funcional ao motor fiscal. | [Saldo consolidado21/10/2026] Parcial. Leitura remota concluída: zero regras de todos os estados na homologação, tal como QA; seis referências jurídicas não são parâmetros executáveis. Falta cadastro fundamentado por componente/âmbito/período e ligação funcional ao motor fiscal. Fontes e análises existentes reutilizáveis; aceitação oficial da Tempo de08/10 preservada. Não activar taxas nem importar/publicar por esta reconciliação. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Candidata21/10/2026] Diagnóstico fiscal separado no manual existente: fontes/analises já disponíveis; zero parâmetros executáveis na QA e homologação por leitura de todos os estados; governação/resolvedor temporal/DSL existentes; RunSimulation ainda aritmética personalizada sem consumir regras fiscais. Saldo: cadastro fundamentado, orquestração, contrato de resultado/histórico e ligação ao dossier/relatório, com casos por componente/período. Nenhuma regra criada nem activada; implementação fiscal integral aberta e excluída das1–2h de exportações. | [Proposta21/10/2026] Primeiro lote proposto: uma regra IVA geral sobre base liquida/MZN, cobertura demonstrada2026 sem inventar caducidade legal. Reutilizar fontes/analises/governacao/resolvedor/avaliador existentes; arredondamento e ambito aplicavel explicitamente por fundamentar antes de publicar. Cadastro4-8h e codigo/aceitacao12-20h, total16-28h condicionado ao acervo, separado das1-2h de exportacao. Criterios e exclusoes no manual existente. Nenhuma regra cadastrada/activada; nao e implementacao fiscal integral. | [QA IVA v1.2 21/10/2026] Orientacao posterior Tempo: calcular com precisao decimal exacta sem arredondamento automatico, separando apresentacao monetaria; arredondamento generico deixa de ser bloqueio deste lote. Cadastro draft versionado em clone QA; resolvedor/avaliador existentes; proveniencia, historico e relatorio imutavel ligados. 5 feature (51 assercoes), 7 unit (25), 3 frontend; types/build/Pint aprovados. Contexto declarado; nao e saldo a pagar. Zero regras publicadas; sem main/activacao. Recorte QA autorizado verificado (0h engenharia identificada restante); produto fiscal integral continua parcial. Limites e provas no mesmo manual e ficha v1.2; sem atribuicao de validacao juridica ao utilizador. | [Revisao 83d2f97d] Ambito/periodo/exclusoes e procedimentos de integracao, publicacao, activacao e suspensao consolidados no mesmo manual. Lacuna concreta de ecra QA fechada: entradas 1000.03/MZN/2026-10-21; calculo exacto 160.0048; gravacao fa6d17f2-5f47-4cb6-b8cb-40850c12505f; recarga; recuperacao do mesmo ID; relatorio d13e2ad5-3ba8-4d01-9d30-5815496da774 com mesmo valor/proveniencia e hash igual ao resultado. Uma execucao persistida, draft e zero regras publicadas. 1 teste novo de rota/17 assercoes, TypeScript/build e browser aprovados; restantes provas reutilizadas. Interrupcao inicial da ferramenta resolvida, sem atribuicao de falha ao simulador. Revisao do recorte demonstrada; sem nova preparacao generica identificada, main ou activacao; nao fecha aplicabilidade fiscal universal nem simulador integral. | 21/10/2026: proposta do consumidor IVA no simulador existente no manual: falta ligacao a regra publicada e activacao explicita. Integrar codigo desligado, publicar versao e activar consumidor sao tres operacoes distintas. Reutiliza permissoes, governanca, historico e provas aceites; sem ampliar cobertura ou executar estas operacoes. | 21/10/2026: implementado delta de 2ced7b79 no simulador normal QA, activacao desligada por omissao. 8 testes/75 assercoes, 2 testes frontend novos, TypeScript/build/Pint. Edge: indeterminacao, calculo, repeticao sem duplicar, fila admitida antes de suspensao concluida depois, nova execucao recusada e historicos/relatorios preservados. Mesmo manual e recibo consolidam provas e tres operacoes. Fixture isolada suspensa; sem merge ou publicacao/activacao na homologacao. | 21/10/2026: origem da condicao fiscal localizada em e65cb269/servico/CHECKs de 03/10 e nota de implementacao; sem decisao expressa aplicavel encontrada. Correccao QA: administracao existente, mesma pessoa, fonte oficial identificada e eventos preservados. 6 testes/86 assercoes apenas do controlo, sem calculos/exportadores; constraints de outras tabelas iguais. Esquema activo nao alterado; backup/restauro de 171 tabelas confirmado; sem fixture ou publicacao real. | [Execucao autorizada 21/10/2026 10:56 UTC] Servido d3fe8a02ec7f5dcd01984c4f4a1eba18b5a0cf19 contendo 4a4d1212; DDL fiscal aplicado autenticadamente com backup/restauro de171tabelas e registos preservados. Tres fontes reais v1 com hashes/citacoes e aceitacao fiscal Tempo08/10/2026, sem validacao geral automatica. Regra IVA-GERAL-BASE-LIQUIDA rule_version1, ID01a15e1a-5338-700f-8a45-f87707d696a7, published, version_no5, actor15 emtodasetapas;5eventos. Activacao separada ligada a esseID/versao; APIHTTP200 enabled=true e resolvedor16percent no contexto delimitado sem calculo novo. FixtureQA nao importada; calculos/exportadores/PDF aceites nao repetidos. Suspensao de novas admissoes conserva snapshots/historicos/relatorios. Recibo e manual existentes actualizados; limitacoes de abertura de consola/extensao registadas como ferramenta. | [Diagnostico IVA QA21/10/2026] Falha estrutural reproduzida na consulta anual: fiscal_operation nao satisfaz operation e moeda nao era comunicada. Sem presumir respostas originais. Cada condicao tem campo/recebido/esperado/categoria; notas junto ao campo, resumo com foco e Ver fundamento semDSL/codigo. Moeda fiscal explicita, sem conversao/copia.5unitarios24assercoes+1API16assercoes, Edge comUSD dirigido preservado apos recuperacao; fixtureQA v3suspensa, consumidorQAoff. Nao altera regra/activacao da homologacao; calculos e exportadores nao repetidos. Branch codex/iva-diagnostics-QA. | [IVA mensal QA21/10/2026] Vendas por produto/mes reutilizadas; base liquida explicita; versao publicada seleccionada no servidor, sem taxa/manual no formulario. Zero distinto de falta; preco com IVA indeterminado. Actualizacao dependente cria versao, historicos/relatorios preservados. IVA separado de recebimentos/custos/imposto final; manual apenas cenario personalizado. 3API/46assercoes+4frontend e Edge: vendas alteradas, bruto, zero, falta, recuperacao e relatorio. Fixture sintetica v4 ligada apenas no clone QA para revisao. Sem main/HML ou alargamento fiscal; provas anteriores reutilizadas. Mesmo manual/recibo; branch codex/iva-monthly-projection-QA. | [Modelo A QA21/10/2026] Exemplar Tempo e imagem incorporada conferidos/preservados privados na biblioteca QA, hashes/scans/idempotencia; quadros e campos01-27 mapeados no mesmo registo. Componente01/02 existente; apuramento14-18 indeterminado. Correspondencia consultavel e compras/encomendas reutilizadas sem fabricar base/IVA/deducao. Divergencias de remissao registadas; edicao vigente nao afirmada.3testes novos/types/build/Edge; calculo/exportadores aceites reutilizados. Delta seguinte8-16h cadastro+20-36h codigo, condicionado e sem creditos/substituicao/pagamento/reembolso; nao e cobertura integral. Sem main/HML, nova regra publicada ou activacao. Ver docs/investmoz/simulations/modelo-a-reconciliacao-20261021.md. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",,20/10/2026,,,,,,,,,,Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores.,,,,Incremento contextual QA para revisão; sem integração main/activação fiscal. AUD-SIM-INT03,Review isolation recovery across projects and sessions,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Existing controls and accepted proofs to reconcile; no leak established,Two dossiers and new login recovered in browser; cashflow persistence corrected and HTTP-tested; new visual cashflow delta pending,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P0,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,,"[Retoma 21/10/2026] QA 18576, clone simulator_review_delta_20261020_test: sessão sintética renovada por login normal; gravação autenticada e recarga recuperaram saldo 123, receita 900, custos 600, calendário mensal 10/vazio/0, crédito IVA estimado 500. Caixa conhecida 3713 MZN; total indeterminado desde mês 2; crédito estimado excluído da caixa. Prova visual cashflow-recovered-20261021.png e snapshot .txt em outputs/simulator-continuation-20261020. Não certifica recuperação destes novos valores após outro login, CSV/DOCX ou PDF nativo. Ligação de controlo do navegador perdida durante espera de download; não atribuir falha à aplicação. Leitura remota aguarda identificação da ligação SSH; zero alterações no destino. | [Saldo consolidado21/10/2026] Concluído no recorte. A/B, logout/novo login, recuperação e recusa pela aplicação demonstrados anteriormente. A tesouraria tem prova API de nova sessão e prova visual de recuperação por recarga. Não atribuir ao navegador nova sessão dos valores de tesouraria, nem nova certificação RLS; limites expressos conservados. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.",,20/10/2026,,,,,,,,,,,,,, -AUD-SIM-INT04,Review stale and historical results and correct dossier,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Existing versions/fingerprints; targeted verification pending,Historical results visible after fix; 12 and 24 recovered; hashes unchanged; synthetic temporal resolver versions verified in memory only,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P1,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,," | [Saldo consolidado21/10/2026] Concluído no recorte demonstrado. Histórico24/12 visível, hashes preservados e versões temporais sintéticas do resolvedor conferidas. Execução fiscal integrada com parâmetros reais pertence ao saldo de02 e não foi demonstrada por estes testes. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.",,20/10/2026,,,,,,,,,,,,,, +AUD-SIM-INT04,Review stale and historical results and correct dossier,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,"Existing versions/fingerprints; targeted verification pending | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",Historical results visible after fix; 12 and 24 recovered; hashes unchanged; synthetic temporal resolver versions verified in memory only,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P1,,,,,,,,,,,,,"22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",,,,,diagnosis and targeted corrections,,"[Saldo consolidado21/10/2026] Concluído no recorte demonstrado. Histórico24/12 visível, hashes preservados e versões temporais sintéticas do resolvedor conferidas. Execução fiscal integrada com parâmetros reais pertence ao saldo de02 e não foi demonstrada por estes testes. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | 22/10/2026: primeiro incremento QA na branch codex/project-context-continuity-QA; contexto único por dossier/conta, herança com edições preservadas, moeda/IVA mensal e análise territorial explícita. Ver traceability-and-manual.md, secção Continuidade e adaptação contextual. 4 HTTP/74 asserções; 8 frontend; percurso visual A/B e nova sessão. Não encerra adaptação jurídica integral.",,20/10/2026,,,,,,,,,,Catálogo visual sintético QA; ZEE/ZFI apenas controlos HTTP revertidos; condições/benefícios não executáveis indeterminados; sem ensaio visual integral dos outros consumidores.,,,,Incremento contextual QA para revisão; sem integração main/activação fiscal. AUD-SIM-INT05,Independent financial controls unknown zero units and currencies,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Reconciliation pending; no invented tax assumptions,Independent business-plan and cashflow ledgers passed; complete credit recipe included in screen and exports,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P1,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,,"[Retoma 21/10/2026] QA 18576, clone simulator_review_delta_20261020_test: sessão sintética renovada por login normal; gravação autenticada e recarga recuperaram saldo 123, receita 900, custos 600, calendário mensal 10/vazio/0, crédito IVA estimado 500. Caixa conhecida 3713 MZN; total indeterminado desde mês 2; crédito estimado excluído da caixa. Prova visual cashflow-recovered-20261021.png e snapshot .txt em outputs/simulator-continuation-20261020. Não certifica recuperação destes novos valores após outro login, CSV/DOCX ou PDF nativo. Ligação de controlo do navegador perdida durante espera de download; não atribuir falha à aplicação. Leitura remota aguarda identificação da ligação SSH; zero alterações no destino. | [Saldo consolidado21/10/2026] Concluído nos controlos delimitados. Controlos independentes de caixa/plano/crédito, zero/desconhecido e moedas preservados. Não são validação de taxas legais nem certificação de toda a contabilidade. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.",,20/10/2026,,,,,,,,,,,,,, AUD-SIM-INT06,Generated reports screen download and pagination,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Existing exporters; examples for this review still pending,Normal UI CSV and DOCX match shared values; all six DOCX pages checked; native Edge PDF awaits user save; new cashflow visual output pending,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P1,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,,"[Retoma 21/10/2026] QA 18576, clone simulator_review_delta_20261020_test: sessão sintética renovada por login normal; gravação autenticada e recarga recuperaram saldo 123, receita 900, custos 600, calendário mensal 10/vazio/0, crédito IVA estimado 500. Caixa conhecida 3713 MZN; total indeterminado desde mês 2; crédito estimado excluído da caixa. Prova visual cashflow-recovered-20261021.png e snapshot .txt em outputs/simulator-continuation-20261020. Não certifica recuperação destes novos valores após outro login, CSV/DOCX ou PDF nativo. Ligação de controlo do navegador perdida durante espera de download; não atribuir falha à aplicação. Leitura remota aguarda identificação da ligação SSH; zero alterações no destino. | [Exportação nativa 21/10/2026] Saída actual aberta pelo botão do portal: revisão 4, 12 meses, MZN, saldo inicial123/receita900/custos600, calendário10/vazio/0, caixa conhecida3713 e total indeterminado coincidem com o ecrã. Crédito estimado500 identificado como pressuposto, não somado à caixa. Prova portal-print-current-20261021.txt. Relatório de20/10/revisão2 preservado, sem o confundir com o actual. Downloads: sem novo CSV na pasta habitual ou nos temporários locais conferidos; isso não demonstra falha nem cancelamento. Histórico de downloads bloqueado pela política da ferramenta; caminho do ficheiro solicitado antes de repetir. PDF nativo aberto, mas paginação/legibilidade aguardam o ficheiro efectivamente guardado pelo Edge; conversão DOCX/PDF anterior não conta como essa prova. Perda da ligação e bloqueio de controlo durante impressão são limitações da ferramenta, sem falha do simulador demonstrada. | [Fecho da verificação dos ficheiros 21/10/2026] Transferências Windows redireccionada para \\Mac\Home\Downloads; CSV concluído08:12:46, PDF nativo08:17:19. Sem repetir downloads. Os12 registos mensais do CSV coincidem exactamente com o snapshot do ecrã após correspondência de colunas; PDF revisão4 conserva valores mensais, MZN,12meses,123/900/600, crédito estimado500 não caixa e caixa conhecida3713. Os10 PNG do PDF nativo foram inspeccionados: defeito confirmado na linha repetida de rodapé, sobreposta ao corpo perto do topo de páginas, incluindo2,6e10. Conteúdo/valores conferidos; paginação/legibilidade não aceites até correcção e nova prova nativa. Não é conversão DOCX/PDF. Perda de ligação continua limitação da ferramenta e não causou falha do download; sobreposição é defeito distinto demonstrado no PDF. Provas: download-native-inspection-20261021.json, portal-cashflow-20261021.csv, portal-native-20261021.pdf e native-pdf-render/. A indicação anterior de ficheiros pendentes fica superada por esta prova. Sem alteração funcional nem escrita remota. | [Correcção do rodapé nativo QA 21/10/2026] Origem: pedido expresso da Tempo nesta conversa; solução de implementação, sem regra organizacional nova. Causa em createProjectDossierPrintHtml (project-dossier-document.ts): footer position:fixed/bottom:-14mm sobrepunha a área fragmentada de impressão. Substituído na impressão por caixas @page @bottom-left/@bottom-right, dentro da margem inferior reservada20mm, com identificação/revisão e número de página/total. Rodapé normal de ecrã conservado; sem diminuir letras do corpo (10,5pt), tabelas, cabeçalhos ou origens (9pt), nem retirar conteúdo. Mesmo dossier B/revisão4 regenerado pelo botão do portal QA18576 e guardado no Edge, não por conversão DOCX. 10→10 páginas A4; comparação automática do corpo por página, descontando apenas hora de emissão/rodapé/contador, coincide integralmente. Inspecção visual dos10 PNG: sem sobreposição, cabeçalhos de tabela repetidos, quebras/linhas preservadas, última página íntegra e numeração1/10→10/10. Rodapés medidos inteiramente na margem inferior. Ecrã QA conferido após build; estilos screen e geradores DOCX/ZIP inalterados por comparação de fontes. 10 testes do exportador, TypeScript e build passaram; escape da revisão na nova string CSS verificado. Reutilizadas provas de valores e CSV aceites; não repetido download/aritmética. Provas: native-footer-fix-20261021.json; portal-native-fixed-20261021.pdf; native-footer-before-after-20261021.jpg; native-pdf-fixed-render/; screen-after-print-fix-20261021.png. Fechado exclusivamente o defeito de rodapé neste relatório QA; limitações e restantes critérios de AUD-SIM-INT06 mantêm âmbito próprio. Relato anterior de sobreposição fica superado neste delta pela comparação antes/depois. Branch codex/simulator-integrated-review separada de main, sem integração, escrita remota ou disponibilização activa; revisão prevista mantém-se pendente. | [Saldo consolidado21/10/2026] Concluído na apresentação e comparação deste relatório. Rodapé do PDF nativo fechado em QA segundo provas apresentadas;10 páginas/valores/CSV não repetidos. Tempo declarou que não abriu imagem/PDF pelos caminhos locais: registar aceitação das provas, não revisão visual directa do utilizador. Outras provas de relatório conservadas; falhas interactivas de exportação/anexos mantêm saldo em07. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação.",,20/10/2026,,,,,,,,,,,,,, AUD-SIM-INT07,Explicit validate calculate save export errors and retry,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,Existing idempotency; consumer-level verification pending,Calculation navigation and failed-save retry fixed and browser-verified; normal downloads verified; interactive attachment blocked by extension permission,QA continuation verified; precise open inputs and cashflow visual check in same manual; 2-4 h remaining,,,P1,,,,,,,,,,,,,,,,,,diagnosis and targeted corrections,," | [Saldo consolidado21/10/2026] Parcial. Gravação503→nova tentativa→recuperação e exportações normais demonstradas. Faltam falhas dirigidas de geração Word/ZIP/PDF e retoma; teste interactivo de limite de anexo não ocorreu por bloqueio da ferramenta antes do envio. Nova leitura do código: três catch apresentam cause.message para Error, podendo mostrar texto técnico sem tradução. Sem nova falha de execução alegada. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Candidata21/10/2026] Concluído o recorte dirigido em QA: Word/PDF/ZIP falha única injectada→mensagem portuguesa→nova tentativa no mesmo botão. ZIP preserva título editado, secção desmarcada e anexo; arquivo real contém uma só cópia original/hash igual. Recusa16MB observada mantendo1anexo; nova selecção válida limpa erro e mantém1entrada. Guarda síncrona impede concorrência/duplicação; teste de falha de leitura preserva lista/legenda e permite retoma.4testes dirigidos passaram, TypeScript/build passaram. UI usa componente/geradores reais num invólucro QA sintético; a injecção e a omissão da impressão automática nesse ensaio não integram a entrega. Não repetidas10páginas/valores/CSV aceites. | [Limite conferido21/10/2026] c22003a3 ja definia15*1024*1024 bytes por anexo,10anexos/50MiB total;13f68f1b nao reduz esses limites. Teste16MiB=16777216bytes excede15MiB=15728640bytes. Limite2MiB de incorporacao textual distinto de aceitar original no ZIP. Origem: escolha tecnica preexistente, sem inferir aprovacao organizacional especifica. Entrega: melhorias de planeamento financeiro, recuperacao, exportacao e idioma; revisao antes de main.",,20/10/2026,,,,,,,,,,,,,, diff --git a/resources/js/components/dossier-prefill.tsx b/resources/js/components/dossier-prefill.tsx index c48ae3fd..417a5336 100644 --- a/resources/js/components/dossier-prefill.tsx +++ b/resources/js/components/dossier-prefill.tsx @@ -1,10 +1,12 @@ import { useEffect, useRef, useState } from 'react'; +import { InvestmentContextAssessment } from './investment-context-assessment'; import { Link } from '@inertiajs/react'; import { contextApi, contextFieldNames, type ContextView, } from '@/lib/investor-context'; +import { inheritCompatibleFields } from '@/lib/context-inheritance'; type Props = { contextId?: string | null; consumer: 'simulator' | 'land' | 'desk' | 'submission'; @@ -12,6 +14,7 @@ type Props = { enabled?: boolean; readOnly?: boolean; allowedFields?: string[]; + persistInheritance?: boolean; boundRevision?: number; onApply: (patch: Record, replace: boolean) => void; onReview?: (revision: number, reviewed: boolean) => void; @@ -40,17 +43,16 @@ export function DossierPrefill(props: Props) { const [selected, setSelected] = useState([]); const [reviewed, setReviewed] = useState(false); const [message, setMessage] = useState(''); - const filled = useRef(''); useEffect(() => { if (!contextId) return; let stopped = false; + setView(null); setError(''); void contextApi(`/investimentos/${contextId}/contexto`) .then((v) => { if (!stopped) { setView(v); setReviewed(false); - latest.current.onReview?.(v.context.revision, false); } }) .catch((e) => { @@ -61,44 +63,20 @@ export function DossierPrefill(props: Props) { }; }, [contextId, retry]); useEffect(() => { - if (!view || !enabled || readOnly || !view.can_write) return; - const generation = `${contextId}:${view.context.revision}:${consumer}`; - if (filled.current === generation) return; + if (!view || view.case.id !== contextId || !enabled || readOnly || !view.can_write) return; const source = view.prefill[consumer] ?? {}; const now = latest.current; - const patch: Record = {}; - const conflict = geo.some( - (k) => - !empty(now.values[k]) && - String(now.values[k]) !== text(source[k]), - ); - for (const [k, v] of Object.entries(source)) { - if ( - (now.allowedFields && !now.allowedFields.includes(k)) || - (geo.includes(k) && conflict) - ) - continue; - if (k === 'parcels') { - const old = now.values.parcels as - | Record[] - | undefined; - if ( - (!old?.length || geo.every((g) => empty(old[0]?.[g]))) && - Array.isArray(v) && - v[0] && - Object.keys(v[0]).length - ) - patch[k] = v; - } else if (empty(now.values[k]) && !empty(v)) patch[k] = v; - } - filled.current = generation; - if (Object.keys(patch).length) { - now.onApply(patch, false); + const inherited = inheritCompatibleFields(`dossier:${contextId}:${consumer}`, now.values, source, now.values.context_reuse, now.allowedFields); + if (Object.keys(inherited.patch).length || (now.persistInheritance !== false && now.values.context_reuse !== inherited.metadata)) { + // The shared reconciliation has already selected safe fields; metadata travels with the same saved form. + now.onApply({...inherited.patch, ...(now.persistInheritance === false ? {} : {context_reuse:inherited.metadata})}, true); setMessage( - 'Campos vazios preenchidos a partir do dossier. Reveja-os; os campos já preenchidos foram preservados.', + 'Dados compatíveis reutilizados do mesmo dossier. Os valores herdados acompanham o contexto; as suas alterações locais foram preservadas.', ); } - }, [view, enabled, readOnly, contextId, consumer]); + setReviewed(true); + now.onReview?.(view.context.revision, true); + }, [view, enabled, readOnly, contextId, consumer, props.values]); if (!contextId) return null; if (error) return ( @@ -126,7 +104,7 @@ export function DossierPrefill(props: Props) { ), ); const differences = Object.keys(source).filter( - (k) => text(props.values[k]) !== text(source[k]), + (k) => k !== 'context_applicability_snapshot' && text(props.values[k]) !== text(source[k]), ); const linkedRevision = consumer === 'simulator' @@ -152,6 +130,7 @@ export function DossierPrefill(props: Props) { . Mestres, declarações deste formulário e conteúdo já submetido mantêm-se separados.

+ {stale && (

{linkedRevision > 0 @@ -254,7 +233,17 @@ export function DossierPrefill(props: Props) { const patch: Record = {}; for (const k of selected) patch[k] = source[k] ?? ''; - props.onApply(patch, true); + const scope = `dossier:${contextId}:${consumer}`; + let raw = String(props.values.context_reuse ?? ''); + try { + const metadata = JSON.parse(raw); + if(metadata.scope === scope) { + for(const key of selected) delete metadata.inherited?.[key]; + raw=JSON.stringify(metadata); + } + } catch { /* Legacy metadata does not grant ownership of other fields. */ } + const adopted=inheritCompatibleFields(scope,{...props.values,...Object.fromEntries(selected.map(key=>[key,undefined]))},patch,raw,props.allowedFields); + props.onApply({...patch,...(props.persistInheritance === false ? {} : {context_reuse:adopted.metadata})}, true); setSelected([]); setReviewed(false); props.onReview?.(view.context.revision, false); @@ -267,27 +256,7 @@ export function DossierPrefill(props: Props) { )} - {!readOnly && - view.can_write && - props.onReview && - view.context.revision > 0 && ( - - )} + {!readOnly && reviewed &&

Contexto v{view.context.revision} recuperado neste formulário, sem nova confirmação dos dados compatíveis. As edições locais conservam-se; as declarações e submissões formais mantêm os seus controlos próprios.

}

Associar uma referência não confirma incentivos, licenças, terra disponível, reserva ou autorização. diff --git a/resources/js/components/investment-context-assessment.tsx b/resources/js/components/investment-context-assessment.tsx new file mode 100644 index 00000000..9dc90c7b --- /dev/null +++ b/resources/js/components/investment-context-assessment.tsx @@ -0,0 +1,24 @@ +import { Link } from '@inertiajs/react'; + +type Snapshot = {context_revision:number;path?:{definition_version:number;steps:Array<{code:string;title:string;applicability:string;reason:string;state:string;context_review_required?:boolean}>}; zone?:{title:string;href:string;version:number|string;fields?:Record;analysis?:{conditions?:Array<{id:string;label:string;knowledge:string;source_reference?:string;valid_from?:string;valid_until?:string}>;source?:{title:string;url:string;diploma?:string;article?:string;valid_from?:string;valid_until?:string}|null}}|null;fields?:Record}; +export function InvestmentContextAssessment({raw,contextId}:{raw:unknown;contextId?:string|null}) { + let snapshot:Snapshot|null=null; + try {const value=JSON.parse(String(raw ?? ''));if(value.version===1) snapshot=value;} catch { /* Missing context remains explicit. */ } + if(!snapshot) return null; + const fields=snapshot.fields ?? {};const zone=snapshot.zone; + const regime=zone?.fields?.investment_regime ?? fields.investment_regime; + const names:Record={zee:'ZEE',zfi:'ZFI',industrial_park:'Parque industrial'}; + return

+

Aplicabilidade ao investimento · contexto v{snapshot.context_revision}

+

Origem do investidor: {{national:'nacional',foreign:'estrangeiro',mixed:'misto'}[fields.investor_origin] ?? 'informação em falta'}. Residência fiscal declarada: {fields.tax_residency_country || 'informação em falta'}. Estas condições são distintas; uma não determina a outra.

+ {zone ? <>

Potencialmente aplicável — análise específica de {names[regime ?? ''] ?? 'zona seleccionada'}. {zone.title} · versão {zone.version} · consultar ficha e fundamentos.

+

A selecção identifica a referência consultada; não confirma o reconhecimento da entidade, actividade autorizada, licença ou acesso a benefícios. Consulte as condições documentadas na ficha e reúna a autorização ou evidência correspondente no dossier.

+ {zone.analysis?.source &&

Fundamento cadastrado: {zone.analysis.source.diploma || zone.analysis.source.title} {zone.analysis.source.article}. Período cadastrado: {zone.analysis.source.valid_from || 'início por indicar'} a {zone.analysis.source.valid_until || 'sem termo indicado'}. A cobertura do investimento exige correspondência com estas condições.

} + {zone.analysis?.conditions?.length ?
    {zone.analysis.conditions.map(condition=>
  • {condition.label}: {condition.knowledge==='documented'?'condição documentada; cumprimento pelo investimento por confirmar':condition.knowledge==='disputed'?'condição com informação divergente':'informação em falta'}. {condition.source_reference && <>Fundamento: {condition.source_reference}.} {condition.valid_from && <>Desde {condition.valid_from}.} {condition.valid_until && <>Até {condition.valid_until}.}
  • )}
:

Condições específicas: informação estruturada em falta nesta referência. A ficha e os documentos continuam consultáveis; não se presume cumprimento.

} +

Benefício fiscal deste enquadramento: indeterminado. Não existe neste consumidor uma regra executável ligada ao reconhecimento e condições da zona. No simulador, o IVA disponível corresponde apenas ao cenário geral sem benefício, sobre vendas declaradas compatíveis; não simula o regime especial. O cenário com benefício e o apuramento final estão indisponíveis.

+ :

Enquadramento geral de preparação: sem ZEE, ZFI ou parque seleccionado. Isso não confirma a elegibilidade para uma operação fiscal. O cálculo mantém o âmbito e as exclusões da versão publicada.

} +

Confirmado neste quadro significa apenas dado recuperado do dossier; declarações e referências não são decisões jurídicas. Requisitos específicos não documentados permanecem indeterminados.

+ {snapshot.path &&
Passos adaptados pelo percurso existente · versão {snapshot.path.definition_version}
    {snapshot.path.steps.map(step=>
  • {step.code} — {step.title}: {step.context_review_required?'informação alterada; rever fundamento':step.applicability==='not_needed_for_preparation'?'não aplicável à preparação declarada':step.applicability==='undetermined'?'informação em falta':['completed','approved'].includes(step.state)?'preparação confirmada no percurso; não é decisão fiscal':'potencialmente aplicável'}. {step.reason}
  • )}
} + {contextId && Alterar contexto e comparar impacto antes de guardar} +
; +} diff --git a/resources/js/components/simulation-business-plan.tsx b/resources/js/components/simulation-business-plan.tsx index 11124485..988005e9 100644 --- a/resources/js/components/simulation-business-plan.tsx +++ b/resources/js/components/simulation-business-plan.tsx @@ -95,7 +95,7 @@ function MoneyInput({ } export function SimulationBusinessPlan({ - currency, + currency: projectCurrency, snapshot, onCurrencyChange, onSnapshotChange, @@ -253,8 +253,10 @@ export function SimulationBusinessPlan({ const plan = workingPlan ?? restoreBusinessPlanSnapshot(snapshot) ?? { ...emptyPlan, - currency, + currency: projectCurrency, }; + // A project edit is not a conversion or permission to relabel stored sales. + const currency = plan.currency || projectCurrency; const update = ( key: keyof BusinessFinancialPlanInput, value: @@ -858,6 +860,7 @@ export function SimulationBusinessPlan({ Plano financeiro empresarial (pressupostos editáveis) + {plan.currency && projectCurrency && plan.currency !== projectCurrency &&

A projecção guardada está em {plan.currency}; o projecto está em {projectCurrency}. Os valores e a moeda de origem foram preservados. Reveja o enquadramento monetário antes de os reutilizar; não foi feita conversão.

} {snapshotError && (

().props; const pageUrl = usePage().url; const draftContext = useMemo(() => { @@ -790,11 +791,12 @@ export function SimulationForm() { }; }, [pageUrl]); const contextId = draftContext.context; - const storageScope = contextId + const projectScope = contextId ? `:case:${contextId}` : draftContext.requestedDraft ? `:draft:${draftContext.requestedDraft}` : ''; + const storageScope = `${auth?.user ? `:account:${auth.user.id}` : ':anonymous'}${projectScope}`; const draftKey = legacyDraftKey + storageScope; const draftCreateKey = legacyDraftCreateKey + storageScope; const draftIdKey = legacyDraftIdKey + storageScope; @@ -806,6 +808,7 @@ export function SimulationForm() { const canAssociateDraft = Boolean(auth?.user?.email_verified_at); const [draft, setDraft] = useState({}); const [ready, setReady] = useState(false); + useEffect(() => { if (ready) setDraft(current => inheritSimulatorFields(current)); }, [draft, ready]); const [contextReview, setContextReview] = useState({ revision: 0, reviewed: false, @@ -3611,7 +3614,7 @@ export function SimulationForm() { } /> )} - {current.id === 'tax' && } + {current.id === 'tax' && } {current.id === 'tax' && (

{ active = false; }; }, [retry]); useEffect(() => { - if (!settings.auto || !input || busy || !available || completed || attempt.current === key) return; + if (!settings.auto || !input || input.currency !== 'MZN' || busy || !available || completed || attempt.current === key) return; const request = input; const pending = current && record && ['queued','running'].includes(record.execution.status) ? record.execution.id : null; const timer = window.setTimeout(() => { @@ -56,6 +57,7 @@ export function SimulationMonthlyIva({draft, busy, onCalculate, onChange}: { const snapshot = record?.execution.result_snapshot; const projection = snapshot?.monthly_projection as {rows?: Array<{date:string; sales_declared:string|null; net_sales:string|null; rate:string|null; vat:string|null; gross_sales:string|null; status:string}>} | undefined; return
+

IVA mensal das vendas projectadas

{source}

Declare se os preços projectados são sem IVA ou com IVA incluído. Nenhuma taxa é fixada neste formulário; o servidor selecciona a versão publicada.

@@ -63,6 +65,7 @@ export function SimulationMonthlyIva({draft, busy, onCalculate, onChange}: {

Sem importações, taxas reduzidas, isenções, regimes especiais, deduções, reembolsos ou apuramento final. Valores com IVA incluído permanecem indeterminados neste lote; não se aplica a taxa ao preço bruto.

{monthlyIvaCashTreatment}

+ {!!draft.currency && draft.currency !== "MZN" &&

Moeda do projecto: {String(draft.currency)}. A regra disponível aceita apenas MZN. As vendas e a moeda são preservadas, sem conversão; o IVA mensal não pode ser determinado por esta versão.

} {inputError &&

{inputError}

} {available === null && !error &&

A consultar a disponibilidade da versão publicada…

} {available === false &&

A versão publicada de IVA está indisponível neste ambiente para novas execuções. Os pressupostos e históricos mantêm-se.

} diff --git a/resources/js/components/simulation-published-iva.tsx b/resources/js/components/simulation-published-iva.tsx index 0051bb49..963b7a57 100644 --- a/resources/js/components/simulation-published-iva.tsx +++ b/resources/js/components/simulation-published-iva.tsx @@ -10,16 +10,22 @@ export type PublishedIvaInput = MonthlyIvaInput | { scope_declared: boolean; }; -export function SimulationPublishedIva({ busy, onCalculate }: { +export function SimulationPublishedIva({ busy, onCalculate, draft, onChange }: { + draft: Record; + onChange: (field: string, value: string) => void; busy: boolean; onCalculate: (input: PublishedIvaInput) => Promise; }) { const [available, setAvailable] = useState(false); const [message, setMessage] = useState('A consultar disponibilidade do cálculo de IVA…'); - const [base, setBase] = useState(''); - const [date, setDate] = useState(''); - const [currency, setCurrency] = useState(''); - const [declared, setDeclared] = useState(false); + const base = String(draft.published_iva_base ?? ''); + const date = String(draft.published_iva_date ?? ''); + const currency = String(draft.published_iva_currency ?? ''); + const declared = draft.published_iva_scope === 'yes'; + const setBase = (value: string) => onChange('published_iva_base', value); + const setDate = (value: string) => onChange('published_iva_date', value); + const setCurrency = (value: string) => onChange('published_iva_currency', value); + const setDeclared = (value: boolean) => onChange('published_iva_scope', value ? 'yes' : 'no'); const [error, setError] = useState(''); useEffect(() => { let active = true; @@ -58,12 +64,13 @@ export function SimulationPublishedIva({ busy, onCalculate }: {

Cobertura: exigibilidade em 2026, operação interna à taxa geral. A base tributável é indicada por si; não é copiada do orçamento. Sem isenções, taxas reduzidas, bases especiais, importações, deduções, declaração ou pagamento. O cálculo não valida o enquadramento jurídico.

- +

Sem esta declaração, o resultado fica indeterminado. O valor calculado conserva a precisão decimal; não é saldo a pagar.

+ {currency && currency !== "MZN" &&

Moeda: {currency}. A versão disponível aceita apenas MZN. O valor declarado foi preservado; não foi feita conversão. Este cálculo permanece indisponível para esta moeda.

} {error &&

{error}

}
; } diff --git a/resources/js/lib/context-inheritance.ts b/resources/js/lib/context-inheritance.ts new file mode 100644 index 00000000..897d245d --- /dev/null +++ b/resources/js/lib/context-inheritance.ts @@ -0,0 +1,66 @@ +import { restoreBusinessPlanSnapshot } from './business-financial-plan.ts'; +const empty = (value: unknown) => value == null || value === '' || (Array.isArray(value) && value.length === 0); +function canonical(value: unknown): unknown { + if (Array.isArray(value)) return value.map(canonical); + if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).sort(([a],[b])=>a.localeCompare(b)).map(([key,item])=>[key,canonical(item)])); + return value; +} +// Change tracking only, never an authorization, integrity or legal-acceptance token. No personal values in metadata. +function signature(value: unknown): string { + const text=JSON.stringify(canonical(value)) ?? 'undefined';let hash=14695981039346656037n; + for(let index=0;index, source:Record, raw:unknown, allowed?:string[]): {patch:Record; metadata:string; inherited:string[]; conflicts:string[]} { + let previous:Record={}; + try { const saved=JSON.parse(String(raw ?? ''));if(saved.version===1 && saved.scope===scope && saved.inherited && typeof saved.inherited==='object') previous=saved.inherited; } catch { /* Legacy inputs are retained, not overwritten. */ } + const next={...previous};const patch:Record={};const inherited:string[]=[];const conflicts:string[]=[]; + const geo=['province_id','district_id','admin_post_id','locality_id']; + const geoConflict=geo.some(key=>(!empty(values[key]) || key in previous) && signature(values[key])!==signature(source[key]) && previous[key]!==signature(values[key])); + for(const [key,value] of Object.entries(source)) { + if ((allowed && !allowed.includes(key)) || (empty(value) && !(key in previous))) continue; + const current=values[key]; + const track = (item:unknown) => key==='parcels' ? Object.fromEntries(geo.map(field=>[field,(item as Array>)?.[0]?.[field] ?? ''])) : item; + const owned=previous[key]===signature(track(current)); + const vacant=key==='parcels' ? geo.every(field=>empty((current as Array>)?.[0]?.[field])) : empty(current); + if ((geo.includes(key) && geoConflict) || (!owned && (!vacant || key in previous))) { + if(signature(current)!==signature(value)) conflicts.push(key); + continue; + } + if(key==='parcels') { + const parcels=current as Array>|undefined; + if(!owned && parcels?.length && geo.some(field=>!empty(parcels[0]?.[field]))) {conflicts.push(key);continue;} + } + if(signature(track(current))!==signature(track(value))) { + if(key==='parcels') { + const parcels=(current as Array>) ?? []; + patch[key]=[{...parcels[0],...Object.fromEntries(geo.map(field=>[field,(value as Array>)[0]?.[field] ?? '']))},...parcels.slice(1)]; + } else patch[key]=value; + } + next[key]=signature(track(value));inherited.push(key); + } + return {patch,metadata:JSON.stringify({version:1,scope,inherited:next}),inherited,conflicts}; +} + +export function inheritSimulatorFields>(draft:T): T { + const source:Record={}; + const plan=draft.business_plan_snapshot ? restoreBusinessPlanSnapshot(String(draft.business_plan_snapshot)) : null; + if(plan?.currency) source.currency=plan.currency; + const currency=draft.currency || source.currency; + if(currency) {source.fiscal_currency=currency;source.opportunity_currency=currency;source.published_iva_currency=currency;} + if(draft.tax_residency_country) source.fiscal_residency_country=draft.tax_residency_country; + if(draft.fiscal_reference_date) source.published_iva_date=draft.fiscal_reference_date; + let settings:Record={start:'',basis:'unknown',declared:false,auto:false}; + let settingsValid=!draft.monthly_iva_settings; + try {const saved=JSON.parse(String(draft.monthly_iva_settings ?? ''));if(saved && !Array.isArray(saved) && typeof saved.start==='string' && ['net','included','unknown'].includes(saved.basis) && typeof saved.declared==='boolean' && typeof saved.auto==='boolean') {settings=saved;settingsValid=true;}} catch { /* Invalid stored inputs remain intact. */ } + const start=String(draft.expected_start_date ?? ''); + 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; + 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}; + if('monthly_iva_start' in patch.patch) next.monthly_iva_settings=JSON.stringify({...settings,start:patch.patch.monthly_iva_start}); + delete next.monthly_iva_start; + return JSON.stringify(next)===JSON.stringify(draft) ? draft : next as T; +} diff --git a/resources/js/lib/investor-context.ts b/resources/js/lib/investor-context.ts index 947f4333..fbb27ce8 100644 --- a/resources/js/lib/investor-context.ts +++ b/resources/js/lib/investor-context.ts @@ -134,4 +134,19 @@ export const contextFieldNames: Record = { province: 'Província', district: 'Distrito', location: 'Localização', + currency: 'Moeda do projecto', + person_type: 'Tipo de pessoa', + fiscal_period: 'Ano fiscal', + fiscal_periodicity: 'Periodicidade', + fiscal_month: 'Mês fiscal', + fiscal_residency_country: 'País de residência fiscal declarado', + activity_id: 'Actividade', + project_type: 'Modalidade do investimento', + maturity_stage: 'Fase do investimento', + expected_start_date: 'Início previsto', + investor_origin: 'Origem do investidor', + entity_stage: 'Situação da entidade', + tax_residency_country: 'Residência fiscal declarada', + investment_regime: 'Enquadramento territorial consultado', + special_zone_id: 'ZEE, ZFI ou parque', }; diff --git a/resources/js/lib/monthly-iva.ts b/resources/js/lib/monthly-iva.ts index b986c31b..77c9afa5 100644 --- a/resources/js/lib/monthly-iva.ts +++ b/resources/js/lib/monthly-iva.ts @@ -21,6 +21,7 @@ export function monthlySalesFromDraft(draft: Record): { amounts if (draft.business_plan_snapshot) { const plan = restoreBusinessPlanSnapshot(String(draft.business_plan_snapshot)); if (!plan) throw new Error('Não foi possível recuperar a projecção de vendas. Os dados guardados não foram substituídos.'); + if (draft.currency && plan.currency && draft.currency !== plan.currency) throw new Error(`A projecção de vendas está em ${plan.currency}, mas o projecto está em ${String(draft.currency)}. Reveja a moeda da projecção; os valores não foram convertidos nem reclassificados.`); return {amounts: monthlyProjectedSales(plan), source: 'Vendas por produto e mês do plano empresarial; mesmos pressupostos e representação monetária da projecção de vendas.'}; } if (draft.cashflow_snapshot) { diff --git a/resources/js/lib/project-dossier-report.ts b/resources/js/lib/project-dossier-report.ts index a2a534b5..e34606f8 100644 --- a/resources/js/lib/project-dossier-report.ts +++ b/resources/js/lib/project-dossier-report.ts @@ -277,6 +277,19 @@ function makeSections( } } + if (draft.context_applicability_snapshot) { + try { + const context = JSON.parse(String(draft.context_applicability_snapshot)); + if (context.version === 1) { + const section = sections.get('sources'); + const zone = context.zone; + section?.rows.push({field:'Contexto do investimento',value:`Revisão ${context.context_revision}; ${zone ? `${zone.title}, versão ${zone.version}` : 'sem ZEE, ZFI ou parque seleccionado'}`,origin:'Referência do mesmo dossier no momento da gravação',classification:'Contexto versionado; não é reconhecimento jurídico'}); + section?.paragraphs.push(zone ? 'Benefício fiscal da zona indeterminado: falta regra executável ligada às condições e reconhecimento. O IVA apresentado é apenas cenário geral sem benefício; não representa o regime especial nem o apuramento final.' : 'Cenário geral de preparação; sem confirmação automática de elegibilidade fiscal.'); + if(zone?.href) section?.rows.push({field:'Ficha e fundamentos da zona',value:zone.href,origin:`Versão consultada ${zone.version}`,classification:'Referência consultável; condições por verificar'}); + } + } catch { sections.get('sources')?.paragraphs.push('Não foi possível recuperar o contexto guardado; o enquadramento territorial permanece indeterminado.'); } + } + for (const [sectionName, field, value, origin] of rows.slice(1)) { // Questionnaire schema identifiers remain stored; they do not help the // reader assess the project and are not a business report field. diff --git a/resources/js/lib/simulation-form.ts b/resources/js/lib/simulation-form.ts index ccaf52d6..e9b3e6aa 100644 --- a/resources/js/lib/simulation-form.ts +++ b/resources/js/lib/simulation-form.ts @@ -1,3 +1,4 @@ +import { inheritSimulatorFields } from './context-inheritance.ts'; import { csvCell } from './csv.js'; import { fiscalQaRows } from './fiscal-qa-preview.ts'; import { isApiSimulationResultSnapshotV1 } from './simulation-contract.ts'; @@ -1530,7 +1531,7 @@ export function restoreSimulationDraft( } } } - return draft as SimulationDraft; + return inheritSimulatorFields(draft as SimulationDraft); } export function simulationDraftFingerprint(draft: SimulationDraft): string { diff --git a/resources/js/pages/desk/request.tsx b/resources/js/pages/desk/request.tsx index b6205193..36b1af08 100644 --- a/resources/js/pages/desk/request.tsx +++ b/resources/js/pages/desk/request.tsx @@ -135,6 +135,7 @@ export default function RequestPage({ +
)} {['project_title', 'project_summary'].map((k) => (