From 603a88e1d30ed797b974d7941551796c968f64c6 Mon Sep 17 00:00:00 2001 From: nala Date: Fri, 23 Oct 2026 16:34:57 +0200 Subject: [PATCH] Link documented investment complements to existing fiches and dossier context --- .../InvestmentComplementController.php | 27 +++ .../InvestmentDiscoveryController.php | 2 +- .../InvestmentPortfolioController.php | 2 +- .../Controllers/InvestorContextController.php | 27 ++- app/Services/InvestmentComplements.php | 157 ++++++++++++++ app/Services/InvestorContext.php | 25 ++- ...tment-complements-qa-receipt-20261023.json | 199 ++++++++++++++++++ .../unification/traceability-and-manual.md | 57 +++++ .../v2/auditoria-portal/matriz-requisitos.csv | 24 +-- resources/js/components/dossier-prefill.tsx | 2 + .../js/components/investment-complements.tsx | 70 ++++++ resources/js/lib/investor-context.ts | 2 + resources/js/lib/project-dossier.ts | 5 + resources/js/lib/search-territory.ts | 12 ++ resources/js/pages/investment/detail.tsx | 4 + .../js/pages/investor-path/context-start.tsx | 8 +- resources/js/pages/investor-path/context.tsx | 43 +++- resources/js/pages/investor-path/show.tsx | 2 + resources/js/pages/partnerships/detail.tsx | 2 + resources/js/pages/portfolio/show.tsx | 4 + routes/investor-path.php | 2 + tests/Feature/InvestmentComplementsTest.php | 193 +++++++++++++++++ .../frontend/investment-complements.test.mjs | 37 ++++ 23 files changed, 881 insertions(+), 25 deletions(-) create mode 100644 app/Http/Controllers/InvestmentComplementController.php create mode 100644 app/Services/InvestmentComplements.php create mode 100644 docs/investmoz/unification/investment-complements-qa-receipt-20261023.json create mode 100644 resources/js/components/investment-complements.tsx create mode 100644 tests/Feature/InvestmentComplementsTest.php create mode 100644 tests/frontend/investment-complements.test.mjs diff --git a/app/Http/Controllers/InvestmentComplementController.php b/app/Http/Controllers/InvestmentComplementController.php new file mode 100644 index 00000000..3e4ceb1a --- /dev/null +++ b/app/Http/Controllers/InvestmentComplementController.php @@ -0,0 +1,27 @@ +validate(['origin' => [\Illuminate\Validation\Rule::requiredIf(!$request->has('contexts')), 'nullable', 'string', 'max:100'], 'territory_id' => 'nullable|uuid', + 'contexts' => 'sometimes|array|max:100', 'contexts.*' => 'array:origin,territory_id', 'contexts.*.origin' => 'required|string|max:100', 'contexts.*.territory_id' => 'nullable|uuid']); + $items = []; + $issues = []; + foreach ($data['contexts'] ?? [['origin' => $data['origin'], 'territory_id' => $data['territory_id'] ?? null]] as $context) { + try { + $items = [...$items, ...$service->options($context['origin'], $context['territory_id'] ?? null)]; + } catch (\Illuminate\Database\Eloquent\ModelNotFoundException|\Symfony\Component\HttpKernel\Exception\HttpException $e) { + $status = $e instanceof \Symfony\Component\HttpKernel\Exception\HttpException ? $e->getStatusCode() : 404; + if (!isset($data['contexts']) || $status !== 404) throw $e; + $issues[] = ['origin' => $context['origin'], 'message' => 'Uma referência escolhida deixou de estar disponível para consulta pública. A relação guardada conserva-se no dossier; os outros complementos continuam disponíveis.']; + } + } + return response()->json(isset($data['contexts']) ? ['items' => $items, 'issues' => $issues] : $items)->header('Cache-Control', 'private, no-store'); + } +} diff --git a/app/Http/Controllers/InvestmentDiscoveryController.php b/app/Http/Controllers/InvestmentDiscoveryController.php index 86cec5e0..9c7f3a4d 100644 --- a/app/Http/Controllers/InvestmentDiscoveryController.php +++ b/app/Http/Controllers/InvestmentDiscoveryController.php @@ -107,7 +107,7 @@ class InvestmentDiscoveryController extends Controller $returnFilters = $request->query(); unset($returnFilters['zone_id'], $returnFilters['from_dossier']); - return Inertia::render('investment/detail', ['record' => $record, 'context' => $catalogue->context($record->id), 'zone_origin' => $origin, + return Inertia::render('investment/detail', ['complements' => app(\App\Services\InvestmentComplements::class)->options('opportunity:'.$record->id), 'record' => $record, 'context' => $catalogue->context($record->id), 'zone_origin' => $origin, 'guides' => app(\App\Services\SectorInvestment::class)->guides($record->sector), 'dossierOrigin' => $dossierOrigin ? ['id' => $dossierOrigin->id, 'title' => $dossierOrigin->title] : null, 'returnUrl' => $returnFilters === [] ? '/oportunidades' : '/oportunidades?'.http_build_query($returnFilters)]); diff --git a/app/Http/Controllers/InvestmentPortfolioController.php b/app/Http/Controllers/InvestmentPortfolioController.php index 985525f7..178b959f 100644 --- a/app/Http/Controllers/InvestmentPortfolioController.php +++ b/app/Http/Controllers/InvestmentPortfolioController.php @@ -131,7 +131,7 @@ class InvestmentPortfolioController extends Controller ->orderByDesc('updated_at')->limit(10)->get(['id', 'version', 'updated_at']) : collect(); - return Inertia::render('portfolio/show', ['record' => $record, 'related' => $related, 'management' => $management, 'zones' => $zones, + return Inertia::render('portfolio/show', ['complements' => $management ? [] : app(\App\Services\InvestmentComplements::class)->options('portfolio:'.$record->id), 'record' => $record, 'related' => $related, 'management' => $management, 'zones' => $zones, 'anchorProject' => $anchorProject, 'existingSubmissions' => $existingSubmissions, 'geography' => app(InvestmentRelations::class)->dossier($record, $management), 'origin' => $origin ? ['id' => $origin->id, 'title' => $origin->title] : null, 'opportunities' => $opportunities, 'chains' => $chains]); diff --git a/app/Http/Controllers/InvestorContextController.php b/app/Http/Controllers/InvestorContextController.php index 12b289d1..a92b4f6a 100644 --- a/app/Http/Controllers/InvestorContextController.php +++ b/app/Http/Controllers/InvestorContextController.php @@ -11,6 +11,15 @@ use Inertia\Inertia; final class InvestorContextController extends Controller { + private function entryComplements(Request $request): array + { + $data = $request->validate(['complement_origin' => 'nullable|string|max:100', 'complement_code' => 'required_with:complement_origin|string|max:40', + 'complement_target' => 'nullable|string|max:100', 'complement_territory' => 'nullable|uuid']); + if (empty($data['complement_origin'])) return []; + return app(\App\Services\InvestmentComplements::class)->resolve([['origin' => $data['complement_origin'], 'code' => $data['complement_code'], + 'target' => $data['complement_target'] ?? null, 'territory_id' => $data['complement_territory'] ?? null]]); + } + private function entryChoices(Request $r, InvestorContext $context): array { $data = $r->validate(['source' => 'nullable|string|max:100', 'from_dossier' => 'nullable|uuid', 'opportunities' => 'sometimes|array|max:100', 'opportunities.*' => 'integer|distinct|min:1', @@ -21,6 +30,14 @@ final class InvestorContextController extends Controller $path = app(InvestmentGeography::class)->selection($data); $input = array_map(fn($id) => ['source' => 'opportunity:'.$id, ...($path ? ['territory' => 'territory:'.$path[array_key_last($path)]->id] : [])], $ids); if (!empty($data['from_dossier'])) $input[0]['portfolio_origins'] = [$data['from_dossier']]; + foreach ($this->entryComplements($r) as $complement) { + $keys = array_filter([$complement['origin']['key'], $complement['target']['key'] ?? null], fn($key) => str_starts_with($key, 'opportunity:')); + foreach ($keys as $key) { + if (in_array($key, array_column($input, 'source'), true)) continue; + $input[] = ['source' => $key, ...($complement['territory_id'] ? ['territory' => 'territory:'.$complement['territory_id']] : []), + ...(str_starts_with($complement['origin']['key'], 'portfolio:') ? ['portfolio_origins' => [substr($complement['origin']['key'], 10)]] : [])]; + } + } return app(\App\Services\InvestmentOpportunityChoices::class)->resolve($input, [], true); } @@ -84,7 +101,13 @@ final class InvestorContextController extends Controller $kept = collect($choices ?? [])->firstWhere('opportunity.key', $entry['opportunity']['key']); if ($kept && ($kept['territory']['key'] ?? null) !== ($entry['territory']['key'] ?? null)) $differences[] = ['title'=>$entry['opportunity']['title'],'saved'=>$kept['territory']['title']??'Por definir','requested'=>$entry['territory']['title']??'Por definir']; } - return Inertia::render('investor-path/context', ['entryLocationDifferences'=>$differences,'entrySources'=>$entrySources,'draft' => $draft, 'requestedChoices' => $choices, 'initial' => $data, 'options' => $context->options(), 'source' => $source, 'territorySelection' => isset($data['context']['selection']['territory']) ? app(InvestmentGeography::class)->path($data['context']['selection']['territory']['id']) : []]); + $complements = isset($draft['complements']) ? app(\App\Services\InvestmentComplements::class)->resolve($draft['complements'], $data['context']['complements'] ?? []) : ($data['context']['complements'] ?? []); + foreach ($this->entryComplements($r) as $entry) { + $tag = 'complement:'.hash('sha256', $entry['key'].'@'.($selectionKey ?? '')); + $entrySources[] = $tag; + if (!in_array($tag, $draft['entry_sources'] ?? [], true)) $complements = collect([...$complements, $entry])->unique('key')->values()->all(); + } + return Inertia::render('investor-path/context', ['entryComplements' => $complements, 'entryLocationDifferences'=>$differences,'entrySources'=>$entrySources,'draft' => $draft, 'requestedChoices' => $choices, 'initial' => $data, 'options' => $context->options(), 'source' => $source, 'territorySelection' => isset($data['context']['selection']['territory']) ? app(InvestmentGeography::class)->path($data['context']['selection']['territory']['id']) : []]); } public function preview(Request $r, string $id, InvestorContext $context) @@ -103,7 +126,7 @@ final class InvestorContextController extends Controller $ref = isset($d['source']) ? $context->reference($d['source']) : null; $choices = $this->entryChoices($r, $context); - return Inertia::render('investor-path/context-start', ['entryQuery' => $r->only(['from_dossier', 'province_id', 'district_id', 'admin_post_id', 'locality_id']), 'opportunityChoices' => $choices, 'contexts' => $path->contexts($r->user()), 'source' => $ref, 'step' => $d['step'] ?? null]); + return Inertia::render('investor-path/context-start', ['entryComplements' => $this->entryComplements($r), 'entryQuery' => $r->only(['complement_origin', 'complement_code', 'complement_target', 'complement_territory', 'from_dossier', 'province_id', 'district_id', 'admin_post_id', 'locality_id']), 'opportunityChoices' => $choices, 'contexts' => $path->contexts($r->user()), 'source' => $ref, 'step' => $d['step'] ?? null]); } public function installation(Request $r, InvestorContextInstallation $install) diff --git a/app/Services/InvestmentComplements.php b/app/Services/InvestmentComplements.php new file mode 100644 index 00000000..1467518c --- /dev/null +++ b/app/Services/InvestmentComplements.php @@ -0,0 +1,157 @@ + ['Regadio', 'regadio|irrigação|irrigacao'], + 'storage' => ['Silos e armazenagem', 'silos?|armazenagem|armazenamento'], + 'cold' => ['Cadeia de frio', 'frio|refrigeração'], + 'processing' => ['Processamento', 'processamento|transformação|moagem'], + 'spinning' => ['Fiação', 'fiação|fiacao'], + 'logistics' => ['Logística', 'logística|logistica|transporte'], + 'certification' => ['Certificação', 'certificação|certificacao'], + 'training' => ['Formação', 'formação|formacao'], + 'finance' => ['Financiamento', 'financiamento|serviços financeiros'], + ]; + + public function options(string $origin, ?string $territory = null): array + { + [$originKind, $originId] = array_pad(explode(':', $origin, 2), 2, ''); + abort_unless(($originKind === 'portfolio' && Str::isUuid($originId)) || ($originKind === 'opportunity' && ctype_digit($originId)), 422, 'Origem complementar inválida.'); + $principal = null; + $relationEvidence = []; + if (str_starts_with($origin, 'portfolio:')) { + $record = InvestmentPortfolioController::visible()->addSelect('version_no')->findOrFail(substr($origin, 10)); + $text = trim(($record->content['focus'] ?? '')."\n".($record->content['gaps'] ?? '')."\n".($record->content['description'] ?? '')); + $reference = ['key' => $origin, 'title' => $record->title, 'href' => '/carteira/'.$record->id, 'version' => $record->version_no]; + $ids = app(CorridorAgribusinessOpportunities::class)->portfolioOpportunityIds($record); + foreach (['projects' => 'project_id', 'clusters' => 'cluster_id', 'corridors' => 'corridor_id'] as $relation => $foreign) { + if ($record->$foreign) $ids = [...$ids, ...DB::table('opportunity_'.$relation)->where($foreign, $record->$foreign)->pluck('opportunity_id')->all()]; + } + $basis = $record->source; + foreach (array_unique($ids) as $id) $relationEvidence[$id] = ['type' => 'portfolio', 'origin' => $origin, 'source' => $basis]; + $serviceOrigins = [['dossier', $record->id]]; + foreach (['project_id' => 'project', 'cluster_id' => 'cluster'] as $foreign => $type) { + if ($record->$foreign) $serviceOrigins[] = [$type, $record->$foreign]; + } + } else { + $reference = app(InvestorContext::class)->reference($origin); + abort_unless($reference['kind'] === 'opportunity', 422); + $principal = Opportunity::published()->findOrFail($reference['id']); + $text = $principal->summary; + $basis = 'Resumo cadastrado da oportunidade '.$principal->reference; + $projects = DB::table('opportunity_projects')->where('opportunity_id', $principal->id)->pluck('project_id'); + $links = DB::table('complementary_project_links')->whereIn('anchor_project_id', $projects) + ->whereNull('deleted_at')->where('data_classification', 'public')->get(['id', 'anchor_project_id', 'complementary_project_id', 'relation_type', 'version_no']); + $targetProjects = DB::table('opportunity_projects')->whereIn('project_id', $links->pluck('complementary_project_id'))->get(); + $ids = [$principal->id, ...$targetProjects->pluck('opportunity_id')->all()]; + $relationEvidence[$principal->id] = ['type' => 'same_fiche', 'source' => $basis]; + foreach ($targetProjects as $targetProject) $relationEvidence[$targetProject->opportunity_id] = ['type' => 'complementary_project', + 'links' => $links->where('complementary_project_id', $targetProject->project_id)->values()->map(fn($link) => (array)$link)->all()]; + foreach (Opportunity::published()->whereIn('id', $ids)->where('id', '!=', $principal->id)->get() as $linked) $text .= "\n".$linked->summary; + if (count($ids) > 1) $basis .= '; relações complementares públicas entre projectos'; + $serviceOrigins = [['investment', (string) $principal->id]]; + $classification = app(OpportunityClassification::class); + $principalChains = collect($classification->publicRows($principal))->where('target_type', 'chain')->filter(fn($r) => !empty($r['source_reference'])); + $chains = $principalChains->pluck('target_id')->all(); + if ($chains) { + Opportunity::published()->whereNot('id', $principal->id)->chunkById(100, function ($records) use (&$ids, &$relationEvidence, $chains, $principalChains, $classification) { + foreach ($records as $candidate) { + $related = collect($classification->publicRows($candidate))->where('target_type', 'chain')->filter(fn($r) => !empty($r['source_reference'])); + $shared = array_intersect($chains, $related->pluck('target_id')->all()); + if ($shared) { + $ids[] = $candidate->id; + $relationEvidence[$candidate->id] ??= ['type' => 'value_chain', 'principal' => $principalChains->whereIn('target_id', $shared)->values()->all(), 'target' => $related->whereIn('target_id', $shared)->values()->all()]; + } + } + }); + } + } + $territoryReference = $territory ? app(InvestorContext::class)->reference('territory:'.$territory) : null; + $candidates = Opportunity::published()->whereIn('id', array_unique($ids))->get(); + $items = []; + foreach (self::TERMS as $code => [$label, $pattern]) { + if (!preg_match('/\b(?:'.$pattern.')\b/iu', $text, $match)) continue; + $offers = []; + foreach ($candidates as $candidate) { + // A common corridor alone does not prove the component. Keep the supporting excerpt. + if (!preg_match('/\b(?:'.$pattern.')\b/iu', $candidate->title."\n".$candidate->summary, $evidence)) continue; + // Mentioning a need for funding/training in a project's summary is not an offer. + if (in_array($code, ['certification', 'training', 'finance'], true) && !preg_match('/\b(?:'.$pattern.')\b/iu', $candidate->title)) continue; + if (in_array($code, ['certification', 'training', 'finance'], true) && preg_match('/\b(?:necessidade|pedido|procura)\b/iu', $candidate->title)) continue; + if ($territory && $candidate->primary_territory_id && !$this->compatible($territory, $candidate->primary_territory_id)) continue; + $offers[] = ['key' => 'opportunity:'.$candidate->id, 'title' => $candidate->title, 'href' => '/oportunidades/'.$candidate->slug, + 'relationship' => $relationEvidence[$candidate->id] ?? null, + 'version' => $candidate->management_version, 'evidence' => $evidence[0], 'location' => ($principal && $principal->id === $candidate->id ? 'Componente referido na própria ficha. ' : '').($candidate->primary_territory_id ? app(InvestorContext::class)->reference('territory:'.$candidate->primary_territory_id)['title'] : 'Implantação por definir')]; + } + // Services are concrete published offerings explicitly associated with this source. + $services = []; + if (in_array($code, ['certification', 'training', 'finance'], true) && Schema::hasTable('partnership_origins') && Schema::hasTable('partnership_interests')) { + if ($serviceOrigins) { + $services = DB::table('portal_partnerships as p')->join('partnership_origins as o', 'o.partnership_id', '=', 'p.id') + ->where(function ($q) use ($serviceOrigins) { + foreach ($serviceOrigins as [$type, $id]) $q->orWhere(fn($q) => $q->where('o.type', $type)->where('o.target_id', $id)); + })->where('p.status', 'published')->where('p.kind', 'offering') + ->where('p.partnership_type', $code === 'finance' ? 'finance' : 'training') + ->when($code !== 'finance', fn($q) => $q->where(fn($q) => $q->where('p.title', 'ilike', '%'.$match[0].'%')->orWhereRaw("p.payload->>'summary' ILIKE ?", ['%'.$match[0].'%'])))->distinct()->get(['p.id', 'p.title']) + ->filter(function ($p) use ($territory) { + if (!$territory) return true; + $locations = DB::table('partnership_locations')->where('partnership_id', $p->id)->pluck('geo_location_id'); + return $locations->isEmpty() || $locations->contains(fn($id) => $this->compatible($territory, $id)); + })->map(fn ($p) => ['key' => 'partnership:'.$p->id, 'title' => $p->title, 'href' => '/parcerias/'.$p->id, 'location' => 'Consultar âmbito na oferta'])->values()->all(); + } + } + $excerpt = collect(explode("\n", $text))->first(fn($line) => preg_match('/\b(?:'.$pattern.')\b/iu', $line)); + $items[] = ['code' => $code, 'title' => $label, 'origin' => $reference, 'territory_id' => $territory, 'territory' => $territoryReference, + 'source' => $basis, 'excerpt' => $excerpt, 'source_sha256' => hash('sha256', $text), 'opportunities' => $offers, 'services' => $services]; + } + return $items; + } + + private function compatible(string $a, string $b): bool + { + if ($a === $b) return true; + $geo = app(InvestmentGeography::class); + return in_array($b, $geo->descendants($a), true) || in_array($a, $geo->descendants($b), true); + } + + public function resolve(array $input, array $previous = []): array + { + $resolved = []; + foreach ($input as $choice) { + $target = $choice['target'] ?? null; + $old = collect($previous)->first(fn($r) => $r['origin']['key'] === $choice['origin'] && $r['code'] === $choice['code'] && ($r['target']['key'] ?? null) === $target && ($r['territory_id'] ?? null) === ($choice['territory_id'] ?? null)); + try { + $item = collect($this->options($choice['origin'], $choice['territory_id'] ?? null))->firstWhere('code', $choice['code']); + } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { + if (!$old) throw $e; + $item = null; + } catch (\Symfony\Component\HttpKernel\Exception\HttpException $e) { + if (!$old || $e->getStatusCode() !== 404) throw $e; + $item = null; + } + $offer = $target && $item ? collect([...$item['opportunities'], ...$item['services']])->firstWhere('key', $target) : null; + if ($old && (!$item || ($target && !$offer) || (!$target && ($item['opportunities'] || $item['services'])))) { + $resolved[$old['key']] = [...$old, 'availability' => 'review_required']; + continue; + } + abort_unless($item, 422, 'Complemento sem referência documentada neste investimento.'); + abort_if($target && !$offer, 422, 'A oferta complementar deixou de estar disponível neste contexto.'); + abort_if(!$target && ($item['opportunities'] || $item['services']), 422, 'Já existe uma oferta relacionada; seleccione a ficha correspondente.'); + $key = hash('sha256', $choice['origin'].'|'.$choice['code'].'|'.($target ?? 'idea').'|'.($choice['territory_id'] ?? '')); + $resolved[$key] = ['key' => $key, 'origin' => $item['origin'], 'code' => $item['code'], 'title' => $item['title'], + 'kind' => $target ? (str_starts_with($target, 'opportunity:') ? 'opportunity' : 'service') : 'need', + 'target' => $offer, 'territory_id' => $item['territory_id'], 'territory' => $item['territory'], 'source' => $item['source'], 'excerpt' => $item['excerpt'], 'source_sha256' => $item['source_sha256']]; + } + return array_values($resolved); + } +} diff --git a/app/Services/InvestorContext.php b/app/Services/InvestorContext.php index c27e0cb3..d6c1b909 100644 --- a/app/Services/InvestorContext.php +++ b/app/Services/InvestorContext.php @@ -39,10 +39,11 @@ final class InvestorContext $case=$this->desk->case($actor,$id,true); abort_if($case->closed_at,409); $sequence = (int)($input['draft_sequence'] ?? 0); - $entrySources=Validator::make($input,['entry_sources'=>'sometimes|array|max:100','entry_sources.*'=>'string|max:100'])->validate()['entry_sources']??[]; + $entrySources=Validator::make($input,['entry_sources'=>'sometimes|array|max:200','entry_sources.*'=>'string|max:100'])->validate()['entry_sources']??[]; unset($input['draft_sequence'],$input['entry_sources']); abort_unless($sequence > 0, 422); $data = $this->input($input); + if (isset($data['complements'])) app(InvestmentComplements::class)->resolve($data['complements'], $this->state($case)['complements'] ?? []); foreach ($data['selection'] as $slot=>$key) { if (!$key) continue; $ref=$this->reference($key); @@ -328,7 +329,7 @@ final class InvestorContext private function input(array $input): array { - abort_if(array_diff(array_keys($input), ['opportunity_choices', 'version', 'selection', 'declarations', 'replace_fields', 'preview_hash', 'operation_key', 'confirm', 'document_links', '_token']), 422, 'Campo de controlo desconhecido.'); + abort_if(array_diff(array_keys($input), ['complements', 'opportunity_choices', 'version', 'selection', 'declarations', 'replace_fields', 'preview_hash', 'operation_key', 'confirm', 'document_links', '_token']), 422, 'Campo de controlo desconhecido.'); abort_if(! app(PrivateInvestmentPreparation::class)->available() && (! empty($input['document_links']) || array_intersect(array_keys(is_array($input['declarations'] ?? null) ? $input['declarations'] : []), PrivateInvestmentPreparation::FIELDS)), 409, 'Esta preparação ainda não está disponível neste ambiente. As respostas foram preservadas.'); @@ -341,6 +342,9 @@ final class InvestorContext } return Validator::make($input, [...$inputRules, + 'complements' => 'sometimes|array|max:100', 'complements.*' => 'array:origin,code,target,territory_id', + 'complements.*.origin' => 'required|string|max:100', 'complements.*.code' => 'required|string|max:40', + 'complements.*.target' => 'nullable|string|max:100', 'complements.*.territory_id' => 'nullable|uuid', 'opportunity_choices' => 'sometimes|array|max:100', 'opportunity_choices.*' => 'array:source,territory,location_reason,confirm_location_change,activities,corridor_key,portfolio_origins', 'opportunity_choices.*.portfolio_origins' => 'sometimes|array|max:100', 'opportunity_choices.*.portfolio_origins.*' => 'uuid', 'opportunity_choices.*.corridor_key' => ['sometimes', 'nullable', Rule::in(array_keys(config('investment_corridors')))], @@ -361,6 +365,7 @@ final class InvestorContext abort_unless((int) $case->version === $data['version'], 409, 'O dossier mudou; recupere a versão atual.'); app(InvestorPath::class)->view($actor, $id); $old = $this->state($case); + $complements = array_key_exists('complements', $data) ? app(InvestmentComplements::class)->resolve($data['complements'], $old['complements'] ?? []) : ($old['complements'] ?? []); $links = $old['preparation_documents'] ?? []; foreach ($data['document_links'] ?? [] as $key => $document) { if ($document) { @@ -388,6 +393,12 @@ final class InvestorContext abort(422, 'Actualize a selecção identificada de oportunidades; não substitua silenciosamente o conjunto por uma ficha.'); } $selection = $old['selection']; + foreach ($complements as $complement) { + if (($complement['availability'] ?? '') === 'review_required') continue; + foreach ([$complement['origin']['key'], $complement['target']['key'] ?? ''] as $key) { + if (str_starts_with($key, 'opportunity:')) abort_unless(in_array($key, array_column(array_column($choices, 'opportunity'), 'key'), true), 422, 'Conserve a oportunidade escolhida ou retire explicitamente a sua relação complementar.'); + } + } foreach ($data['selection'] as $slot => $key) { if ($key === null || $key === '') { unset($selection[$slot]); @@ -475,12 +486,13 @@ final class InvestorContext } } $changedFields = array_column($replaced, 'field'); + if ($complements !== ($old['complements'] ?? [])) $changed[] = 'complements'; $choicesChanged = $choices !== ($old['opportunity_choices'] ?? []); $choiceInputsChanged = array_map(fn($c)=>Arr::except($c,['portfolio_origins']),$choices) !== array_map(fn($c)=>Arr::except($c,['portfolio_origins']),$old['opportunity_choices']??[]); if ($choiceInputsChanged) $changed = array_values(array_unique([...$changed, 'opportunity', 'territory'])); elseif ($choicesChanged) $changed[] = 'portfolio_origins'; $conditionsChanged = (bool) array_intersect($changedFields, array_diff(self::FIELDS, ['project_title', 'project_summary'])); - $dependencyChanged = $choiceInputsChanged || $this->dependencyHash($old['selection']) !== $this->dependencyHash($selection) || $conditionsChanged; + $dependencyChanged = $choiceInputsChanged || in_array('complements', $changed, true) || $this->dependencyHash($old['selection']) !== $this->dependencyHash($selection) || $conditionsChanged; $privateConditionsChanged = (bool) array_intersect($changedFields, PrivateInvestmentPreparation::FIELDS); $calculationInputsChanged = $choiceInputsChanged || $this->dependencyHash($old['selection']) !== $this->dependencyHash($selection) || (bool) array_intersect($changedFields, array_diff(self::FIELDS, ['project_title', 'project_summary', ...array_diff(PrivateInvestmentPreparation::FIELDS, ['total_investment', 'area_required', 'area_unit'])])); $payload = $this->desk->decode($case->payload); @@ -493,6 +505,7 @@ final class InvestorContext if ($privateConditionsChanged) { $steps = array_values(array_unique([...$steps, 'S02', 'S05', 'S06', 'S07'])); } + if (in_array('complements', $changed, true)) $steps = array_values(array_unique([...$steps, 'S02', 'S08'])); $privatePreparation = null; if (app(PrivateInvestmentPreparation::class)->available()) { $docs = $this->preparationDocuments($id); @@ -500,7 +513,7 @@ final class InvestorContext $afterPreparation = app(PrivateInvestmentPreparation::class)->assess(['fields' => $fields, 'selection' => $selection, 'preparation_documents' => $links], $docs); $privatePreparation = ['before' => $beforePreparation, 'after' => $afterPreparation]; } - $plan = ['opportunity_choices' => $choices, 'case_id' => $id, 'version' => (int) $case->version, 'revision' => (int) $old['revision'], 'selection' => $selection, 'fields' => $fields, 'provenance' => $provenance, + $plan = ['complements' => $complements, 'opportunity_choices' => $choices, 'case_id' => $id, 'version' => (int) $case->version, 'revision' => (int) $old['revision'], 'selection' => $selection, 'fields' => $fields, 'provenance' => $provenance, 'preparation_documents' => $links, 'private_investment' => $privatePreparation, 'updated' => $replaced, 'maintained' => $kept, 'changed_dimensions' => $changed, 'dependent_results' => (int) $case->user_id === $actor->id && $calculationInputsChanged ? array_map(fn ($r) => ['id' => $r['id'], 'engine' => $r['engine']], $results) : [], 'requests' => $requests, 'review_steps' => $steps, 'dependency_changed' => $dependencyChanged, 'calculation_inputs_changed' => $calculationInputsChanged, 'documents_preserved' => DB::table('desk_documents')->where('case_id', $id)->count(), @@ -545,8 +558,9 @@ final class InvestorContext $review[$step] = ['revision' => $revision, 'reason' => 'O contexto mudou; reveja os pressupostos e a evidência aplicável.']; } $context = ['opportunity_choices' => $plan['opportunity_choices'], 'preparation_documents' => $plan['preparation_documents'], 'preparation_snapshot' => $plan['private_investment']['after'] ?? $before['preparation_snapshot'] ?? null, 'revision' => $revision, 'selection' => $plan['selection'], 'fields' => $plan['fields'], 'provenance' => $plan['provenance'], 'review_steps' => $review, - 'dependency_hash' => $this->dependencyHash([...($plan['opportunity_choices'] !== [] ? ['opportunity_choices' => $plan['opportunity_choices']] : []), 'selection' => $plan['selection'], 'fields' => Arr::except($plan['fields'], ['project_title', 'project_summary'])]), 'updated_at' => now()->toIso8601String(), 'updated_by' => $actor->id]; + 'dependency_hash' => $this->dependencyHash([...($plan['opportunity_choices'] !== [] ? ['opportunity_choices' => $plan['opportunity_choices']] : []), ...($plan['complements'] ? ['complements' => $plan['complements']] : []), 'selection' => $plan['selection'], 'fields' => Arr::except($plan['fields'], ['project_title', 'project_summary'])]), 'updated_at' => now()->toIso8601String(), 'updated_by' => $actor->id]; $context['requirements_assessment'] = $plan['requirements_assessment']; + $context['complements'] = $plan['complements']; if ($plan['calculation_inputs_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()]; @@ -629,6 +643,7 @@ final class InvestorContext 'zone' => $zone ? Arr::only($zone, ['id', 'title', 'href', 'version', 'sha256', 'fields', 'analysis']) : null, 'provenance' => $ctx['provenance'], 'opportunity_choices' => $ctx['opportunity_choices'] ?? [], + 'complements' => $ctx['complements'] ?? [], 'requirements_assessment' => $ctx['requirements_assessment'] ?? null, 'path' => $ctx['path_applicability'] ?? null, 'land_preparation' => $ctx['land_preparation'] ?? null, diff --git a/docs/investmoz/unification/investment-complements-qa-receipt-20261023.json b/docs/investmoz/unification/investment-complements-qa-receipt-20261023.json new file mode 100644 index 00000000..707e2e7a --- /dev/null +++ b/docs/investmoz/unification/investment-complements-qa-receipt-20261023.json @@ -0,0 +1,199 @@ +{ + "date": "2026-10-23", + "timezone": "Africa/Johannesburg", + "status": "implemented_and_visually_verified_in_isolated_qa_not_installed", + "baseline_commit": "4098192a056959d788e6f9ff5cd501211b001f39", + "preserved_acceptance": { + "delivery": "6b544548d3c83fc8a72ab65d8f58f84685a2877f", + "receipt": "4098192a056959d788e6f9ff5cd501211b001f39", + "cases_repeated": false + }, + "cause": { + "portfolio_field": "content.focus", + "previous_contract": "string rendered as descriptive text; no complementary selection or typed origin-target relationship in the dossier", + "data_loss_claimed": false + }, + "scope": { + "components": [ + "irrigation", + "storage", + "cold", + "processing", + "spinning", + "logistics", + "certification", + "training", + "finance" + ], + "existing_opportunity_identity_preserved": true, + "documented_sources": [ + "portfolio associations including the existing accepted documentary membership", + "public complementary_project_links", + "existing publicly disclosed value-chain references", + "published offering partnerships explicitly associated with the origin" + ], + "distinct_states": [ + "registered opportunity", + "identified complementary need without a matched offer", + "existing service or instrument", + "previously selected relationship requiring review" + ], + "dossier": [ + "encrypted existing payload", + "draft", + "preview and confirmation", + "explicit removal and reselection", + "existing audit history", + "source and territory preserved", + "pending edits saved before complementary navigation" + ], + "consumers": [ + "dossier", + "shared prefill component for simulator, land, desk and submission", + "simulator context snapshot", + "shared report and export rows" + ] + }, + "validation": { + "database": "simulator_fiscal_delta_20261021_test", + "host": "127.0.0.1", + "port": 55441, + "database_identity_guard": true, + "test_transaction_rollback": true, + "feature_test_file": "tests/Feature/InvestmentComplementsTest.php", + "feature_tests_passed": 8, + "feature_assertions": 134, + "frontend_test_file": "tests/frontend/investment-complements.test.mjs", + "frontend_tests_passed": 2, + "typescript": "passed", + "build": "passed", + "php_syntax": "passed", + "diff_whitespace_check": "passed", + "public_chain_branch": "synthetic public projection contract; not evidence of new real-world chain associations", + "browser_visual_verification": "passed_for_the_requested_complement_scope" + }, + "visual_verification": { + "date": "2026-10-23", + "environment": "http://127.0.0.1:18574", + "router": "tools/corridor-agribusiness-qa-router.php", + "database_guard_checked_on_requests": true, + "actor": "existing synthetic QA actor 509; existing normal browser session", + "case_id": "6fdbb963-726e-4048-9884-8cddc04e77a6", + "case_title": "SYNTHETIC QA — conferência visual de complementos 23-10-2026", + "existing_opportunity": { + "id": 286, + "reference": "INV-MZ-GEN-8128691124566423", + "slug": "inv-mz-gen-8128691124566423", + "result": "Opened the existing fiche from the storage complement; the preparation entry retained the portfolio origin and the existing identity. No reimport or duplicate." + }, + "need_without_identified_offer": { + "code": "spinning", + "origin": "portfolio:a7271336-808b-42b4-8bfd-5b49c72dbe2b", + "result": "Started idea preparation in the same dossier; recovered as a complementary need with location still undetermined, without inventing an offer or inheriting Sofala." + }, + "associated_service": { + "id": 17, + "synthetic_fixture": true, + "origin": "opportunity:309", + "territory": "Gaza", + "result": "Opened the existing QA service fiche, selected it through the return action, confirmed it and recovered it in the same dossier." + }, + "multiple_opportunities": { + "first": { + "id": 286, + "territory": "Sofala" + }, + "second": { + "id": 309, + "territory": "Gaza", + "synthetic_fixture": true + }, + "complementary_opportunity": { + "id": 310, + "origin_id": 309, + "territory": "Gaza", + "synthetic_fixture": true + }, + "service_origin_id": 309, + "recovered_after_confirmation_and_browser_reload": true, + "complements_assigned_to_first_automatically": false + }, + "fixture_preparation": { + "previous_service_offerings_in_qa": 0, + "new_synthetic_records": "Two projects, two opportunities, one explicit complementary-project link and one associated training offering, solely in the guarded QA database; no grants or real publication/approval claims.", + "preexisting_records_preserved_by_hash": { + "opportunities": 45, + "projects": 17, + "investment_dossiers": 30, + "portal_partnerships": 0 + }, + "fixtures_and_visual_case_persisted_in_qa": true, + "fixture_receipt": "outputs/complements-visual-20261023/fixture.json" + }, + "evidence_directory": "outputs/complements-visual-20261023", + "automated_suites_repeated": false, + "functional_code_changes_in_this_visual_pass": false, + "does_not_demonstrate": [ + "multi-opportunity zones and parks", + "specific per-opportunity context in land assistance", + "specific per-opportunity context in virtual desk", + "specific per-opportunity context in manifestation", + "availability of a real training or financing service in homologation" + ], + "evidence_files": [ + { + "path": "outputs/complements-visual-20261023/existing-opportunity.png", + "bytes": 112261, + "sha256": "93425703b17c0976a5728acc7448faa0b7dd73e34973cb68ebf72cb9d416dd58" + }, + { + "path": "outputs/complements-visual-20261023/associated-service.png", + "bytes": 117223, + "sha256": "a5d16746b4264b779430cc3843959492bea41a3da2adc00298fa2133c99aef9d" + }, + { + "path": "outputs/complements-visual-20261023/recovered-opportunities.png", + "bytes": 99910, + "sha256": "eb65dd0d42af0c9f553db6756760dcc16f598b2da7b3d0157b6faea3dbebf24e" + }, + { + "path": "outputs/complements-visual-20261023/recovered-complements.png", + "bytes": 147972, + "sha256": "4e2db825710665298803542fe9c7f299404962503609948ddd083c3daf195a73" + }, + { + "path": "outputs/complements-visual-20261023/recovered-visible-state.json", + "bytes": 2304, + "sha256": "d2ada1b501db973f1492a54f1704e9cb2de112e38cacd4ab916f059dbbd11f18" + }, + { + "path": "outputs/complements-visual-20261023/fixture.json", + "bytes": 904, + "sha256": "79fa2ac8196ca5620b258c78332a2462b44f2c5b622fc0c1895fb39199efcd67" + } + ] + }, + "preservation": { + "active_database_writes": false, + "homologation_installation": false, + "migration": false, + "publication": false, + "import": false, + "new_roles_or_grants": false, + "new_matrix_or_backlog": false + }, + "matrix_rows": [ + "RF-CLU-003", + "RF-COR-004", + "AUD-REL-02", + "AUD-LEG-06", + "AUD-SIM-INT06" + ], + "limitations": [ + "Visual verification is limited to the documented QA scenarios; no Tempo acceptance or destination installation is claimed.", + "The resolver covers the nine requested component scopes in available documentary contexts; unmatched expressions and absent relationships are not fabricated.", + "No matched offer means none identified in the examined relationships, not proof that the entire collection has no offer.", + "The existing first-opportunity zone/park selection and complete per-opportunity requirements in other forms remain partial.", + "No global completion of the adaptive journey is claimed." + ] +} diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index 96a5981a..616cf16c 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -1,5 +1,62 @@ # Rastreabilidade, utilização e formação +## Complementos — conferência visual QA concluída no recorte pedido, 23/10/2026 + +Pedido da Tempo: conferir abertura da ficha complementar existente, preparação de necessidade sem oferta identificada, selecção de serviço/instrumento e recuperação de selecção/origem/localização; com várias oportunidades, verificar a ligação à oportunidade escolhida, sem assumir a primeira. Homologação inalterada e fechos anteriores preservados. Esta passagem supera **apenas a pendência visual dos complementos neste recorte** nas secções abaixo; não declara a aplicação transversal concluída. + +Ambiente usado: navegador Edge em `http://127.0.0.1:18574`, servido pelo router QA existente, com guarda efectiva de `simulator_fiscal_delta_20261021_test:55441` em cada pedido. Reutilizada a sessão normal da conta sintética QA 509; sem criar sessão, contornar MFA ou conceder papéis. Criado pela interface o dossier **SYNTHETIC QA — conferência visual de complementos 23-10-2026**, ID `6fdbb963-726e-4048-9884-8cddc04e77a6`; nenhum dossier anterior foi editado. + +| Passagem visual | Resultado demonstrado | +| --- | --- | +| Abrir oportunidade complementar existente | Silos/armazenagem → Milho, trigo e arroz — Corredor da Beira, ID **286**, referência e slug `INV-MZ-GEN-8128691124566423`/`inv-mz-gen-8128691124566423`, conservados. A entrada de preparação recebeu a relação à carteira e a mesma identidade, sem reimportação. | +| Preparar necessidade sem oferta identificada | Acção de Fiação abriu a preparação no mesmo dossier e apresentou **Necessidade complementar — ideia em preparação**. Confirmada e recuperada com origem no Corredor da Beira e Centro. A localização inicialmente não escolhida ficou **Por definir**, sem receber Sofala por associação à primeira oportunidade. | +| Seleccionar serviço associado | Ficha do serviço QA **17**, de Formação, aberta e seleccionada por **Seleccionar este complemento e continuar no dossier de origem**. Origem: segunda oportunidade QA **309**; localização: **Gaza**. Recuperadas após confirmação e recarregamento. | +| Várias oportunidades, sem assumir a primeira | Primeira ficha **286 → Sofala**; segunda **309 → Gaza**. O complemento de frio **310** e Formação **17** ficaram ligados à **309**, em **Gaza**; a primeira ficha continuou em Sofala. A consulta das fichas e o retorno conservaram as escolhas pendentes, incluindo Fiação. | +| Recuperar no dossier | Após **Rever dados antes de guardar → Guardar dados do investimento → Voltar ao dossier → recarregar**, recuperaram-se três fichas e quatro relações complementares: Silos/armazenagem, Fiação, Formação e Cadeia de frio, cada uma com a sua origem e localização informada ou indeterminada. O título deliberado do dossier permaneceu intacto. | + +**Âmbito dos exemplos:** a ficha 286 e a origem da carteira são identidades já existentes em QA. A base QA não tinha ofertas de serviços; para a prova visual positiva foram preparados **dois projectos, duas oportunidades (309/310), uma relação complementar pública e um serviço (17)**, todos explicitamente marcados **SYNTHETIC QA**. O serviço foi tornado visível unicamente como fixture da base QA guardada, não como publicação real nem aprovação da Tempo; não foi transportado para a homologação. A prova não declara um serviço real disponível no destino. Os registos anteriores de oportunidades (45), projectos (17), fichas da carteira (30) e parcerias (zero) permaneceram iguais por hash na preparação das fixtures. Originais, relações, permissões e aceitações anteriores foram preservados. + +Provas locais: [ficha existente](../../../outputs/complements-visual-20261023/existing-opportunity.png), [serviço e sua origem](../../../outputs/complements-visual-20261023/associated-service.png), [oportunidades recuperadas](../../../outputs/complements-visual-20261023/recovered-opportunities.png) e [complementos recuperados](../../../outputs/complements-visual-20261023/recovered-complements.png). Texto visível recuperado e recibo das fixtures no mesmo directório. Actualizado o [recibo existente](investment-complements-qa-receipt-20261023.json) e a cobertura das cinco linhas existentes da matriz. Não houve nova alteração funcional, migration, instalação, importação ou escrita na homologação nesta passagem; as suites automáticas anteriores não foram repetidas. + +**Saldo preservado:** conferência visual positiva dos complementos descritos, incluindo origem na segunda oportunidade. Zonas/parques, Terra/DUAT, Balcão e manifestação com contextos específicos de várias oportunidades **continuam por demonstrar**. Não se declara aceitação da Tempo, disponibilização no destino ou fecho global. Os três fechos de `6b544548`/`4098192a` mantêm-se. + +## Complementos ligados ao investimento e ao dossier — preparação QA, 23/10/2026 + +**Origem funcional:** pedido expresso da Tempo nesta retoma: ligar regadio, silos, frio, processamento, fiação e logística às oportunidades existentes; distinguir necessidades ainda sem oferta; ligar certificação, formação e financiamento aos serviços/instrumentos existentes, conservando contexto e identidade no dossier. Este incremento não reabre gravação/idioma, proveniência do relatório ou Beira → sete oportunidades, encerrados no âmbito de `6b544548`/`4098192a`. Mantêm-se as aceitações e os limites transversais anteriores. + +**Causa delimitada no código anterior:** `content.focus` era uma string, validada com os restantes campos textuais em `InvestmentPortfolioController::save` e apresentada por `portfolio/show.tsx` como texto em `
`. Não existia resolução desses complementos para identidades de oportunidades/serviços nem selecção complementar no contexto privado. O bloco separado de oportunidades relacionadas não conservava uma relação tipificada «origem → complemento escolhido». Isso demonstra a integração ausente nesse trecho, não eliminação de fichas ou perda de dados. A tabela `complementary_project_links` já existia; não se criou outra tabela ou cadastro paralelo. + +**Comportamento preparado no percurso existente:** + +- As fichas públicas da carteira e das oportunidades apresentam os complementos mencionados no seu contexto documental. O resolvedor `InvestmentComplements` cruza a menção com as relações existentes à carteira, as ligações públicas entre projectos complementares ou a cadeia de valor publicamente documentada. A menção isolada não associa oportunidades fora dessas relações. Mantêm-se os estados publicados da classificação, incluindo referências preliminares, sem os promover a confirmação. +- Uma oportunidade identificada abre pela mesma rota/ID/slug; a escolha inclui origem, tipo de complemento, ficha de destino, localização escolhida, versão, trecho, fonte e hash do contexto consultado. Quando a componente está expressamente incluída na própria oportunidade, liga a essa identidade e explica-o, sem criar outra ficha. +- Certificação/formação/financiamento consultam ofertas publicadas da Bolsa explicitamente ligadas à origem, distinguindo `offering` de `seeking`. Serviços ligados à ficha da carteira ou ao seu projecto/cluster também são reutilizados. Financiamento reutiliza o tipo financeiro existente; uma necessidade de financiamento no resumo de um projecto não é, por si, uma oferta. Não se activaram contratos modulares nem instrumentos por importação. +- Sem oferta identificada nas relações desse contexto, apresenta-se **necessidade complementar**, com acção para iniciar uma ideia ou prepará-la num dossier existente. Não se cria nem publica uma oportunidade como efeito dessa acção. A ausência de correspondência neste recorte não declara inexistência absoluta no acervo. +- No editor do dossier, os complementos são consultados por oportunidade e localização; um território conhecido incompatível exclui o destino, e localização desconhecida continua «por definir». As escolhas têm prévia e confirmação, rascunho, retirada explícita e recuperação. Ao consultar/seleccionar outro complemento, a navegação aguarda a gravação das edições pendentes; o contexto acompanha a consulta da ficha pública. Uma entrada antiga retirada não volta por actualização; uma nova selecção explícita pode recuperá-la. +- A relação fica no payload cifrado e no histórico existente do dossier, aparece no dossier e no componente comum dos quatro formulários, e acompanha o snapshot do simulador e as linhas do modelo comum de relatório/exportação. Os dados deliberados do investimento principal conservam-se. Uma oferta retirada não pode entrar como nova escolha; uma relação anteriormente confirmada conserva o snapshot para revisão, sem republicar a oferta. Uma origem indisponível na consulta em lote é assinalada e não oculta os restantes resultados. + +**Escolhas técnicas, sem novas exigências organizacionais:** vocabulário literal dos nove âmbitos solicitados para identificar trechos; IDs e relações existentes para resolver destinos; filtragem pela hierarquia territorial pública; selecção complementar no JSON cifrado e confirmação/versionamento já existentes. Não houve migration, novo papel, nova aprovação, importação, publicação, alteração de dados activos ou instalação na homologação. Não se transportaram dados QA para o destino. + +**Verificação delimitada:** testes novos de `InvestmentComplementsTest` na base isolada `simulator_fiscal_delta_20261021_test`, porta 55441, com guarda do alvo e transacções revertidas; testes frontend novos em `investment-complements.test.mjs`; TypeScript e build. A prova da cadeia de valor usa um contrato público sintético identificado como tal, sem declarar novas relações reais no cadastro. Recibo resumido: [investment-complements-qa-receipt-20261023.json](investment-complements-qa-receipt-20261023.json). Não se repetiram os três casos aceites. Não se declara conferência visual nova no navegador, instalação ou aceitação da Tempo. + +**Guia de utilização preparado:** abrir a ficha principal → **Investimentos e serviços complementares** → consultar a ficha correspondente ou **Iniciar preparação de uma ideia** → seleccionar o dossier autorizado ou criar a ideia → rever os complementos, localizações e diferenças → confirmar no editor. Para retirar, usar **Retirar esta relação da preparação** e confirmar a comparação. Os formulários ligados mostram a relação consultada, mantendo os seus próprios dados e operações de gravação/submissão. + +**Saldo:** este incremento cobre a ligação e conservação dos complementos resolvidos pelas fontes/relações acima. Não declara associação automática de todos os complementos a todas as fichas, cadastro completo dos serviços ou cobertura de todas as expressões possíveis. As opções comuns de zonas/parques e a passagem de requisitos específicos de várias oportunidades aos restantes formulários, identificadas na avaliação anterior, continuam parciais. Matriz existente: RF-CLU-003, RF-COR-004, AUD-REL-02, AUD-LEG-06 e AUD-SIM-INT06, sem nova matriz/backlog. + +## Avaliação dos trechos restantes — 23/10/2026 + +Decisão expressa da Tempo nesta retoma: **encerradas no âmbito reportado** gravação/idioma, origem dos dados no relatório e ligação da Beira às sete oportunidades; entrega `6b544548`, recibo `4098192a`. Reutilizar essas provas, sem repetir os casos aceites. **A aplicação transversal permanece parcial.** Esta passagem é avaliação estática do código e inventário de cobertura existente; não é nova prova visual, execução dos testes citados ou alteração na homologação. Não foi confirmada perda adicional de dados ou funcionalidades. + +| Prioridade | Implementação e provas existentes a preservar | Limite encontrado / trecho ainda a demonstrar | +| --- | --- | --- | +| Várias oportunidades | `InvestmentOpportunityChoices`, `InvestorContext` e `investment-opportunity-choices.tsx` conservam território, actividades e origens por ficha. O teste existente `test_multiple_opportunities_keep_sites_sources_requirements_and_results_in_one_dossier` cobre confirmação, recuperação, requisitos agregados e resultados preservados. Não foi repetido. | `InvestorContext.php:384–386` escolhe a primeira oportunidade para os campos comuns. Avaliar retirada/mudança da primeira e alteração apenas da segunda, sem atribuir os dados comuns a todas as fichas. A existência do teste não demonstra a interface deste delta. | +| Corredor/localização | Cada cartão tem corredor e caminho territorial próprios; a mudança conserva caminho compatível e retira níveis incompatíveis com explicação. O teste existente `test_corridor_change_keeps_compatible_paths_and_removes_only_incompatible_geography` preserva esta cobertura. | `context.tsx` carrega parques por `choices[0]`, e `InvestorContext` também usa a primeira escolha na compatibilidade comum. Uma mudança apenas na segunda não altera esses parâmetros. Falta demonstrar como se apresenta e distingue a aplicabilidade das zonas/parques nas várias oportunidades. Não inferir que todas perderam a localização. | +| Reutilização nos restantes formulários | `DossierPrefill` está integrado em simulador, Terra/DUAT, balcão e manifestação. `inheritCompatibleFields` preenche vazios, acompanha herança identificada e conserva valores deliberados; a interface permite comparar/substituir campos. Balcão respeita os campos editáveis de um pedido devolvido. | `prefill()` entrega uma parcela territorial comum a Terra/DUAT e valores comuns aos outros destinos. No componente de reutilização, a lista `OpportunityChoices` só aparece para `simulator`. Não está demonstrada a passagem dos contextos específicos de duas oportunidades aos restantes formulários; a ligação ao mesmo dossier não comprova essa cobertura. | + +Próxima prova delimitada em QA isolado: duas oportunidades com corredores/localizações distintos; mudar apenas a segunda e conferir opções/requisitos e conservação da primeira; retirar a primeira e comparar o impacto proposto nos campos comuns; abrir Terra/DUAT, balcão e manifestação a partir desse dossier, conferir dados comuns e referências específicas, preservar uma edição deliberada e recuperar os formulários. Usar apenas as etapas aplicáveis, sem manifestação/submissão real. Não repetir idioma/gravação, proveniência do relatório ou as sete ligações aceites. A comparação entre primeira e segunda escolha é um método técnico de avaliação, não uma nova regra de negócio nem decisão de escolher uma localização comum pela Tempo. + +Cobertura registada nas linhas existentes AUD-SIM-INT03 e AUD-LEG-06 da matriz; sem nova matriz ou backlog. Nenhuma alteração de código funcional, schema, dados, configuração ou permissões nesta avaliação. Os limites acima permanecem pendentes de demonstração/correcção delimitada; não são declarados resolvidos por documentação. + ## Instalação e conferência das três correcções — 23/10/2026 **Revisão servida: `6b544548`.** Conferência visual QA da Beira concluída antes da integração: sete oportunidades visíveis, Florestas abre com origem da carteira conservada nos dois botões de preparação. Integrada por avanço directo no Git, sem alterações concorrentes em main. Executor concluído às 13:45:19 UTC, 206/206 testes frontend; zero migrations/importações e nenhuma alteração de permissões. Recibo: `continuity-corrections-installation-receipt-20261023.json`. As referências abaixo a QA pendente/homologação em `7c1f5321` descrevem o estado histórico anterior, sucedido por esta instalação. diff --git a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv index 5673c7f1..5f130fcd 100644 --- a/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv +++ b/docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv @@ -32,13 +32,13 @@ RF-CLU-001,"Administrar clusters, subclusters, cadeias de valor, taxonomias e ve [Executável 312965f2c653] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. [Homologação 312965f2c653 executada] Autorização Tempo; 30 fichas privadas/30 locais/31 suportes/11 relações/2 originais e 2 definições internas, 233 caminhos conferidos. Dados anteriores/permissões preservados; zero publicação/migrations/geometrias/P7. Saldo delimitado de execução concluído. Dossier legítimo, oito lacunas e questões de autenticação/visual separadas. RECIBO-EXECUCAO-312965.json.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,," | QA01: prova positiva delimitada de atividade/cadeia e operações do lote concluída, conservando as aceitações anteriores e a semântica privada/confirmada/pública. | ATIVO01: instalação/importação/publicação autenticadas, scan, repetição idempotente, recuperação pública do ramo A/01/011/0112/01120 e preservação operacional concluídos. Provas funcionais QA aceites reutilizadas, sem repetição."," | QA01: divergência documental 600/579 e edição normativa abertas; cadeia editorial; publicação canónica com pré-condições sintéticas; save legado transacional; sem volume ou recuperação de payload legado cifrado; reversão parcial com sete fontes funcionais. Sem decisão ativa presumida. | ATIVO01: não encerra CAE integral ou divergência 600/579/edição normativa; cadeia exclusivamente editorial. Nenhuma classificação ou relação de investimento real alterada/divulgada. Limites QA anteriores e reversão parcial compatível mantidos; editor UUID ativo de /negocios continua não demonstrado e não bloqueante. Parques, duplicados e regulação Fintech separados.","0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-002,"Relacionar o cluster com projectos, oportunidades, actores e territórios.",upgrade v4 SHA f0b9815…; p. 513; requirements-audit.csv,oportunidades,/api/v1/business-opportunities; /api/v1/business-opportunities/{slug}; /investidor/terra-duat; /investidor/terra-duat/novo; /investidor/terra-duat/{id}; /investidor/terra-duat/{id}/actualizacoes; /investidor/terra-duat/{id}/documentos; /investidor/terra-duat/{id}/documentos/{attachment}; /investidor/terra-duat/{id}/editar; /investidor/terra-duat/{id}/imprimir; /investidor/terra-duat/{id}/solicitar-apoio; /management/opportunities,"OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,Reconciliar contrato/cláusula e provas por categoria; completar apenas falha/variante executável identificada. Response normativo não é completo. Critério individual original preservado; cobertura atual ainda não individualizada.,"030000→040000 já instalados; contratos/resources existentes, sessão/MFA, ClamD e worker para ficheiros; gates das seis categorias ON. Variantes modulares/offers continuam separadas. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-002: As relações com projectos, negócios, empresas âncora, PME, fornecedores, compradores, financiadores, reguladores e instituições indicam papel, prioridade, período e estado, sem duplicar os registos de origem e com navegação nos dois sentidos.",P1,RF-CLU-002: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-002,1,"[{""id"":""RF-CLU-002"",""pedido"":""Relacionar o cluster com projectos, oportunidades, actores e territórios."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 513; requirements-audit.csv""],""aceitacao"":""As relações com projectos, negócios, empresas âncora, PME, fornecedores, compradores, financiadores, reguladores e instituições indicam papel, prioridade, período e estado, sem duplicar os registos de origem e com navegação nos dois sentidos."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""oportunidades""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.opportunities: 6 registos; public.opportunity_images: tabela ausente; public.opportunity_documents: tabela ausente; public.opportunity_location_drafts: tabela ausente,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Relações tipadas de uma oportunidade com cluster, projeto e território recuperadas; múltiplos atores empresariais não cadastrados nem inventados. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Associação tipada com cluster e recuperação do mesmo anúncio demonstradas; múltiplos atores e navegação bidirecional integral não foram demonstrados neste recorte. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral.","Reconciliar contrato/cláusula e provas por categoria; completar apenas falha/variante executável identificada. Response normativo não é completo. Critério individual original preservado; cobertura atual ainda não individualizada. | Disponibilização DOC01 executada. Limitação operacional concreta: Editor no ativo: não demonstrado nesta conferência. O utilizador informou não ter acesso à conta de Promotora interna Aurora Chachuaio. A sessão efetiva Osmane Nala, conta 2, recebeu 403 em GET /minhas-oportunidades/create; não existe elevação operacional ativa. Os papéis Promotor/Validador dessa conta permanecem atribuídos; as funções de autorização v1 conferem exatamente com a versão anterior à entrega. Existem seis oportunidades legadas e nenhuma do workflow de promotor no ativo. A mensagem 403 genérica não expõe o motivo; o diagnóstico fica registado, sem alterar permissões, credenciais ou acrescentar uma correção fora do pacote autorizado. Mantêm-se as provas funcionais QA aceites do editor.; limites do critério integral: Relações tipadas de uma oportunidade com cluster, projeto e território recuperadas; múltiplos atores empresariais não cadastrados nem inventados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Recorte QA concluído; disponibilização deste incremento exige decisão específica. Associação tipada com cluster e recuperação do mesmo anúncio demonstradas; múltiplos atores e navegação bidirecional integral não foram demonstrados neste recorte. As quatro outras lacunas conservam o seu estado; provas aceites não se repetem. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Recuperação UUID no ativo não observada: conta 2 sem anúncio próprio; dois rascunhos pertencem a outro titular. Não criar dados nem alargar acesso para preencher esta limitação. Cadeia sem caso positivo, sem ensaio volumétrico e limite do payload sintético da reversão mantêm-se. Outras quatro lacunas inalteradas.","OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources","030000→040000 já instalados; contratos/resources existentes, sessão/MFA, ClamD e worker para ficheiros; gates das seis categorias ON. Variantes modulares/offers continuam separadas.","Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas.",Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: oportunidades. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json,oportunidades,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada, | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",app/Services/OpportunityManagement.php; app/Services/OpportunityResources.php; resources/js/pages/management/opportunity-draft.tsx — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"OpportunityManagementTest, OpportunityResourcesTest, OpportunityOriginReviewTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, -RF-CLU-003,Representar a cadeia de valor e identificar lacunas de investimento.,upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-003: O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção.",P2,RF-CLU-003: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-003,1,"[{""id"":""RF-CLU-003"",""pedido"":""Representar a cadeia de valor e identificar lacunas de investimento."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv""],""aceitacao"":""O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Vínculo à cadeia existente e etapa documentada disponíveis; cenário têxtil apenas sintético, sem empresas ou capacidades reais. Identificação económica integral de lacunas não demonstrada. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Preparação do contrato/filtro de cadeia disponível; caso positivo não demonstrado porque não existe cadeia consultável na QA. Cadeia integral e lacunas de investimento continuam abertas. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Leitura READ ONLY de dois clones: destino restaurado com 12 setores/6 raízes editoriais/8 clusters/zero elos e ligações; QA aceite tem ainda três níveis sintéticos em setores distintos. UNIQUE economic_activities_sector_uq impede várias atividades por setor; escolha técnica, não regra identificada da Tempo. Fontes oficiais aceites preservadas, sem revalidação. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 600 versus 579 é divergência documental a reconciliar, não escolha arbitrária da Tempo. Recomendações recebidas: limitar QA aos cinco nós do exemplar por hash/versão; divisão 01 como subsector e 01120 como atividade com cinco níveis; CLU-01 como modelo editorial. Não se declara conformidade normativa integral nem execução/aceitação QA. +RF-CLU-003,Representar a cadeia de valor e identificar lacunas de investimento.,"upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-003: O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção.",P2,RF-CLU-003: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-003,1,"[{""id"":""RF-CLU-003"",""pedido"":""Representar a cadeia de valor e identificar lacunas de investimento."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 517; requirements-audit.csv""],""aceitacao"":""O cluster apresenta fornecimento, produção, transformação, logística, comercialização, serviços e mercados; cada lacuna possui localização, capacidade necessária, justificação, estado e chamada para acção."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Vínculo à cadeia existente e etapa documentada disponíveis; cenário têxtil apenas sintético, sem empresas ou capacidades reais. Identificação económica integral de lacunas não demonstrada. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Preparação do contrato/filtro de cadeia disponível; caso positivo não demonstrado porque não existe cadeia consultável na QA. Cadeia integral e lacunas de investimento continuam abertas. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Leitura READ ONLY de dois clones: destino restaurado com 12 setores/6 raízes editoriais/8 clusters/zero elos e ligações; QA aceite tem ainda três níveis sintéticos em setores distintos. UNIQUE economic_activities_sector_uq impede várias atividades por setor; escolha técnica, não regra identificada da Tempo. Fontes oficiais aceites preservadas, sem revalidação. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 600 versus 579 é divergência documental a reconciliar, não escolha arbitrária da Tempo. Recomendações recebidas: limitar QA aos cinco nós do exemplar por hash/versão; divisão 01 como subsector e 01120 como atividade com cinco níveis; CLU-01 como modelo editorial. Não se declara conformidade normativa integral nem execução/aceitação QA. [RECONCILIACAO-43-20261019] 4: Gestão /management/economic-references/lot-01 ainda exige gate global. Catálogo restante requer reconciliação por identidade/edição e lote, não inferência por contagens.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. | Disponibilização DOC01 executada. Limitação operacional concreta: Editor no ativo: não demonstrado nesta conferência. O utilizador informou não ter acesso à conta de Promotora interna Aurora Chachuaio. A sessão efetiva Osmane Nala, conta 2, recebeu 403 em GET /minhas-oportunidades/create; não existe elevação operacional ativa. Os papéis Promotor/Validador dessa conta permanecem atribuídos; as funções de autorização v1 conferem exatamente com a versão anterior à entrega. Existem seis oportunidades legadas e nenhuma do workflow de promotor no ativo. A mensagem 403 genérica não expõe o motivo; o diagnóstico fica registado, sem alterar permissões, credenciais ou acrescentar uma correção fora do pacote autorizado. Mantêm-se as provas funcionais QA aceites do editor.; limites do critério integral: Vínculo à cadeia existente e etapa documentada disponíveis; cenário têxtil apenas sintético, sem empresas ou capacidades reais. Identificação económica integral de lacunas não demonstrada. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Recorte QA concluído; disponibilização deste incremento exige decisão específica. Preparação do contrato/filtro de cadeia disponível; caso positivo não demonstrado porque não existe cadeia consultável na QA. Cadeia integral e lacunas de investimento continuam abertas. As quatro outras lacunas conservam o seu estado; provas aceites não se repetem. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Recuperação UUID no ativo não observada: conta 2 sem anúncio próprio; dois rascunhos pertencem a outro titular. Não criar dados nem alargar acesso para preencher esta limitação. Cadeia sem caso positivo, sem ensaio volumétrico e limite do payload sintético da reversão mantêm-se. Outras quatro lacunas inalteradas. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Preparar manifesto fechado, adaptar cardinalidade/hierarquia sem copiar mestres, demonstrar preview/idempotência/recusas e caso positivo de cadeia nos dois consumidores; recuperação, decisão independente, divulgação expressa, filtros AND e reversão após edição pelo código anterior com compatibilidade. Nada demonstrado/encerrado por este mapa. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Implementação/provas funcionais e operacionais apenas após decisão QA. Incluir HTTP com esquema ausente, importação privada, publicação e retirada distintas, recusas de identidade/MFA/CSRF/hash, replay/concorrência e motivos visíveis. Reversão após uso é parcial e compatível: schema/dados, seis fontes funcionais, manifesto e build de compatibilidade coerente permanecem; provar edição posterior. Caso positivo de cadeia segue pendente nos dois consumidores. [UTILIZACAO-HOMOLOGACAO-20261019] 4: Disponibilidade condicionada conforme limite registado — 11 actividades presentes; cinco novas referências transportadas. Activação/publicação do lote não executada. -[UTILIZACAO-HOMOLOGACAO-20261019] Correcção por leitura:11 actividades já published, sem nova activação necessária; cobertura integral e cálculos separados.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: sectors, reference_catalog_versions, economic_activities, economic_clusters, value_chains/value_chain_links, opções/decisão/projeção canónicas e suplemento /negocios existentes. UUID de referência publicado/v12 e restantes classificações intactos.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Folhas eBAU: 1360 códigos em cinco níveis; duas cópias de hashes diferentes com as mesmas 8145 células. 600 subclasses versus 579 no roteiro; edição da folha não determinada. Convenções divisão 01/subclasse 01120 e cinco elos editoriais do CLU-01 propostas para decisão. Não associar por nomes. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Caminho operacional desenhado desde já por extensão autenticada do padrão existente: prévia e POST separados de esquema/importação privada/publicação/retirada; ator da sessão, autorização efetiva, MFA concluído, CSRF, hashes, scan, idempotência e backup/restauro fresco. Ainda não implementado/instalado; não deixado para depois da aceitação. Não alterar instaladores de B/COUNTRY02 ou importador documental.","Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Proposto um catálogo de origem na mesma estrutura, cinco nós A/01/011/0112/01120, cinco elos e quatro ligações; 15 registos de referência, sem alterar raízes/associações existentes. Ativo fora do âmbito. Parques a seguir; duplicados e regulação Fintech separados. /negocios concluído no âmbito reportado; observação UUID ativa não demonstrada e não bloqueante; anexos dessa disponibilização não conferidos pela Tempo. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Recomendações não constituem autorização. Proposta QA revista inclui 12 artefactos (dez fontes/uma migration/um manifesto), quatro fontes adicionais para resolver a operação autenticada, compilação e dois instrumentos QA. Lote mantém 15 referências; zero alterações a mestres/classificações existentes. Ativo separado.",Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: QA restante 12–18 h: manifesto 2–3; schema/preview/importação 2–3; adaptador/apresentação 3–4; provas/reversão 4–6; documentação/recibo 1–2. Exclui decisão, importação integral e disponibilização ativa. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 12–18 h eram QA funcional; +2–4 h para implementar/provar o caminho operacional em QA, total QA revisto 14–22 h. Disponibilização futura 2–4 h separadas, incluindo backup/restauro fresco, condicionada a decisão própria. Sem tempo executado ou consentimento inferidos. | QA01: preparação deste recorte concluída, saldo QA zero. Estimativa original 12–18 h funcionais, +2–4 h operacionais DOC01 =14–22 h, sem aumento adicional pelo ficheiro de compatibilidade. Disponibilização futura 2–4 h separadas, dependente de autorização, janela e backup/restauro fresco. | ATIVO01: saldo operacional deste lote zero. Estimativa anterior de disponibilização 2–4 h arquivada como previsão, não horas consumidas; não foi ensaio funcional repetido. Lotes económicos posteriores, parques, duplicados e Fintech exigem delimitação própria.","outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json | outputs/investmoz-referencias-economicas-mapa-20261016/MAPA-LOTE-MINIMO.md; ESTADO-QA-READONLY.json; DEPENDENCIAS-QA-READONLY.json; INVENTARIO-ACERVO.json; CAE-ESTRUTURA.json; LOTE-PROPOSTO.json; FONTES-E-DELTA-PREVISTO.json. Inspeção e planeamento, não aceitação funcional. | outputs/investmoz-referencias-economicas-mapa-20261016/DOC01/MAPA-LOTE-MINIMO.md; DESENHO-OPERACIONAL.md; LOTE-PROPOSTO.json; INSPECAO-MECANISMO-EXISTENTE.json; ENQUADRAMENTO-RECOMENDACOES.json. Revisão de desenho/documentos, sem novo teste ou ligação à base ativa. | 16/10/2026 QA01 referencias-economicas-QA-966202f15577: ramo A/01/011/0112/01120 e cinco elos editoriais CLU-01 demonstrados em clone isolado, com caso positivo de atividade/cadeia nos consumidores canónico e /negocios, filtros, recuperação, confirmação independente e divulgação expressa. Preview, instalação nominal autenticada, importação privada, scan real, repetição, publicação/retirada e reversão compatível demonstrados. Provas: outputs/investmoz-referencias-economicas-QA-20261016/para-revisao/RELATORIO-QA.md; HTTP-QA.json; REVERSAO-QA.json; PRESERVACAO-QA.json. Ativo não alterado; original publicado/v12 preservado. Cinco etapas editoriais e quatro ligações com UUID, origem e versão preservados; sem consolidação comercial. | 16/10/2026 ATIVO01 referencias-economicas-QA-966202f15577: disponibilização autorizada e concluída no recorte. 13 artefactos, build de 162 ficheiros, migration nominal via sessão real da conta 2, importação privada das 15 ausências e publicação expressa separada, ClamAV real limpo. Repetição recuperou o mesmo recibo sem duplicação. Backup fresco/restauro isolado e arranque em leitura verificados. API pública recupera cinco níveis; catálogo anterior igual. Comparação de 295 tabelas sem diferenças inesperadas de negócio/histórico; B, COUNTRY02, permissões e documentos preservados. Evidência: outputs/investmoz-referencias-economicas-ativacao-20261016/para-revisao/RELATORIO-FINAL.md; PRESERVACAO-FINAL.json; HTTP-PUBLISHED.json. | Homologação teste-investidor 19/10/2026: Referências económicas — lote mínimo=Ausente. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Referências económicas — lote mínimo=Instalado mas desabilitado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. +[UTILIZACAO-HOMOLOGACAO-20261019] Correcção por leitura:11 actividades já published, sem nova activação necessária; cobertura integral e cálculos separados. Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: sectors, reference_catalog_versions, economic_activities, economic_clusters, value_chains/value_chain_links, opções/decisão/projeção canónicas e suplemento /negocios existentes. UUID de referência publicado/v12 e restantes classificações intactos.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Folhas eBAU: 1360 códigos em cinco níveis; duas cópias de hashes diferentes com as mesmas 8145 células. 600 subclasses versus 579 no roteiro; edição da folha não determinada. Convenções divisão 01/subclasse 01120 e cinco elos editoriais do CLU-01 propostas para decisão. Não associar por nomes. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Caminho operacional desenhado desde já por extensão autenticada do padrão existente: prévia e POST separados de esquema/importação privada/publicação/retirada; ator da sessão, autorização efetiva, MFA concluído, CSRF, hashes, scan, idempotência e backup/restauro fresco. Ainda não implementado/instalado; não deixado para depois da aceitação. Não alterar instaladores de B/COUNTRY02 ou importador documental.","Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: Proposto um catálogo de origem na mesma estrutura, cinco nós A/01/011/0112/01120, cinco elos e quatro ligações; 15 registos de referência, sem alterar raízes/associações existentes. Ativo fora do âmbito. Parques a seguir; duplicados e regulação Fintech separados. /negocios concluído no âmbito reportado; observação UUID ativa não demonstrada e não bloqueante; anexos dessa disponibilização não conferidos pela Tempo. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: Recomendações não constituem autorização. Proposta QA revista inclui 12 artefactos (dez fontes/uma migration/um manifesto), quatro fontes adicionais para resolver a operação autenticada, compilação e dois instrumentos QA. Lote mantém 15 referências; zero alterações a mestres/classificações existentes. Ativo separado.",Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito. | 16/10/2026 — mapa prévio de referências económicas, QA sem implementação: QA restante 12–18 h: manifesto 2–3; schema/preview/importação 2–3; adaptador/apresentação 3–4; provas/reversão 4–6; documentação/recibo 1–2. Exclui decisão, importação integral e disponibilização ativa. | 16/10/2026 — DOC01 do mapa económico, revisão documental sem autorização de execução: 12–18 h eram QA funcional; +2–4 h para implementar/provar o caminho operacional em QA, total QA revisto 14–22 h. Disponibilização futura 2–4 h separadas, incluindo backup/restauro fresco, condicionada a decisão própria. Sem tempo executado ou consentimento inferidos. | QA01: preparação deste recorte concluída, saldo QA zero. Estimativa original 12–18 h funcionais, +2–4 h operacionais DOC01 =14–22 h, sem aumento adicional pelo ficheiro de compatibilidade. Disponibilização futura 2–4 h separadas, dependente de autorização, janela e backup/restauro fresco. | ATIVO01: saldo operacional deste lote zero. Estimativa anterior de disponibilização 2–4 h arquivada como previsão, não horas consumidas; não foi ensaio funcional repetido. Lotes económicos posteriores, parques, duplicados e Fintech exigem delimitação própria.","outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json | outputs/investmoz-referencias-economicas-mapa-20261016/MAPA-LOTE-MINIMO.md; ESTADO-QA-READONLY.json; DEPENDENCIAS-QA-READONLY.json; INVENTARIO-ACERVO.json; CAE-ESTRUTURA.json; LOTE-PROPOSTO.json; FONTES-E-DELTA-PREVISTO.json. Inspeção e planeamento, não aceitação funcional. | outputs/investmoz-referencias-economicas-mapa-20261016/DOC01/MAPA-LOTE-MINIMO.md; DESENHO-OPERACIONAL.md; LOTE-PROPOSTO.json; INSPECAO-MECANISMO-EXISTENTE.json; ENQUADRAMENTO-RECOMENDACOES.json. Revisão de desenho/documentos, sem novo teste ou ligação à base ativa. | 16/10/2026 QA01 referencias-economicas-QA-966202f15577: ramo A/01/011/0112/01120 e cinco elos editoriais CLU-01 demonstrados em clone isolado, com caso positivo de atividade/cadeia nos consumidores canónico e /negocios, filtros, recuperação, confirmação independente e divulgação expressa. Preview, instalação nominal autenticada, importação privada, scan real, repetição, publicação/retirada e reversão compatível demonstrados. Provas: outputs/investmoz-referencias-economicas-QA-20261016/para-revisao/RELATORIO-QA.md; HTTP-QA.json; REVERSAO-QA.json; PRESERVACAO-QA.json. Ativo não alterado; original publicado/v12 preservado. Cinco etapas editoriais e quatro ligações com UUID, origem e versão preservados; sem consolidação comercial. | 16/10/2026 ATIVO01 referencias-economicas-QA-966202f15577: disponibilização autorizada e concluída no recorte. 13 artefactos, build de 162 ficheiros, migration nominal via sessão real da conta 2, importação privada das 15 ausências e publicação expressa separada, ClamAV real limpo. Repetição recuperou o mesmo recibo sem duplicação. Backup fresco/restauro isolado e arranque em leitura verificados. API pública recupera cinco níveis; catálogo anterior igual. Comparação de 295 tabelas sem diferenças inesperadas de negócio/histórico; B, COUNTRY02, permissões e documentos preservados. Evidência: outputs/investmoz-referencias-economicas-ativacao-20261016/para-revisao/RELATORIO-FINAL.md; PRESERVACAO-FINAL.json; HTTP-PUBLISHED.json. | Homologação teste-investidor 19/10/2026: Referências económicas — lote mínimo=Ausente. Saldo derivado e limites em outputs/investmoz-disponibilizacao-integral-20261019/SALDO-E-ACTUALIZACAO-CONSOLIDADA.md. Não substitui estado/provas do activo; trecho documental encerrado, vínculo dossier aberto. | Proposta integral fdcb31f1b5b9: aplicação activa local completa + R2/DOC01/destino reconciliados; schema/build/recuperação de contexto e reversão de apresentação ensaiados no clone isolado. Não instalado remotamente. Inc. QA territoriais/Inhambane/programas separados. Limites e decisões em outputs/investmoz-disponibilizacao-integral-20261019/PROPOSTA-INTEGRAL-PARA-DECISAO.md. | Execução autorizada fdcb31f1b5b9 concluída em teste-investidor: Referências económicas — lote mínimo=Instalado mas desabilitado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. [UTILIZACAO-HOMOLOGACAO-20261019] Leitura nominal de contas/recursos no destino; saldo18/10; prévia29 sem escrita; comparação de hashes QA separados. outputs/investmoz-disponibilizacao-integral-20261019/UTILIZACAO-EFECTIVA-HOMOLOGACAO.md @@ -53,7 +53,7 @@ RF-CLU-003,Representar a cadeia de valor e identificar lacunas de investimento., [Executável c11a0c74766c] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. [Executável 82dab3719ffc] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. [Executável 312965f2c653] P3 staging privado completo; P4 nominal destino real 27 refs/25 territórios, zero geometrias. Pré-condições fontes conferidas; pacote para decisão, não aplicado. Reversão após uso só manifesto/build, backend e dados retidos. Adaptador ensaiado só em clone: rollback/recuperação após commit e repetição sem duplicações; aplicação 56 fontes inalterada. Acesso público e diferenças visuais/login continuam abertos. Saldo remoto delimitado 4–7 h; sem alterações remotas. -[Homologação 312965f2c653 executada] Autorização Tempo; 30 fichas privadas/30 locais/31 suportes/11 relações/2 originais e 2 definições internas, 233 caminhos conferidos. Dados anteriores/permissões preservados; zero publicação/migrations/geometrias/P7. Saldo delimitado de execução concluído. Dossier legítimo, oito lacunas e questões de autenticação/visual separadas. RECIBO-EXECUCAO-312965.json.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada, | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,," | QA01: prova positiva delimitada de atividade/cadeia e operações do lote concluída, conservando as aceitações anteriores e a semântica privada/confirmada/pública. | ATIVO01: instalação/importação/publicação autenticadas, scan, repetição idempotente, recuperação pública do ramo A/01/011/0112/01120 e preservação operacional concluídos. Provas funcionais QA aceites reutilizadas, sem repetição."," | QA01: divergência documental 600/579 e edição normativa abertas; cadeia editorial; publicação canónica com pré-condições sintéticas; save legado transacional; sem volume ou recuperação de payload legado cifrado; reversão parcial com sete fontes funcionais. Sem decisão ativa presumida. | ATIVO01: não encerra CAE integral ou divergência 600/579/edição normativa; cadeia exclusivamente editorial. Nenhuma classificação ou relação de investimento real alterada/divulgada. Limites QA anteriores e reversão parcial compatível mantidos; editor UUID ativo de /negocios continua não demonstrado e não bloqueante. Parques, duplicados e regulação Fintech separados.","0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, +[Homologação 312965f2c653 executada] Autorização Tempo; 30 fichas privadas/30 locais/31 suportes/11 relações/2 originais e 2 definições internas, 233 caminhos conferidos. Dados anteriores/permissões preservados; zero publicação/migrations/geometrias/P7. Saldo delimitado de execução concluído. Dossier legítimo, oito lacunas e questões de autenticação/visual separadas. RECIBO-EXECUCAO-312965.json. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada, | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,," | QA01: prova positiva delimitada de atividade/cadeia e operações do lote concluída, conservando as aceitações anteriores e a semântica privada/confirmada/pública. | ATIVO01: instalação/importação/publicação autenticadas, scan, repetição idempotente, recuperação pública do ramo A/01/011/0112/01120 e preservação operacional concluídos. Provas funcionais QA aceites reutilizadas, sem repetição."," | QA01: divergência documental 600/579 e edição normativa abertas; cadeia editorial; publicação canónica com pré-condições sintéticas; save legado transacional; sem volume ou recuperação de payload legado cifrado; reversão parcial com sete fontes funcionais. Sem decisão ativa presumida. | ATIVO01: não encerra CAE integral ou divergência 600/579/edição normativa; cadeia exclusivamente editorial. Nenhuma classificação ou relação de investimento real alterada/divulgada. Limites QA anteriores e reversão parcial compatível mantidos; editor UUID ativo de /negocios continua não demonstrado e não bloqueante. Parques, duplicados e regulação Fintech separados.","0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-004,Disponibilizar inteligência territorial e comparação multicritério.,upgrade v4 SHA f0b9815…; p. 521; requirements-audit.csv | portal do investidor\Portal V4\upgrade do portal de investimentos v6 programacao.docx; SHA e1169a7743b13ff6c950d3ffd4672a2afea32e81da84885e11154b7d8de9241e; w:p 546 | portal do investidor\Portal V4\upgrade do portal de investimentos v2.docx; SHA 51b8f0ad3296d1064a5c12b450874fc72640869f10a164319cd7f3153dd3a086; w:p 241 | portal do investidor\Portal V4\upgrade do portal de investimentos v5 programacao.docx; SHA edece80c0519537244f8a8b86456af0aa92de1c526f791bb0ee9b85af7a7e8b2; w:p 546,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-004: Mapas autorizados mostram projectos, recursos, infra-estruturas, actores e riscos por unidade territorial; comparações usam critérios, período, fonte e limitações uniformes e não constituem garantia. | MASTER-e1169a77-0045: Disponibilizar inteligência territorial e comparação multicritério. | MASTER-51b8f0ad-0025: Disponibilizar inteligência territorial e comparação multicritério. | MASTER-edece80c-0045: Disponibilizar inteligência territorial e comparação multicritério.",P2,RF-CLU-004: Relatório 25/09 conservado; estado histórico não promove conclusão | MASTER-e1169a77-0045: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-51b8f0ad-0025: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-edece80c-0045: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,RF-CLU-004 | MASTER-e1169a77-0045 | MASTER-51b8f0ad-0025 | MASTER-edece80c-0045,4,"[{""id"":""RF-CLU-004"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 521; requirements-audit.csv""],""aceitacao"":""Mapas autorizados mostram projectos, recursos, infra-estruturas, actores e riscos por unidade territorial; comparações usam critérios, período, fonte e limitações uniformes e não constituem garantia."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""},{""id"":""MASTER-e1169a77-0045"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v6 programacao.docx; SHA e1169a7743b13ff6c950d3ffd4672a2afea32e81da84885e11154b7d8de9241e; w:p 546""],""aceitacao"":""Disponibilizar inteligência territorial e comparação multicritério."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""},{""id"":""MASTER-51b8f0ad-0025"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v2.docx; SHA 51b8f0ad3296d1064a5c12b450874fc72640869f10a164319cd7f3153dd3a086; w:p 241""],""aceitacao"":""Disponibilizar inteligência territorial e comparação multicritério."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""},{""id"":""MASTER-edece80c-0045"",""pedido"":""Disponibilizar inteligência territorial e comparação multicritério."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v5 programacao.docx; SHA edece80c0519537244f8a8b86456af0aa92de1c526f791bb0ee9b85af7a7e8b2; w:p 546""],""aceitacao"":""Disponibilizar inteligência territorial e comparação multicritério."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-005,Gerir necessidades de financiamento e correspondência com financiadores.,upgrade v4 SHA f0b9815…; p. 525; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-005: A necessidade contém elo, fase, instrumento, valor, moeda, beneficiário, finalidade e elegibilidade; o CRM regista correspondências explicáveis e sujeitas a revisão humana.",P2,RF-CLU-005: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-005,1,"[{""id"":""RF-CLU-005"",""pedido"":""Gerir necessidades de financiamento e correspondência com financiadores."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 525; requirements-audit.csv""],""aceitacao"":""A necessidade contém elo, fase, instrumento, valor, moeda, beneficiário, finalidade e elegibilidade; o CRM regista correspondências explicáveis e sujeitas a revisão humana."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-CLU-006,"Gerir programas, iniciativas, constrangimentos e planos de acção.",upgrade v4 SHA f0b9815…; p. 529; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-CLU-006: Cada registo possui objectivo ou problema, território, responsável, parceiros, orçamento, prazo, indicador, dependências, risco, escalonamento, estado e decisão necessária.",P2,RF-CLU-006: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-CLU-006,1,"[{""id"":""RF-CLU-006"",""pedido"":""Gerir programas, iniciativas, constrangimentos e planos de acção."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 529; requirements-audit.csv""],""aceitacao"":""Cada registo possui objectivo ou problema, território, responsável, parceiros, orçamento, prazo, indicador, dependências, risco, escalonamento, estado e decisão necessária."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, @@ -66,7 +66,7 @@ RF-CLU-012,"Disponibilizar APIs, eventos e exportação controlada dos dados de RF-COR-001,"Administrar corredores, áreas de influência, nós territoriais, versões e estados.",upgrade v4 SHA f0b9815…; p. 819; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-001: Cada corredor possui código, visão, coordenador, territórios, geometria, nós, fontes, validade, estado e histórico aprovado.",P2,RF-COR-001: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-001,1,"[{""id"":""RF-COR-001"",""pedido"":""Administrar corredores, áreas de influência, nós territoriais, versões e estados."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 819; requirements-audit.csv""],""aceitacao"":""Cada corredor possui código, visão, coordenador, territórios, geometria, nós, fontes, validade, estado e histórico aprovado."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-COR-002,Relacionar corredores com projectos âncora.,upgrade v4 SHA f0b9815…; p. 823; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-002: Cada projecto âncora indica função, capacidade, território, dependências, clusters beneficiados e fase; um projecto pode servir vários corredores com relação justificada.",P2,RF-COR-002: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-002,1,"[{""id"":""RF-COR-002"",""pedido"":""Relacionar corredores com projectos âncora."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 823; requirements-audit.csv""],""aceitacao"":""Cada projecto âncora indica função, capacidade, território, dependências, clusters beneficiados e fase; um projecto pode servir vários corredores com relação justificada."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-COR-003,Relacionar corredores com clusters e cadeias de valor.,upgrade v4 SHA f0b9815…; p. 827; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: 11 fontes e 161 ficheiros de build entregues; sem migrations, grants, classificações reais ou divulgação. Catálogo público mantém zero negócios e seis oportunidades. Suplemento de compilação para repor InvesteMoz no título preparado apenas em QA, pendente de decisão. | 16/10/2026 — fecho operacional consolidado: negocios-classificacao-QA-53311df2f59c e suplemento de nome negocios-compilacao-nome-QA-7ef0facd0e27 autorizados e entregues: mesmas 11 fontes, 161 build, título InvesteMoz observado. Sem escrita de negócio/classificação/divulgação.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-003: A relação identifica elos suportados, mercados, recursos, infra-estruturas, lacunas, actores e prioridade, sem duplicar o cadastro do cluster.",P2,RF-COR-003: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-003,1,"[{""id"":""RF-COR-003"",""pedido"":""Relacionar corredores com clusters e cadeias de valor."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 827; requirements-audit.csv""],""aceitacao"":""A relação identifica elos suportados, mercados, recursos, infra-estruturas, lacunas, actores e prioridade, sem duplicar o cadastro do cluster."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global. | 15/10/2026 — incremento de classificação multidimensional em QA: Oportunidade pode referir corredor e cadeia simultaneamente, sem inferir vínculo mestre corredor-cluster. Relações mestre anteriores preservadas; esta prova não altera nem demonstra novamente todas as relações entre mestres. | 15/10/2026 — Tempo autorizou e foi disponibilizada a candidata classificacao-multidimensional-QA-64ab05e20b95 DOC01: 17 fontes/174 build, backup/restauro fresco, cache de dados preservada e reversão compatível. Recorte parcial; restantes limites conservados. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Reutilização das referências e filtros tipados; não demonstra a rede integral de corredores, mercados, atores e prioridades. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Backup/restauro fresco 295 tabelas/31 sequências/2341 ficheiros/29 documentos; clone arrancou em leitura. Conferência operacional de GET/assets e área privada pela conta 2, sem guardar. Dados, papéis e histórico iguais; não encerra a cláusula integral.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. | Disponibilização DOC01 executada. Limitação operacional concreta: Editor no ativo: não demonstrado nesta conferência. O utilizador informou não ter acesso à conta de Promotora interna Aurora Chachuaio. A sessão efetiva Osmane Nala, conta 2, recebeu 403 em GET /minhas-oportunidades/create; não existe elevação operacional ativa. Os papéis Promotor/Validador dessa conta permanecem atribuídos; as funções de autorização v1 conferem exatamente com a versão anterior à entrega. Existem seis oportunidades legadas e nenhuma do workflow de promotor no ativo. A mensagem 403 genérica não expõe o motivo; o diagnóstico fica registado, sem alterar permissões, credenciais ou acrescentar uma correção fora do pacote autorizado. Mantêm-se as provas funcionais QA aceites do editor.; limites do critério integral: Oportunidade pode referir corredor e cadeia simultaneamente, sem inferir vínculo mestre corredor-cluster. Relações mestre anteriores preservadas; esta prova não altera nem demonstra novamente todas as relações entre mestres. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: Recorte QA concluído; disponibilização deste incremento exige decisão específica. Reutilização das referências e filtros tipados; não demonstra a rede integral de corredores, mercados, atores e prioridades. As quatro outras lacunas conservam o seu estado; provas aceites não se repetem. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: Recuperação UUID no ativo não observada: conta 2 sem anúncio próprio; dois rascunhos pertencem a outro titular. Não criar dados nem alargar acesso para preencher esta limitação. Cadeia sem caso positivo, sem ensaio volumétrico e limite do payload sintético da reversão mantêm-se. Outras quatro lacunas inalteradas.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.","Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente. | 16/10/2026 — disponibilização autorizada de negocios-classificacao-QA-53311df2f59c: A autorização base foi executada. Suplemento negocios-compilacao-nome-QA-7ef0facd0e27, zero fontes/161 build para título InvesteMoz, aguarda autorização específica por ter novos hashes de build. Não reabrir QA funcional aceite. | 16/10/2026 — fecho operacional consolidado: Autorizações base e do suplemento executadas. Saldo operacional zero. Não classificar anúncios reais nem divulgar relações. Limites QA e ausência de UUID próprio para observação no ativo conservados; outras quatro lacunas inalteradas.",Incremento parcial disponibilizado; aceitação QA preservada e lacunas integrais delimitadas,"Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida. | 16/10/2026 — negocios-classificacao-QA-53311df2f59c, exclusivamente QA: 10–16 h era a estimativa inicial agora executada neste recorte. Saldo QA zero para a cobertura demonstrada. Operação futura estimada 90–180 min após autorização, partilhada pelo lote, não somar por requisito.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. | outputs/investmoz-classificacao-multidimensional-QA-20261015/RELATORIO-QA.md; HTTP-DELTA-QA.json (44); SERVICOS-DELTA-QA.json (22); REVERSAO-COMPAT-QA.json (6); INTERFACE-QA.json | outputs/investmoz-classificacao-ativacao-20261015/RELATORIO-ENTREGA.md; RECIBO-FINAL.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; FONTES-COMPILACAO.json; HTTP-AFTER.json; PRESERVACAO-AFTER.json; INTERFACE-OPERACIONAL.json | outputs/investmoz-negocios-classificacao-QA-20261016/RELATORIO-QA.md; HTTP-QA.json (36/50 HTTP); SCOPES-QA.json (10); INTERFACE-QA.json; REVERSAO-APOS-EDICAO-ANTERIOR.json; PRESERVACAO-FINAL.json; MANIFESTO.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-ENTREGA.md; AUTORIZACAO-TEMPO.json; FRESH-BACKUP.json; ARRANQUE-CLONE-RESTAURADO.json; TROCA.json; HTTP-AFTER.json; PRESERVACAO-APOS-AUTENTICACAO.json; INTERFACE-OPERACIONAL.json; RECIBO-FINAL.json | outputs/investmoz-negocios-classificacao-ativacao-20261016/RELATORIO-FINAL.md; AUTORIZACAO-EXTENSAO-NOME.json; FRESH-BACKUP-NOME.json; ARRANQUE-CLONE-NOME.json; TROCA-NOME.json; HTTP-APOS-NOME.json; PRESERVACAO-APOS-NOME.json; INTERFACE-NOME-ATIVO.json; RECIBO-CONSOLIDADO.json,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada, | management_draft.canonical.relations/enterprise_size; workflow_context.classification_decisions/publication.classification/canonical_items; mestres existentes por ID; sem migrations. | /negocios: existing_business_revisions.snapshot.context.multidimensional; mesmo UUID e payload principal intacto; decisões por relação/evidência; snapshot de divulgação separado.," | Recuperação noutra sessão, nove relações/quatro dimensões, evidência/decisão por hash, exclusão privada, filtros/map matched_count, reversão compatível. Publicação é fixture sintético; transição editorial aceite não repetida. | Clone principal publicado/v26, referência publicada/v12 intacta; recuperação/validação/divulgação e filtros dirigidos; edição posterior pelo código anterior preserva o suplemento; ver relatório para fixture secundário sintético.",Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, -RF-COR-004,Gerir projectos complementares públicos e privados.,upgrade v4 SHA f0b9815…; p. 831; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-004: O sistema permite propor, validar, publicar e acompanhar novos projectos ligados ao corredor, projecto âncora, cluster, elo e território.",P2,RF-COR-004: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-004,1,"[{""id"":""RF-COR-004"",""pedido"":""Gerir projectos complementares públicos e privados."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 831; requirements-audit.csv""],""aceitacao"":""O sistema permite propor, validar, publicar e acompanhar novos projectos ligados ao corredor, projecto âncora, cluster, elo e território."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, +RF-COR-004,Gerir projectos complementares públicos e privados.,"upgrade v4 SHA f0b9815…; p. 831; requirements-audit.csv Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-004: O sistema permite propor, validar, publicar e acompanhar novos projectos ligados ao corredor, projecto âncora, cluster, elo e território.",P2,RF-COR-004: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-004,1,"[{""id"":""RF-COR-004"",""pedido"":""Gerir projectos complementares públicos e privados."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 831; requirements-audit.csv""],""aceitacao"":""O sistema permite propor, validar, publicar e acompanhar novos projectos ligados ao corredor, projecto âncora, cluster, elo e território."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada. Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-COR-005,"Mapear infra-estruturas, capacidade e constrangimentos.",upgrade v4 SHA f0b9815…; p. 835; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-005: Energia, água, transportes, telecomunicações, armazenagem, fronteiras e serviços apresentam localização, capacidade, utilização, fonte e estado.",P2,RF-COR-005: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-005,1,"[{""id"":""RF-COR-005"",""pedido"":""Mapear infra-estruturas, capacidade e constrangimentos."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 835; requirements-audit.csv""],""aceitacao"":""Energia, água, transportes, telecomunicações, armazenagem, fronteiras e serviços apresentam localização, capacidade, utilização, fonte e estado."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-COR-006,Gerir dependências e sequência de investimentos.,upgrade v4 SHA f0b9815…; p. 839; requirements-audit.csv,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-006: O corredor identifica predecessores, bloqueios, caminho crítico, marcos, responsáveis e data necessária; alteração material recalcula impactos.",P2,RF-COR-006: Relatório 25/09 conservado; estado histórico não promove conclusão,RF-COR-006,1,"[{""id"":""RF-COR-006"",""pedido"":""Gerir dependências e sequência de investimentos."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 839; requirements-audit.csv""],""aceitacao"":""O corredor identifica predecessores, bloqueios, caminho crítico, marcos, responsáveis e data necessária; alteração material recalcula impactos."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, RF-COR-007,Publicar página e dossier do corredor.,upgrade v4 SHA f0b9815…; p. 843; requirements-audit.csv | portal do investidor\Portal V4\upgrade do portal de investimentos v6 programacao.docx; SHA e1169a7743b13ff6c950d3ffd4672a2afea32e81da84885e11154b7d8de9241e; w:p 879 | portal do investidor\Portal V4\upgrade do portal de investimentos v2.docx; SHA 51b8f0ad3296d1064a5c12b450874fc72640869f10a164319cd7f3153dd3a086; w:p 565 | portal do investidor\Portal V4\upgrade do portal de investimentos v5 programacao.docx; SHA edece80c0519537244f8a8b86456af0aa92de1c526f791bb0ee9b85af7a7e8b2; w:p 879,cartografia/relações,/api/v1/geo/drafts; /api/v1/geo/search; /api/v1/geo/sources; /api/v1/geo/sources/{id}/transitions; /api/v1/geo/territories; /api/v1/geo/territories/{id}; /api/v1/geo/territories/{id}/transitions; /api/v1/geo/territories/{type}/{id}; /api/v1/geo/{collection}; /api/v1/investment/compare; /api/v1/investment/export; /api/v1/investment/favourites/{id},"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,Sem evidência suficiente,"Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.","RF-COR-007: A página apresenta mapa autorizado, projectos âncora, clusters, oportunidades, infra-estruturas, constrangimentos, investimentos complementares, indicadores e chamada para acção. | MASTER-e1169a77-0064: Publicar página e dossier do corredor. | MASTER-51b8f0ad-0043: Publicar página e dossier do corredor. | MASTER-edece80c-0064: Publicar página e dossier do corredor.",P2,RF-COR-007: Relatório 25/09 conservado; estado histórico não promove conclusão | MASTER-e1169a77-0064: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-51b8f0ad-0043: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas | MASTER-edece80c-0064: Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas,RF-COR-007 | MASTER-e1169a77-0064 | MASTER-51b8f0ad-0043 | MASTER-edece80c-0064,4,"[{""id"":""RF-COR-007"",""pedido"":""Publicar página e dossier do corredor."",""fontes"":[""upgrade v4 SHA f0b9815…; p. 843; requirements-audit.csv""],""aceitacao"":""A página apresenta mapa autorizado, projectos âncora, clusters, oportunidades, infra-estruturas, constrangimentos, investimentos complementares, indicadores e chamada para acção."",""estado"":""parcial"",""variantes"":""Relatório 25/09 conservado; estado histórico não promove conclusão"",""modulo"":""cartografia/relações""},{""id"":""MASTER-e1169a77-0064"",""pedido"":""Publicar página e dossier do corredor."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v6 programacao.docx; SHA e1169a7743b13ff6c950d3ffd4672a2afea32e81da84885e11154b7d8de9241e; w:p 879""],""aceitacao"":""Publicar página e dossier do corredor."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""},{""id"":""MASTER-51b8f0ad-0043"",""pedido"":""Publicar página e dossier do corredor."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v2.docx; SHA 51b8f0ad3296d1064a5c12b450874fc72640869f10a164319cd7f3153dd3a086; w:p 565""],""aceitacao"":""Publicar página e dossier do corredor."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""},{""id"":""MASTER-edece80c-0064"",""pedido"":""Publicar página e dossier do corredor."",""fontes"":[""portal do investidor\\Portal V4\\upgrade do portal de investimentos v5 programacao.docx; SHA edece80c0519537244f8a8b86456af0aa92de1c526f791bb0ee9b85af7a7e8b2; w:p 879""],""aceitacao"":""Publicar página e dossier do corredor."",""estado"":""parcial"",""variantes"":""Todas as ocorrências exatas preservadas nas fontes; variantes de texto têm linhas distintas"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,parcial,public.geo_locations: 1990 registos; public.geo_geometries: 0 registos; public.project_locations: 28 registos; public.cluster_projects: 13 registos; public.opportunity_projects: 0 registos; public.opportunity_clusters: 0 registos,"A evidência existente é do domínio ou uma declaração histórica; não identifica a demonstração integral desta cláusula. Não afirmar implementado/parcial apenas por componente, menu ou teste global.","Demonstrar consumidor: pesquisar→selecionar→gravar→nova sessão→renderizar limite correto; conservar pai, código e fonte. Critério individual original preservado; cobertura atual ainda não individualizada.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Nenhuma nova decisão identificada para reconciliar/demonstrar esta cláusula. Decisões específicas só após localizar a regra correspondente.,Reconciliação e prova individual antes de estimar alteração,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,outputs/investmoz-audit-current-20261012/runtime-active.json; runtime-qa18445.json. Inventário/GET do domínio não demonstra esta cláusula individual.,território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Verificar individualmente este critério no contrato e percurso aplicável; a matriz inicial conserva texto/fonte sem o promover a aceitação.,"QA de UI quando browser disponível; reutilizar o domínio existente. Dados/decisões específicos no backlog, sem segunda validação de fonte oficial.",resources/js/components/investment-territory.tsx; app/Http/Controllers/InvestmentTerritoryController.php — componentes do domínio encontrados; correspondência integral deste requisito não presumida,"InvestmentTerritoryTest, TerritorialRegistryTest, InvestmentTerritorialTraceabilityTest, InvestmentZoneTest; suite global QA e GET por perfil disponíveis. Evidência do domínio não demonstra integralmente esta cláusula; UI individual pendente.",Não demonstrado individualmente; localizar critério e executar em QA.,,,,"0,5–2 h de análise/prova por cláusula sem correspondência, agrupada por contrato/consumidor; não somar estas faixas como projetos independentes. Implementação indeterminada até localizar lacuna.",,, @@ -4699,17 +4699,17 @@ AUD-REL-01,Preservar relações territoriais e citar por associação,"Pedido di [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. | 22/10/2026 — selectores especializados em QA: opções de cadastros públicos independentes das oportunidades; território principal documentado ou vínculos já publicados; cadeia pelo cluster e actividade como classificação pública. Vazio explicado; zero correspondências mantém ficha pública existente. Cabo Delgado/Nampula/nacional, selecção/limpeza/ficha/regresso/recarregamento; fixtures exclusivamente QA. CatalogueSelectorReferencesTest: 3 testes, 27 verificações; tipos/build passaram. Homologação já oferece Balama/Montepuez; a base local tinha dados distintos. Sem publicação/activação ou integração nesta execução. Manual: secção Selectores especializados do catálogo; provas outputs/catalogue-selectors-20261022.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Pontes de rastreabilidade em falta; não inferir pares oportunidade–projeto/cluster,Acervo aceite; recuperar citação de cada par,InvestmentRelationshipRepair; InvestmentTerritorialTraceability,Leitura ativa e suite territorial; confirmação histórica V2,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"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-REL-02,Correspondência das seis oportunidades com âncoras/clusters,"Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md",cartografia/relações,/management/opportunities/{id}/context,"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/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.,Dependente de decisão concreta da Tempo,Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes.,"QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes.",AUD-REL-02: Somente pares explicitamente identificados pelo responsável/documento; sem duplicar relações,P1,AUD-REL-02: Relatórios históricos mantidos; estado ativo apurado por leitura nesta auditoria,AUD-REL-02,1,"[{""id"":""AUD-REL-02"",""pedido"":""Correspondência das seis oportunidades com âncoras/clusters"",""fontes"":[""Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md""],""aceitacao"":""Somente pares explicitamente identificados pelo responsável/documento; sem duplicar relações"",""estado"":""dependente de decisão concreta"",""variantes"":""Relatórios históricos mantidos; estado ativo apurado por leitura nesta auditoria"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,dependente de decisão concreta,geo_locations: 1990; geo_geometries: 0; project_locations: 28; cluster_projects: 13; opportunity_projects: 0; opportunity_clusters: 0,"Decisão concreta isolada explicitada; não bloqueia as frentes independentes já autorizadas. +AUD-REL-02,Correspondência das seis oportunidades com âncoras/clusters,"Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",cartografia/relações,/management/opportunities/{id}/context,"InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.",outputs/investmoz-audit-current-20261012/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.,Dependente de decisão concreta da Tempo,Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes.,"QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada. Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes.",AUD-REL-02: Somente pares explicitamente identificados pelo responsável/documento; sem duplicar relações,P1,AUD-REL-02: Relatórios históricos mantidos; estado ativo apurado por leitura nesta auditoria,AUD-REL-02,1,"[{""id"":""AUD-REL-02"",""pedido"":""Correspondência das seis oportunidades com âncoras/clusters"",""fontes"":[""Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md""],""aceitacao"":""Somente pares explicitamente identificados pelo responsável/documento; sem duplicar relações"",""estado"":""dependente de decisão concreta"",""variantes"":""Relatórios históricos mantidos; estado ativo apurado por leitura nesta auditoria"",""modulo"":""cartografia/relações""}]",Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Não demonstrado individualmente; localizar critério e executar em QA.,Texto exatamente equivalente no mesmo módulo; sem fusão semântica aproximada,dependente de decisão concreta,geo_locations: 1990; geo_geometries: 0; project_locations: 28; cluster_projects: 13; opportunity_projects: 0; opportunity_clusters: 0,"Decisão concreta isolada explicitada; não bloqueia as frentes independentes já autorizadas. [RECONCILIACAO-43-20261019] 23: 1921 referências e zero geometrias no destino. Reconciliar geometrias/fontes/classificação existentes em QA e consumidores abertos; corrigir bug de2. Não transformar divergência de contagens em importação.","Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes. -[UTILIZACAO-HOMOLOGACAO-20261019] 23: Implementação parcial + dados — Consumidores cartográficos restantes e correspondências geográficas por item; diferença de contagens não identifica registos em falta.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes.,Decisão Tempo + trabalho independente paralelo,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/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. | Homologação teste-investidor 19/10/2026: Cartografia e consumidores territoriais restantes=Não demonstrado. 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: Cartografia e consumidores territoriais restantes=Não demonstrado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. +[UTILIZACAO-HOMOLOGACAO-20261019] 23: Implementação parcial + dados — Consumidores cartográficos restantes e correspondências geográficas por item; diferença de contagens não identifica registos em falta. Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global.","InvestmentGeography, campos TerritoryFields/ProvinceSelect, geo_locations/geo_geometries e importador autenticado","QA408/581INE; ativo0geometrias;173correspondências por nome/edição/pai, Mandie ambíguo. Publicação é ação separada.",Os pares das seis oportunidades legadas com projetos/âncoras/clusters continuam indeterminados. Indicar pares com fundamento documental; não bloquear as oportunidades independentes.,Decisão Tempo + trabalho independente paralelo,Estimativa partilhada no lote correspondente de visao-consolidada-modulos.md; não somar por linha/cláusula/campo. Grupo: território. Esforço de código adicional só após lacuna reproduzida.,"outputs/investmoz-audit-current-20261012/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. | Homologação teste-investidor 19/10/2026: Cartografia e consumidores territoriais restantes=Não demonstrado. 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: Cartografia e consumidores territoriais restantes=Não demonstrado. 1080 hashes iguais, schema171/88, custódia/scan/recuperação reais. Sem publicação ou papéis novos. Vínculo dossier legítimo pendente; incrementos QA separados. Limites em outputs/investmoz-disponibilizacao-integral-20261019/RESULTADO-DISPONIBILIZACAO-INTEGRAL.md; não encerra critérios globais não demonstrados. [UTILIZACAO-HOMOLOGACAO-20261019] Leitura nominal de contas/recursos no destino; saldo18/10; prévia29 sem escrita; comparação de hashes QA separados. outputs/investmoz-disponibilizacao-integral-20261019/UTILIZACAO-EFECTIVA-HOMOLOGACAO.md [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.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Identidade dos pares continua indeterminada,"Pergunta: para cada ID 1–6, qual projeto/cluster exato deve ser ligado, com que papel e referência? Não impede outras correções",oportunidades-correspondencias.md; opportunity_projects/opportunity_clusters,Leitura ativa: ambas relações=0,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"1–4 h para preparar/validar configuração após decisão; implementação/regras adicionais a delimitar, sem inventar nomeações ou prazos.",,, +[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. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos.",território,12/10/2026 — reconciliação e HTTP; nova inspeção visual bloqueada,,,Identidade dos pares continua indeterminada,"Pergunta: para cada ID 1–6, qual projeto/cluster exato deve ser ligado, com que papel e referência? Não impede outras correções",oportunidades-correspondencias.md; opportunity_projects/opportunity_clusters,Leitura ativa: ambas relações=0,Não demonstrado individualmente; localizar critério e executar em QA.,,,,"1–4 h para preparar/validar configuração após decisão; implementação/regras adicionais a delimitar, sem inventar nomeações ou prazos.",,, AUD-OP-01,Guardar e recuperar rascunho incompleto; exclusão/arquivo/restauro,"Pedido direto 09/10/2026, auditoria §1–4; fontes específicas descritas em relatorio-executivo.md",oportunidades,/management/opportunities; /management/opportunities/{id}/edit; PUT /management/opportunities/{id}/draft,"OpportunityManagement, OpportunityCanonicalContract/Response, OpportunityReviewMateriality, PortalProfileAccess, OpportunityResources. Capacidade existente associada ao domínio; correspondência integral desta cláusula só quando demonstrada na prova individual.","Ativo investemoz:5432, 295 tabelas, COUNTRY02/030000/040000 instalados; seis categorias e administração habilitadas. Leitura atual não demonstra esta cláusula individual. Legado, percurso integrado, modulares/ofertas e notificações desabilitados.","outputs/investmoz-audit-current-20261012/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: LEASE54; C131 [B QA 13/10/2026] C139: filtros públicos7/8 corrigidos em QA; catálogo central fornece8etapas V2 e6rótulos históricos distintos. Publicação normal do caso33 projetou etapa/rótulo/versão; API pública recupera7/8 sem campos privados. Provas agrupadas em proof-groups.json e execução-B-QA.md.",Implementado parcialmente,"Rascunhos incompletos, gravação/recuperação e arquivo já comprovados em QA. R-ARCHIVE/R-DRAFT não autorizados: decidir Publicador com motivo→revisão não pública, versus rascunho privado eliminado logicamente; nunca republicação automática. @@ -10518,17 +10518,17 @@ 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. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.","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. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.",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 Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",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. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.","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. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.",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. | 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. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.","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. | Recorte executável C concluído em QA. Restantes coberturas sectoriais/benefícios e encaminhamento visual de zona real têm limites concretos no manual; não bloqueiam os ramos já documentados. Integração/habilitação no destino não executadas. | Integração/habilitação deste recorte executadas em22/10/2026; referências anteriores a operação pendente são históricas. Não reabrir as provas aceites.","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. +[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. | Recorte executável C concluído em QA. Restantes coberturas sectoriais/benefícios e encaminhamento visual de zona real têm limites concretos no manual; não bloqueiam os ramos já documentados. Integração/habilitação no destino não executadas. | Integração/habilitação deste recorte executadas em22/10/2026; referências anteriores a operação pendente são históricas. Não reabrir as provas aceites. Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global.","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. [UTILIZACAO-HOMOLOGACAO-20261019] Leitura nominal de contas/recursos no destino; saldo18/10; prévia29 sem escrita; comparação de hashes QA separados. outputs/investmoz-disponibilizacao-integral-20261019/UTILIZACAO-EFECTIVA-HOMOLOGACAO.md [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. | 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. | 22/10: revisão de a76369eb concluída no âmbito aceite por prova equivalente do regresso; A/B não repetidos. Tabela do primeiro percurso de investimento privado no manual: condições, artigos/período e efeitos; preparação documental, sem ligação executável nova. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal. | 22/10/2026 — prova complementar exclusiva do relatório: recuperação UI do contexto v4, rascunho v5 e Word novo por mero registo; estudo/capacidade não aplicáveis. Word v3 preservado/identificado como histórico, hash inalterado. Sem alteração funcional ou repetição dos ensaios aceites. Dependências Git: a76369eb → 52fbb146 documental → a1fbda06; integrar após decisão, preservando main concorrente. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas. | 22/10/2026 READ ONLY: catalogo Inhambane/Vilankulo vazio sem erro; zero publicadas tambem em Cabo Delgado. URL recebido nao identifica dossier. Falha da previa territorial e termino sem resposta continuam abertos; falta URL do dossier para leitura historica sem recriacao. | 22/10/2026 esclarecimento Tempo: pesquisa publica sem dossier; retirada dependencia de URL pessoal/confirmacao de impacto. Correcao QA: search-territory.ts em links carteira/catalogo/zonas, menus e detalhes. Seis testes Node, types e build isolado; prova visual carteira->Inhambane/Vilankulo->catalogo, recarregar, voltar e zonas. Mudanca de provincia limpa distrito. Nenhuma publicacao. Manual: Continuidade territorial da pesquisa.",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. | C exclusivamente sintético; ZEE/ZFI encaminhamento por predicados, sem reconhecimento de zona real; download concluído apesar de perda da ferramenta. Provas A/B/cálculos/exportadores aceites não repetidas.","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.",,,"Recorte adaptativo de preparação disponibilizado/habilitado na homologação, revisão042ffbde. Limitações globais/sectoriais/fiscais mantêm âmbito próprio." +[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. | 22/10: revisão de a76369eb concluída no âmbito aceite por prova equivalente do regresso; A/B não repetidos. Tabela do primeiro percurso de investimento privado no manual: condições, artigos/período e efeitos; preparação documental, sem ligação executável nova. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal. | 22/10/2026 — prova complementar exclusiva do relatório: recuperação UI do contexto v4, rascunho v5 e Word novo por mero registo; estudo/capacidade não aplicáveis. Word v3 preservado/identificado como histórico, hash inalterado. Sem alteração funcional ou repetição dos ensaios aceites. Dependências Git: a76369eb → 52fbb146 documental → a1fbda06; integrar após decisão, preservando main concorrente. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas. | 22/10/2026 READ ONLY: catalogo Inhambane/Vilankulo vazio sem erro; zero publicadas tambem em Cabo Delgado. URL recebido nao identifica dossier. Falha da previa territorial e termino sem resposta continuam abertos; falta URL do dossier para leitura historica sem recriacao. | 22/10/2026 esclarecimento Tempo: pesquisa publica sem dossier; retirada dependencia de URL pessoal/confirmacao de impacto. Correcao QA: search-territory.ts em links carteira/catalogo/zonas, menus e detalhes. Seis testes Node, types e build isolado; prova visual carteira->Inhambane/Vilankulo->catalogo, recarregar, voltar e zonas. Mudanca de provincia limpa distrito. Nenhuma publicacao. Manual: Continuidade territorial da pesquisa. 23/10/2026: Tempo encerrou os tres casos no ambito reportado (6b544548; recibo 4098192a), sem repetir. Avaliacao estatica dos trechos restantes no manual existente, seccao de 23/10: escolhas por ficha preservadas no contrato; parques e campos comuns usam a primeira escolha; land/desk/submission reutilizam campos comuns, sem lista OpportunityChoices no DossierPrefill. Demonstracao multi-oportunidade nos restantes formularios pendente. Aplicacao transversal parcial. Sem alteracao no activo. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos.",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. | C exclusivamente sintético; ZEE/ZFI encaminhamento por predicados, sem reconhecimento de zona real; download concluído apesar de perda da ferramenta. Provas A/B/cálculos/exportadores aceites não repetidas.","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.",,,"Recorte adaptativo de preparação disponibilizado/habilitado na homologação, revisão042ffbde. Limitações globais/sectoriais/fiscais mantêm âmbito próprio." 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. @@ -10653,9 +10653,9 @@ AUD-SEARCH-T11,Consistência transversal da pesquisa e navegação — Legislaç 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 | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.","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. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.",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. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal.","Nenhuma operacao de disponibilizacao pendente neste lote delimitado. Outras componentes, regimes e coberturas fiscais permanecem fora do recorte; nao repetir provas aceites. | Recorte executável C concluído em QA. Restantes coberturas sectoriais/benefícios e encaminhamento visual de zona real têm limites concretos no manual; não bloqueiam os ramos já documentados. Integração/habilitação no destino não executadas. | Integração/habilitação deste recorte executadas em22/10/2026; referências anteriores a operação pendente são históricas. Não reabrir as 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. | 22/10: revisão de a76369eb concluída no âmbito aceite por prova equivalente do regresso; A/B não repetidos. Tabela do primeiro percurso de investimento privado no manual: condições, artigos/período e efeitos; preparação documental, sem ligação executável nova. | 22/10/2026 — percurso privado executável em QA (base52fbb146): condições oficiais seleccionam mero registo/autorização, alternativas documentais e próximos passos; contexto C v4 mero registo após distinção directo/indirecto (Lei14/R13); prévia visual, vínculo inactivo preservado e relatório v3 por autorização conservado como histórico. 3 testes/96 asserções e um teste do novo relatório, tipos/build aprovados. Sem validação jurídica genérica adicional; orientação permanente Tempo em AGENTS. Branch codex/private-investment-path-executable-QA; sem integração main/alteração da homologação/activação fiscal. | 22/10/2026 — prova complementar exclusiva do relatório: recuperação UI do contexto v4, rascunho v5 e Word novo por mero registo; estudo/capacidade não aplicáveis. Word v3 preservado/identificado como histórico, hash inalterado. Sem alteração funcional ou repetição dos ensaios aceites. Dependências Git: a76369eb → 52fbb146 documental → a1fbda06; integrar após decisão, preservando main concorrente. | 22/10/2026 — disponibilizado por autorização Tempo: revisão servida042ffbde (inclui a76369eb/a1fbda06/064296e1 e correcção dirigida da recuperação legada). Percurso habilitado na homologação, versão private-investment-preparation-2026-v1; main ancestral preservado, sem conflitos/force-push. Zero migrations/importações/fixtures; nenhuma nova regra fiscal publicada/activada. Revisão/configuração/rotas conferidas; provas funcionais QA reutilizadas.",,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. | C exclusivamente sintético; ZEE/ZFI encaminhamento por predicados, sem reconhecimento de zona real; download concluído apesar de perda da ferramenta. Provas A/B/cálculos/exportadores aceites não repetidas.",,,,"Recorte adaptativo de preparação disponibilizado/habilitado na homologação, revisão042ffbde. Limitações globais/sectoriais/fiscais mantêm âmbito próprio." -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. | [Delta QA 23/10/2026 sobre c3f7c3ad] QA: gzip/ETag; idioma guardado e recuperado; versao antiga continua recusada. Ver docs/investmoz/unification/traceability-and-manual.md. Homologacao permanece 7c1f5321; cobertura transversal parcial.",,20/10/2026,,,,,,,,,,,,,, +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. | [Delta QA 23/10/2026 sobre c3f7c3ad] QA: gzip/ETag; idioma guardado e recuperado; versao antiga continua recusada. Ver docs/investmoz/unification/traceability-and-manual.md. Homologacao permanece 7c1f5321; cobertura transversal parcial. 23/10/2026: Tempo encerrou os tres casos no ambito reportado (6b544548; recibo 4098192a), sem repetir. Avaliacao estatica dos trechos restantes no manual existente, seccao de 23/10: escolhas por ficha preservadas no contrato; parques e campos comuns usam a primeira escolha; land/desk/submission reutilizam campos comuns, sem lista OpportunityChoices no DossierPrefill. Demonstracao multi-oportunidade nos restantes formularios pendente. Aplicacao transversal parcial. Sem alteracao no activo.",,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. | [Delta QA 23/10/2026 sobre c3f7c3ad] QA: origem por campo em snapshot/relatorio/CSV e edicao posterior distinguida. Ver docs/investmoz/unification/traceability-and-manual.md. Homologacao permanece 7c1f5321; cobertura transversal parcial.",,20/10/2026,,,,,,,,,,,,,, +AUD-SIM-INT06,Generated reports screen download and pagination,"Tempo request 20/10/2026; integrated simulator review; same manual Pedido expresso da Tempo, 23/10/2026, nesta retoma: corrigir integração de complementos no percurso actual, com identidade, cadeia de valor, localização e relações documentadas.",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,,,,,,,,,,,,,," Delta de complementos preparado/verificado em QA; conferência visual e instalação no destino ainda não realizadas. Relações sem oferta identificada permanecem necessidades, sem presumir inexistência no acervo. Cobertura transversal e restantes pendências desta linha mantêm-se. Actualização visual 23/10/2026: supera apenas a pendência visual dos complementos no recorte documentado. Não demonstra contextos específicos de várias oportunidades em zonas/parques, Terra/DUAT, Balcão ou manifestação. Sem disponibilização no destino nem fecho global.",,,,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. | [Delta QA 23/10/2026 sobre c3f7c3ad] QA: origem por campo em snapshot/relatorio/CSV e edicao posterior distinguida. Ver docs/investmoz/unification/traceability-and-manual.md. Homologacao permanece 7c1f5321; cobertura transversal parcial. 23/10/2026 — Complementos: causa delimitada no campo textual focus e ausência de resolução/selecção complementar; incremento preparado em QA no percurso existente. Fichas/IDs existentes por relações documentadas, necessidades sem oferta, serviços/instrumentos publicados associados à origem, localização por complemento, rascunho/prévia/confirmação/histórico no dossier, apresentação nos quatro formulários e snapshot/linhas de relatório. Provas e limites em docs/investmoz/unification/investment-complements-qa-receipt-20261023.json e secção Complementos ligados ao investimento e ao dossier do manual. Sem instalação/alteração no activo. Não repete 6b544548/4098192a nem encerra aplicação transversal. 23/10/2026 — Conferência visual QA dos complementos concluída no recorte pedido: ficha 286 pela identidade existente; Fiação como necessidade/ideia; serviço sintético QA 17 e frio 310 ligados à segunda oportunidade 309 em Gaza, conservando a primeira 286 em Sofala. Confirmação e recarregamento recuperaram selecção, origem e localização; desconhecidos mantidos Por definir. Dossier sintético 6fdbb963-726e-4048-9884-8cddc04e77a6. Provas: outputs/complements-visual-20261023/; recibo existente investment-complements-qa-receipt-20261023.json actualizado. Serviço e segunda oportunidade são fixtures explícitas, sem alegar oferta real no destino. Homologação inalterada; fechos anteriores não repetidos.",,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. | [Delta QA 23/10/2026 sobre c3f7c3ad] QA: ETag fraco normalizado no cliente sem retry forcado ou bypass de concorrencia. Ver docs/investmoz/unification/traceability-and-manual.md. Homologacao permanece 7c1f5321; cobertura transversal parcial.",,20/10/2026,,,,,,,,,,,,,, AUD-SIM-INT08,Portuguese across portal and simulator outputs,Tempo request 20/10/2026; integrated simulator review; same manual,simulator and shared language,,,QA only,"Partial QA fix: rate labels, password confirmation/security and spinner; wider inventory pending",Generic HTTP and fiscal-expression validation messages translated; status/correlation verified; selectable translations and source titles preserved,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. Inventário estático,404 real e traduções de validação preservados. Classificar/apresentar em português os erros dinâmicos das bibliotecas de exportação (cause.message, três consumidores) e conferir estados residuais/governação delimitados; não certificar todos os textos dinâmicos do catálogo. Ver saldo dos oito itens no manual existente; sem fecho global por esta reconciliação. | [Candidata21/10/2026] Mensagens dinâmicas dos exportadores Word/ZIP/PDF/CSV e leitura de anexos usam texto português por operação, preservação e nova tentativa com referênciaEXP. Excepção original só na consola técnica local com referência/operação; sem telemetria nem auditoria remota novas. UI confirmou português nas3falhas de geração;4testes verificam separação mensagem/diagnóstico e correlação em5operações. Traduções/404/validações anteriores reutilizados. Fecho dos consumidores afectados, não certificação de todos os textos de catálogo ou nova sessão administrativa de governação.",,20/10/2026,,,,,,,,,,,,,, diff --git a/resources/js/components/dossier-prefill.tsx b/resources/js/components/dossier-prefill.tsx index 05594e3c..6b796049 100644 --- a/resources/js/components/dossier-prefill.tsx +++ b/resources/js/components/dossier-prefill.tsx @@ -8,6 +8,7 @@ import { } from '@/lib/investor-context'; import { inheritCompatibleFields } from '@/lib/context-inheritance'; import OpportunityChoices from './investment-opportunity-choices'; +import { SelectedComplements } from './investment-complements'; type Props = { contextId?: string | null; consumer: 'simulator' | 'land' | 'desk' | 'submission'; @@ -145,6 +146,7 @@ export function DossierPrefill(props: Props) { )} {message &&

{message}

} {consumer === 'simulator' && !!view.context.opportunity_choices?.length && } + {Object.entries(view.context.selection) .filter(([slot]) => consumer !== 'simulator' || !view.context.opportunity_choices?.length || !['opportunity', 'territory'].includes(slot)) .map(([, r]) => diff --git a/resources/js/components/investment-complements.tsx b/resources/js/components/investment-complements.tsx new file mode 100644 index 00000000..efe02a41 --- /dev/null +++ b/resources/js/components/investment-complements.tsx @@ -0,0 +1,70 @@ +import { Link, usePage } from '@inertiajs/react'; +import { complementPreparationHref } from '@/lib/search-territory'; +import { useState } from 'react'; +import { createOperationKey } from '@/lib/operation-key'; + +export function ComplementEntryActions({target}: {target: string}) { + const {url} = usePage(); + const href = complementPreparationHref(url,target); + return href ? Seleccionar este complemento e continuar no dossier de origem : null; +} + +type Offer = {key: string; title: string; href: string; location?: string}; +export type Complement = { + key: string; code: string; title: string; kind: 'opportunity' | 'service' | 'need'; + origin: Offer; target: Offer | null; territory_id: string | null; + territory?: {title: string} | null; + source: string; excerpt: string; source_sha256: string; + availability?: 'review_required'; +}; +export type ComplementOption = Omit & {opportunities: Offer[]; services: Offer[]}; +export const complementInput = (item: Complement) => ({origin: item.origin.key, code: item.code, target: item.target?.key ?? null, territory_id: item.territory_id}); + +export function SelectedComplements({items, onRemove}: {items: Complement[]; onRemove?: (key: string) => void}) { + if (!items.length) return null; + return
+

Complementos escolhidos no dossier

+ {items.map(item =>
+

{item.title} · {item.kind === 'need' ? 'Necessidade complementar — ideia em preparação' : item.kind === 'service' ? 'Serviço ou instrumento' : 'Oportunidade cadastrada'}

+

Investimento de origem: {item.origin.title}

+

Localização da preparação: {item.territory?.title ?? 'Por definir'}

+ {item.target && Abrir ficha: {item.target.title}} + {item.availability === 'review_required' &&

A oferta ou a referência mudou. Relação anterior conservada para revisão; consulte as opções actuais antes de a utilizar.

} +

Fonte: {item.source} · Trecho: {item.excerpt}

+ {onRemove && } +
)} +
; +} + +export default function InvestmentComplements({items, dossierId, onNavigate}: {items: ComplementOption[]; dossierId?: string; onNavigate?: (href: string) => void}) { + const [selectionKey] = useState(createOperationKey); + if (!items.length) return null; + const prepare = (item: ComplementOption, target?: Offer) => { + const query = new URLSearchParams({complement_origin: item.origin.key, complement_code: item.code}); + if (target) query.set('complement_target', target.key); + if (item.territory_id) query.set('complement_territory', item.territory_id); + if (dossierId) query.set('selection_key', selectionKey); + return (dossierId ? `/investimentos/${dossierId}/contexto/editar` : '/investimentos/iniciar')+'?'+query; + }; + const consult = (item: ComplementOption, offer: Offer) => { + const query = prepare(item,offer).split('?')[1]; + return offer.href+'?'+query+(dossierId ? '&investment_dossier='+encodeURIComponent(dossierId) : ''); + }; + return
+

Investimentos e serviços complementares

+

Escolha os complementos relevantes para o seu investimento. A localização e as condições de cada ficha conservam-se.

+ {items.map(item =>
+

{item.title}

+

Investimento de origem: {item.origin.title} · {item.territory?.title ?? 'Localização por definir'}

+

Referência: {item.source} · Trecho: {item.excerpt}

+ {[...item.opportunities, ...item.services].map(offer =>
+

{if(onNavigate){event.preventDefault();onNavigate(consult(item,offer));}}}>{offer.title} · {offer.location}

+ {if(onNavigate){event.preventDefault();onNavigate(prepare(item,offer));}}}>Seleccionar esta {offer.key.startsWith('opportunity:') ? 'oportunidade' : 'oferta'} para o dossier +
)} + {!item.opportunities.length && !item.services.length && <> +

Necessidade complementar referida; sem oferta cadastrada identificada nas relações deste contexto.

+ {if(onNavigate){event.preventDefault();onNavigate(prepare(item));}}}>Iniciar preparação de uma ideia de {item.title.toLocaleLowerCase('pt-MZ')} + } +
)} +
; +} diff --git a/resources/js/lib/investor-context.ts b/resources/js/lib/investor-context.ts index 7add7f10..1bd73fc0 100644 --- a/resources/js/lib/investor-context.ts +++ b/resources/js/lib/investor-context.ts @@ -56,6 +56,7 @@ export type OpportunityChoice = { source_sha256?: string | null; }; export type DossierContext = { + complements?: import('@/components/investment-complements').Complement[]; requirements_assessment?: RequirementsAssessment; opportunity_choices?: OpportunityChoice[]; revision: number; @@ -98,6 +99,7 @@ export type ContextView = { notice: string; }; export type ContextPlan = { + complements?: import('@/components/investment-complements').Complement[]; requirements_assessment?: RequirementsAssessment; opportunity_choices?: OpportunityChoice[]; private_investment?: { before: Preparation; after: Preparation } | null; diff --git a/resources/js/lib/project-dossier.ts b/resources/js/lib/project-dossier.ts index b5261920..6adff6d5 100644 --- a/resources/js/lib/project-dossier.ts +++ b/resources/js/lib/project-dossier.ts @@ -691,6 +691,11 @@ export function buildProjectDossierRows( if (draft.context_applicability_snapshot) { try { const context = JSON.parse(String(draft.context_applicability_snapshot)); + if (context.version === 1 && Array.isArray(context.complements)) for (const item of context.complements) { + if (typeof item?.title !== 'string' || typeof item?.origin?.title !== 'string') continue; + rows.push(['Localização', 'Complemento escolhido', item.title, `Origem: ${item.origin.title}; ${item.kind === 'need' ? 'necessidade complementar em preparação' : item.kind === 'service' ? 'serviço/instrumento' : 'oportunidade cadastrada'}`]); + if (typeof item.target?.title === 'string') rows.push(['Localização', 'Ficha complementar', item.target.title, item.target.href ?? 'Referência guardada']); + } if (context.version === 1 && Array.isArray(context.opportunity_choices)) for (const choice of context.opportunity_choices) { if (typeof choice?.opportunity?.title !== 'string') continue; rows.push(['Localização', 'Oportunidade escolhida', choice.opportunity.title, 'Referência escolhida no mesmo dossier']); diff --git a/resources/js/lib/search-territory.ts b/resources/js/lib/search-territory.ts index cbe42034..88419519 100644 --- a/resources/js/lib/search-territory.ts +++ b/resources/js/lib/search-territory.ts @@ -1,8 +1,20 @@ const levels = ['province_id', 'district_id', 'admin_post_id', 'locality_id']; const searchRoutes = ['/carteira', '/oportunidades', '/zonas', '/educacao']; +/** Preserve an explicit complementary selection while consulting its canonical public fiche. */ +export function complementPreparationHref(pageUrl: string, target?: string): string | null { + const params = new URL(pageUrl, 'https://portal.invalid').searchParams; + if (!params.get('complement_origin') || !params.get('complement_code') || (target && params.get('complement_target') !== target)) return null; + const query = new URLSearchParams(); + for (const field of ['complement_origin', 'complement_code', 'complement_target', 'complement_territory', 'selection_key']) if(params.get(field)) query.set(field,params.get(field)!); + const dossier = params.get('investment_dossier'); + return (dossier && /^[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i.test(dossier) ? `/investimentos/${dossier}/contexto/editar` : '/investimentos/iniciar')+'?'+query; +} + /** Carry the explicitly consulted portfolio origin and search geography into the existing preparation entry. */ export function investmentPreparationHref(opportunity: number, pageUrl: string, origin?: string | null): string { + const complementary = complementPreparationHref(pageUrl, `opportunity:${opportunity}`); + if (complementary) return complementary; const source = new URL(pageUrl, 'https://portal.invalid'); const inherited = source.searchParams.has('catalogue_query') ? new URLSearchParams(source.searchParams.get('catalogue_query')!) : source.searchParams; const query = new URLSearchParams({source: `opportunity:${opportunity}`}); diff --git a/resources/js/pages/investment/detail.tsx b/resources/js/pages/investment/detail.tsx index 7510ac46..b4986492 100644 --- a/resources/js/pages/investment/detail.tsx +++ b/resources/js/pages/investment/detail.tsx @@ -1,4 +1,5 @@ import EducationalGuides from '@/components/educational-guides'; +import InvestmentComplements, { type ComplementOption } from '@/components/investment-complements'; import { searchTerritoryHref, investmentPreparationHref } from '@/lib/search-territory'; import type { EducationalArticle } from '@/components/educational-article-card'; import { ClassificationSummary } from '@/components/opportunity-classification'; @@ -13,6 +14,7 @@ import TerritorialSources from '@/components/territorial-source-evidence'; import { Frame, card, button, money, groupLabels } from './shared'; import type { Opportunity, Context } from './shared'; export default function Detail({ + complements = [], guides = [], record: r, context: c, @@ -20,6 +22,7 @@ export default function Detail({ returnUrl = '/oportunidades', dossierOrigin, }: { + complements?: ComplementOption[]; guides?: EducationalArticle[]; record: Opportunity; context: Context; @@ -57,6 +60,7 @@ export default function Detail({ {r.reference} · {r.sector?.name} · {r.province} {r.district}

{r.summary}

+
diff --git a/resources/js/pages/investor-path/context-start.tsx b/resources/js/pages/investor-path/context-start.tsx index 50153ac7..81da2292 100644 --- a/resources/js/pages/investor-path/context-start.tsx +++ b/resources/js/pages/investor-path/context-start.tsx @@ -1,4 +1,5 @@ import ContextDocuments from '@/components/context-documents'; +import { SelectedComplements, type Complement } from '@/components/investment-complements'; import { Link } from '@inertiajs/react'; import { useState } from 'react'; import { Frame, card, input, button } from '@/pages/investment/shared'; @@ -10,23 +11,26 @@ export default function ContextStart({ opportunityChoices = [], step = null, entryQuery = {}, + entryComplements = [], }: { contexts: { id: string; title: string; version: number }[]; source: ContextReference | null; opportunityChoices?: OpportunityChoice[]; step?: string | null; entryQuery?: Record; + entryComplements?: Complement[]; }) { const [chosen, setChosen] = useState(''); - const [title, setTitle] = useState(source?.title ?? opportunityChoices[0]?.opportunity.title ?? ''); + const [title, setTitle] = useState(entryComplements[0]?.kind === 'need' ? `Preparação de ${entryComplements[0].title} — ${entryComplements[0].origin.title}`.slice(0,200) : source?.title ?? opportunityChoices[0]?.opportunity.title ?? ''); const [consent, setConsent] = useState(false); const [busy, setBusy] = useState(false); const [error, setError] = useState(''); const [key] = useState(createOperationKey); const sourceSuffix = opportunityChoices.length ? '?' + opportunityChoices.map(c => `opportunities[]=${encodeURIComponent(c.opportunity.id)}`).join('&') : source ? '?source=' + encodeURIComponent(source.key) : ''; - const suffix = sourceSuffix ? sourceSuffix+'&selection_key='+encodeURIComponent(key)+'&'+new URLSearchParams(entryQuery).toString() : ''; + const suffix = sourceSuffix || Object.keys(entryQuery).length ? (sourceSuffix || '?')+(sourceSuffix ? '&' : '')+'selection_key='+encodeURIComponent(key)+'&'+new URLSearchParams(entryQuery).toString() : ''; return ( + {!!opportunityChoices.length &&

Oportunidades escolhidas

    {opportunityChoices.map(c =>
  • {c.opportunity.title} · {c.territory?.title ?? 'Localização por escolher'}{c.portfolio_origins?.map(origin=>

    Associação escolhida: {origin.title}

    )}
  • )}

Confirme a localização de cada ficha na comparação do dossier. Ao continuar um dossier, as escolhas já guardadas conservam-se.

}

Ideia, oportunidade, sector e localização convergem no mesmo diff --git a/resources/js/pages/investor-path/context.tsx b/resources/js/pages/investor-path/context.tsx index 01432436..519b5f75 100644 --- a/resources/js/pages/investor-path/context.tsx +++ b/resources/js/pages/investor-path/context.tsx @@ -3,7 +3,8 @@ import { PreparationImpact, } from '@/components/private-investment-preparation'; import ContextDocuments from '@/components/context-documents'; -import { Link } from '@inertiajs/react'; +import InvestmentComplements, { SelectedComplements, complementInput, type Complement, type ComplementOption } from '@/components/investment-complements'; +import { Link, router } from '@inertiajs/react'; import { useEffect, useRef, useState } from 'react'; import { Frame, button, card, input } from '@/pages/investment/shared'; import { @@ -39,6 +40,7 @@ export default function ContextEditor({ draft = null, entrySources = [], entryLocationDifferences = [], + entryComplements = [], }: { initial: ContextView; options: Options; @@ -46,12 +48,34 @@ export default function ContextEditor({ territorySelection?: TerritoryOption[]; requestedChoices?: OpportunityChoice[] | null; entrySources?: string[]; + entryComplements?: Complement[]; entryLocationDifferences?: {title:string;saved:string;requested:string}[]; draft?: {draft_sequence?:number;needs_review?:boolean;selection?:Partial>;declarations?:Record;replace_fields?:string[];document_links?:Record}|null; }) { const navigation = useNavigationContext(); + const [complements, setComplements] = useState(entryComplements); + const [complementOptions, setComplementOptions] = useState([]); + const [complementError, setComplementError] = useState(''); const [choices, setChoices] = useState(requestedChoices ?? initial.context.opportunity_choices ?? []); const [manageChoices, setManageChoices] = useState(requestedChoices !== null || !!initial.context.opportunity_choices?.length); + const complementContexts = JSON.stringify([...choices.flatMap(c => [{origin:c.opportunity.key, territory_id:c.territory?.id ?? null}, ...(c.portfolio_origins ?? []).map(p => ({origin:'portfolio:'+p.id,territory_id:c.territory?.id ?? null}))]), ...complements.filter(c => c.origin.key.startsWith('portfolio:')).map(c => ({origin:c.origin.key,territory_id:c.territory_id}))].filter((c,i,all) => all.findIndex(other => other.origin === c.origin && other.territory_id === c.territory_id) === i)); + useEffect(() => { + let active = true; + setComplementError(''); setComplementOptions([]); + const contexts = JSON.parse(complementContexts) as {origin:string;territory_id:string|null}[]; + const load = async () => { + const items: ComplementOption[] = []; + const issues: string[] = []; + for(let index=0;index('/complementos-investimento', {contexts:contexts.slice(index,index+100)}); + items.push(...result.items);issues.push(...result.issues.map(issue => issue.message)); + if(!active) return; + } + if(active) {setComplementOptions(items);setComplementError([...new Set(issues)].join(' '));} + }; + void load().catch(e => {if(active) setComplementError(e.message);}); + return () => {active=false;}; + }, [complementContexts]); const [view, setView] = useState(initial); const [preparation, setPreparation] = useState(initial.private_investment); const [options, setOptions] = useState(initialOptions); @@ -97,7 +121,7 @@ export default function ContextEditor({ }).catch(e=>{if(active)setCorridorError(e.message)}).finally(()=>{if(active)setCorridorLoading(false)}); return()=>{active=false}; },[firstCorridor,firstTerritory,corridorRetry]); - const draftBody=JSON.stringify({entry_sources:entrySources,version:view.case.version,selection:changes,declarations,replace_fields:replace,document_links:documentLinks, + const draftBody=JSON.stringify({complements:complements.map(complementInput),entry_sources:entrySources,version:view.case.version,selection:changes,declarations,replace_fields:replace,document_links:documentLinks, ...(manageChoices?{opportunity_choices:choices.map(c=>({source:c.opportunity.key,portfolio_origins:(c.portfolio_origins??[]).map(r=>r.id),corridor_key:c.corridor_key,territory:c.territory?.key??null,location_reason:c.location_reason,confirm_location_change:!!c.confirm_location_change,activities:c.activities??[]}))}:{})}); const latestDraft=useRef(draftBody);latestDraft.current=draftBody; const skipNextDraft=useRef(false); @@ -167,6 +191,7 @@ export default function ContextEditor({ setError(''); setMessage(''); const body = { + complements: complements.map(complementInput), ...(manageChoices ? {opportunity_choices: choices.map(c => ({source:c.opportunity.key,portfolio_origins:(c.portfolio_origins??[]).map(r=>r.id),corridor_key:c.corridor_key,territory:c.territory?.key ?? null,location_reason:c.location_reason,confirm_location_change:!!c.confirm_location_change,activities:c.activities??[]}))} : {}), version: view.case.version, selection: changes, @@ -215,6 +240,7 @@ export default function ContextEditor({ window.history.replaceState(window.history.state, '', `/investimentos/${view.case.id}/contexto/editar${window.location.hash}`); setView(next); setChoices(next.context.opportunity_choices ?? []); + setComplements(next.context.complements ?? []); setPreparation(next.private_investment); navigation.refresh(); setChanges({}); @@ -249,6 +275,18 @@ export default function ContextEditor({ {view.case.title}

Confirme as oportunidades e a localização, complete os dados disponíveis e reveja antes de guardar.

+ {setComplements(items => items.filter(item => item.key !== key));setPlan(null);}}/> + {complementError &&

{complementError} As escolhas anteriores foram conservadas.

} + { + if(busy) return; + setBusy(true);setError(''); + try { + await queue.current.catch(()=>{}); + await contextApi('/investimentos/'+view.case.id+'/contexto/rascunho', {...JSON.parse(latestDraft.current), draft_sequence:++sequence.current.value}, 'POST'); + router.visit(href); + } catch(e) {setError(e instanceof Error ? e.message : 'Não foi possível conservar as escolhas antes de abrir o complemento.');} + finally {setBusy(false);} + }}/> {!!entryLocationDifferences.length && } {error && (
{!!plan.opportunity_choices?.length && } +
diff --git a/resources/js/pages/investor-path/show.tsx b/resources/js/pages/investor-path/show.tsx index 16842ad3..a073c493 100644 --- a/resources/js/pages/investor-path/show.tsx +++ b/resources/js/pages/investor-path/show.tsx @@ -3,6 +3,7 @@ import { type Preparation, } from '@/components/private-investment-preparation'; import ContextDocuments from '@/components/context-documents'; +import { SelectedComplements } from '@/components/investment-complements'; import InvestmentRequirements from '@/components/investment-requirements'; import OpportunityChoices from '@/components/investment-opportunity-choices'; import type { DossierContext } from '@/lib/investor-context'; @@ -531,6 +532,7 @@ export default function InvestmentPath(path: Path) { /> )} {!!path.investment_context?.opportunity_choices?.length && } + !step.preparation_allowed).map((step) => step.code)}/> {!!path.content_sources?.length && (
().props; return ( +

{p.record.partnership_type diff --git a/resources/js/pages/portfolio/show.tsx b/resources/js/pages/portfolio/show.tsx index 895555bc..287c778e 100644 --- a/resources/js/pages/portfolio/show.tsx +++ b/resources/js/pages/portfolio/show.tsx @@ -10,6 +10,7 @@ import PartnershipSourceLinks from '@/components/partnership-source-links'; import { Management } from '../management/shared'; import { Layout, Field, control, button, labels, kind } from './shared'; import type { Dossier } from './shared'; +import InvestmentComplements, { type ComplementOption } from '@/components/investment-complements'; export default function Show(props: Props) { return ( )} {origin &&

Exploração iniciada em: {origin.title}

} + {!management && } {!management && auth.user && (

diff --git a/routes/investor-path.php b/routes/investor-path.php index 6df87e1b..21c7a85f 100644 --- a/routes/investor-path.php +++ b/routes/investor-path.php @@ -7,6 +7,8 @@ use App\Http\Middleware\PrivateInvestmentResponse; use App\Http\Middleware\VirtualDeskInstalled; use Illuminate\Support\Facades\Route; +Route::match(['GET', 'POST'], '/complementos-investimento', [\App\Http\Controllers\InvestmentComplementController::class, 'index'])->middleware('throttle:60,1'); + Route::middleware(['auth', 'verified', PrivateInvestmentResponse::class, VirtualDeskInstalled::class, 'throttle:60,1'])->prefix('investimentos')->group(function () { Route::get('/', [Path::class, 'index']); Route::get('/iniciar', [InvestorContextController::class, 'start']); diff --git a/tests/Feature/InvestmentComplementsTest.php b/tests/Feature/InvestmentComplementsTest.php new file mode 100644 index 00000000..d5bc5e3b --- /dev/null +++ b/tests/Feature/InvestmentComplementsTest.php @@ -0,0 +1,193 @@ +assertSame('simulator_fiscal_delta_20261021_test', $target->name); + $this->assertSame(55441, (int) $target->port); + $this->withoutVite(); + config(['investor-path.enabled' => true, 'investor-path.private_preparation' => true, 'suitecrm.enabled' => false, 'investmoz_ai.enabled' => false]); + } + + private function source(): string + { + return 'portfolio:'.InvestmentPortfolioController::visible()->where('content->code', 'COR-02')->value('id'); + } + + public function test_public_complements_link_existing_identities_and_distinguish_unoffered_needs(): void + { + $source = $this->source(); + $options = $this->getJson('/complementos-investimento?'.http_build_query(['origin' => $source]))->assertOk()->json(); + $storage = collect($options)->firstWhere('code', 'storage'); + $this->assertNotEmpty($storage['opportunities']); + $offer = $storage['opportunities'][0]; + $record = Opportunity::findOrFail(substr($offer['key'], 12)); + $this->assertSame('/oportunidades/'.$record->slug, $offer['href']); + $this->get($offer['href'])->assertOk(); + $spinning = collect($options)->firstWhere('code', 'spinning'); + $this->assertSame([], $spinning['opportunities']); + $query = http_build_query(['complement_origin' => $source, 'complement_code' => 'spinning']); + $this->get('/investimentos/iniciar?'.$query)->assertRedirect(route('login')); + $this->assertStringContainsString('complement_code=spinning', session('url.intended')); + $this->getJson('/complementos-investimento?origin=sector:1')->assertUnprocessable(); + } + + public function test_complements_survive_draft_confirmation_and_consumer_snapshot_without_overwriting_title(): void + { + $actor = User::factory()->create(); $this->actingAs($actor); + $origin = $this->source(); + $option = collect(app(InvestmentComplements::class)->options($origin))->firstWhere('code', 'storage'); + $target = $option['opportunities'][0]['key']; + $need = ['origin' => $origin, 'code' => 'spinning', 'target' => null]; + $offer = ['origin' => $origin, 'code' => 'storage', 'target' => $target]; + $query = http_build_query(['complement_origin' => $origin, 'complement_code' => 'storage', 'complement_target' => $target]); + $this->get('/investimentos/iniciar?'.$query)->assertOk()->assertInertia(fn(Assert $p) => $p->where('entryComplements.0.target.key', $target)->where('opportunityChoices.0.opportunity.key', $target)); + $id = $this->postJson('/investimentos', ['title' => 'QA título deliberado dos complementos', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true])->assertCreated()->json('id'); + $version = $this->getJson('/investimentos/'.$id.'/contexto')->json('case.version'); + $body = ['version' => $version, 'selection' => [], 'complements' => [$need, $offer], 'opportunity_choices' => [['source' => $target, 'portfolio_origins' => [substr($origin, 10)]]]]; + $this->postJson('/investimentos/'.$id.'/contexto/rascunho', [...$body, 'draft_sequence' => 1])->assertOk(); + $this->get('/investimentos/'.$id.'/contexto/editar')->assertOk()->assertInertia(fn(Assert $p) => $p->has('entryComplements', 2)->where('entryComplements.0.kind', 'need')->where('entryComplements.1.target.key', $target)); + $plan = $this->postJson('/investimentos/'.$id.'/contexto/previa', $body)->assertOk()->json(); + $this->assertSame('QA título deliberado dos complementos', $plan['fields']['project_title']); + $control = [...$body, 'preview_hash' => $plan['preview_hash'], 'operation_key' => (string) Str::uuid(), 'confirm' => true]; + $this->postJson('/investimentos/'.$id.'/contexto/confirmar', $control)->assertOk(); + $this->postJson('/investimentos/'.$id.'/contexto/confirmar', $control)->assertOk()->assertJsonPath('replayed', true); + $this->flushSession(); $this->actingAs($actor); + $view = $this->getJson('/investimentos/'.$id.'/contexto')->assertOk()->json(); + $this->assertSame($plan['complements'], $view['context']['complements']); + $this->assertSame($plan['complements'], json_decode($view['prefill']['simulator']['context_applicability_snapshot'], true)['complements']); + $this->get('/investimentos/'.$id)->assertOk()->assertInertia(fn(Assert $p) => $p->has('investment_context.complements', 2)); + $this->actingAs(User::factory()->create())->getJson('/investimentos/'.$id.'/contexto')->assertForbidden(); + } + + public function test_offer_cannot_be_forged_or_confirmed_after_withdrawal(): void + { + $this->actingAs(User::factory()->create()); + $id = $this->postJson('/investimentos', ['title' => 'QA complemento', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true])->assertCreated()->json('id'); + $origin = $this->source(); + $target = collect(app(InvestmentComplements::class)->options($origin))->firstWhere('code', 'storage')['opportunities'][0]['key']; + $base = ['version' => $this->getJson('/investimentos/'.$id.'/contexto')->json('case.version'), 'selection' => []]; + $this->postJson('/investimentos/'.$id.'/contexto/previa', [...$base, 'complements' => [['origin' => $origin, 'code' => 'spinning', 'target' => $target]]])->assertUnprocessable(); + $body = [...$base, 'opportunity_choices' => [['source' => $target]], 'complements' => [['origin' => $origin, 'code' => 'storage', 'target' => $target]]]; + $plan = $this->postJson('/investimentos/'.$id.'/contexto/previa', $body)->assertOk()->json(); + Opportunity::whereKey(substr($target, 12))->update(['status' => 'draft']); + $this->postJson('/investimentos/'.$id.'/contexto/confirmar', [...$body, 'preview_hash' => $plan['preview_hash'], 'operation_key' => (string) Str::uuid(), 'confirm' => true])->assertUnprocessable(); + $this->getJson('/investimentos/'.$id.'/contexto')->assertOk()->assertJsonPath('context.revision', 0); + } + + public function test_concrete_training_and_finance_services_are_reused_only_for_their_documented_origin(): void + { + $actor = User::factory()->create(); $this->actingAs($actor); + $origin = $this->source(); + foreach (['training' => 'Formação e certificação', 'finance' => 'Financiamento'] as $type => $title) { + $service = app(PartnershipExchange::class)->save($actor, ['client_key' => (string) Str::uuid(), 'title' => $title, 'kind' => 'offering', 'partnership_type' => $type, + 'payload' => ['summary' => 'QA oferta '.$title, 'consent' => true], 'origins' => [['type' => 'dossier', 'target_id' => substr($origin, 10)]]]); + // Published fixture only in this rolled-back isolated QA transaction. + DB::table('portal_partnerships')->where('id', $service->id)->update(['status' => 'published']); + $code = $type === 'finance' ? 'finance' : 'training'; + $option = collect(app(InvestmentComplements::class)->options($origin))->firstWhere('code', $code); + $this->assertSame('partnership:'.$service->id, $option['services'][0]['key']); + $this->get($option['services'][0]['href'])->assertOk(); + $resolved = app(InvestmentComplements::class)->resolve([['origin' => $origin, 'code' => $code, 'target' => 'partnership:'.$service->id]]); + $this->assertSame('service', $resolved[0]['kind']); + } + $other = InvestmentPortfolioController::visible()->where('content->code', 'COR-01')->firstOrFail(); + $this->assertSame([], collect(app(InvestmentComplements::class)->options('portfolio:'.$other->id))->flatMap(fn($r) => $r['services'])->all()); + } + + public function test_explicit_complementary_project_relationship_and_geography_control_the_available_fiche(): void + { + $records = Opportunity::published()->orderBy('id')->take(2)->get(); + [$main, $target] = [$records[0], $records[1]]; + $main->summary = 'QA investimento principal'; $main->save(); + $target->title = 'Regadio QA relacionado'; $target->summary = 'Regadio para a cadeia de valor QA'; $target->save(); + $projects = InvestmentPortfolioController::visible()->whereNotNull('project_id')->take(2)->pluck('project_id'); + DB::table('opportunity_projects')->whereIn('opportunity_id', [$main->id, $target->id])->delete(); + DB::table('opportunity_projects')->insert([['opportunity_id' => $main->id, 'project_id' => $projects[0]], ['opportunity_id' => $target->id, 'project_id' => $projects[1]]]); + $link = (string) Str::uuid(); + DB::table('complementary_project_links')->insert(['id' => $link, 'anchor_project_id' => $projects[0], 'complementary_project_id' => $projects[1], 'relation_type' => 'enabler', 'data_classification' => 'public']); + $service = app(InvestmentComplements::class); + $options = $service->options('opportunity:'.$main->id); + $this->assertSame('opportunity:'.$target->id, collect($options)->firstWhere('code', 'irrigation')['opportunities'][0]['key']); + $sofala = collect(app(\App\Services\InvestmentCorridorContext::class)->provinces('beira'))->firstWhere('source_code', '07')->id; + $gaza = app(\App\Services\InvestmentCorridorContext::class)->provinces('limpopo')[0]->id; + $target->primary_territory_id = $gaza; $target->save(); + $filtered = $service->options('opportunity:'.$main->id, $sofala); + $this->assertSame([], collect($filtered)->firstWhere('code', 'irrigation')['opportunities']); + $batch = $this->postJson('/complementos-investimento', ['contexts' => [['origin' => 'opportunity:'.$main->id, 'territory_id' => $sofala]]])->assertOk()->json(); + $this->assertSame([], collect($batch['items'])->firstWhere('code', 'irrigation')['opportunities']); + DB::table('complementary_project_links')->where('id', $link)->update(['data_classification' => 'internal']); + $this->assertSame([], $service->options('opportunity:'.$main->id)); + } + + public function test_previous_relation_is_preserved_as_history_when_an_offer_is_withdrawn(): void + { + $service = app(InvestmentComplements::class); $origin = $this->source(); + $target = collect($service->options($origin))->firstWhere('code', 'storage')['opportunities'][0]['key']; + $input = [['origin' => $origin, 'code' => 'storage', 'target' => $target]]; + $previous = $service->resolve($input); + Opportunity::whereKey(substr($target, 12))->update(['status' => 'draft']); + $history = $service->resolve($input, $previous); + $this->assertSame($previous[0]['target'], $history[0]['target']); + $this->assertSame('review_required', $history[0]['availability']); + DB::table('investment_dossiers')->where('id', substr($origin, 10))->update(['publication_status' => 'draft']); + $this->assertSame($history, $service->resolve($input, $previous)); + $this->assertSame(['items' => [], 'issues' => []], $this->postJson('/complementos-investimento', ['contexts' => []])->assertOk()->json()); + $this->postJson('/complementos-investimento', ['contexts' => [['origin' => $origin], ['origin' => 'portfolio:'.InvestmentPortfolioController::visible()->where('content->code', 'COR-01')->value('id')]]]) + ->assertOk()->assertJsonCount(1, 'issues')->assertJsonPath('issues.0.origin', $origin); + } + + public function test_removing_then_explicitly_selecting_a_need_keeps_the_draft_and_does_not_reapply_an_old_entry(): void + { + $this->actingAs(User::factory()->create()); + $id = $this->postJson('/investimentos', ['title' => 'QA retirada de complemento', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true])->assertCreated()->json('id'); + $origin = $this->source(); $selection = (string) Str::uuid(); + $entry = app(InvestmentComplements::class)->resolve([['origin' => $origin, 'code' => 'spinning']])[0]; + $query = http_build_query(['complement_origin' => $origin, 'complement_code' => 'spinning', 'selection_key' => $selection]); + $tag = 'complement:'.hash('sha256', $entry['key'].'@'.$selection); + $this->get('/investimentos/'.$id.'/contexto/editar?'.$query)->assertOk()->assertInertia(fn(Assert $p) => $p->where('entrySources.0', $tag)->has('entryComplements', 1)); + $this->postJson('/investimentos/'.$id.'/contexto/rascunho', ['version' => $this->getJson('/investimentos/'.$id.'/contexto')->json('case.version'), + 'draft_sequence' => 1, 'selection' => [], 'complements' => [], 'entry_sources' => [$tag], 'declarations' => ['project_title' => 'QA edição a conservar']])->assertOk(); + $this->get('/investimentos/'.$id.'/contexto/editar?'.$query)->assertOk()->assertInertia(fn(Assert $p) => $p->has('entryComplements', 0)->where('draft.declarations.project_title', 'QA edição a conservar')); + $query = http_build_query(['complement_origin' => $origin, 'complement_code' => 'spinning', 'selection_key' => (string) Str::uuid()]); + $this->get('/investimentos/'.$id.'/contexto/editar?'.$query)->assertOk()->assertInertia(fn(Assert $p) => $p->has('entryComplements', 1)->where('draft.declarations.project_title', 'QA edição a conservar')); + } + + public function test_public_chain_contract_preserves_both_documentary_references_in_the_selected_relation(): void + { + $records = Opportunity::published()->orderBy('id')->take(2)->get(); + [$main, $target] = [$records[0], $records[1]]; + $main->summary = 'QA produção e processamento'; $main->save(); + $target->summary = 'QA processamento da mesma cadeia'; $target->save(); + $row = ['target_type' => 'chain', 'target_id' => (string) Str::uuid(), 'label' => 'Cadeia sintética QA', 'state' => 'preliminary', 'source_reference' => 'Referência documental sintética QA']; + $classification = \Mockery::mock(\App\Services\OpportunityClassification::class); + $classification->shouldReceive('publicRows')->andReturnUsing(fn($record) => in_array($record->id, [$main->id, $target->id], true) ? [$row] : []); + $this->app->instance(\App\Services\OpportunityClassification::class, $classification); + $service = app(InvestmentComplements::class); + $options = $service->options('opportunity:'.$main->id); + $offer = collect(collect($options)->firstWhere('code', 'processing')['opportunities'])->firstWhere('key', 'opportunity:'.$target->id); + $this->assertNotNull($offer); + $this->assertSame('value_chain', $offer['relationship']['type']); + $selected = $service->resolve([['origin' => 'opportunity:'.$main->id, 'code' => 'processing', 'target' => 'opportunity:'.$target->id]]); + $this->assertSame($row, $selected[0]['target']['relationship']['principal'][0]); + $this->assertSame($row, $selected[0]['target']['relationship']['target'][0]); + } +} diff --git a/tests/frontend/investment-complements.test.mjs b/tests/frontend/investment-complements.test.mjs new file mode 100644 index 00000000..0aa03a5e --- /dev/null +++ b/tests/frontend/investment-complements.test.mjs @@ -0,0 +1,37 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { investmentPreparationHref, complementPreparationHref } from '../../resources/js/lib/search-territory.ts'; +import { buildProjectDossierRows } from '../../resources/js/lib/project-dossier.ts'; + +test('consulting a complementary opportunity preserves the origin selection and the chosen dossier', () => { + const dossier='11111111-1111-4111-8111-111111111111'; + const query = new URLSearchParams({complement_origin:'opportunity:10',complement_code:'cold',complement_target:'opportunity:20',investment_dossier:dossier,complement_territory:dossier}); + const href=investmentPreparationHref(20,'/oportunidades/frio?'+query); + assert.ok(href.startsWith(`/investimentos/${dossier}/contexto/editar?`)); + const params=new URL(href,'https://local.invalid').searchParams; + assert.equal(params.get('complement_origin'),'opportunity:10'); + assert.equal(params.get('complement_target'),'opportunity:20'); + assert.equal(params.get('complement_territory'),dossier); + assert.equal(complementPreparationHref('/parcerias/7?complement_origin=portfolio:a&complement_code=finance&complement_target=partnership:7','partnership:7'),'/investimentos/iniciar?complement_origin=portfolio%3Aa&complement_code=finance&complement_target=partnership%3A7'); + assert.equal(complementPreparationHref('/oportunidades/frio?'+query,'opportunity:21'),null); + query.set('investment_dossier','https://external.invalid'); + assert.ok(investmentPreparationHref(20,'/oportunidades/frio?'+query).startsWith('/investimentos/iniciar?')); +}); + +test('complement report rows retain principal, concrete target and the distinction from a need', () => { + const complements=[ + {title:'Silos',kind:'opportunity',origin:{title:'Cereais'},target:{title:'Armazenagem existente',href:'/oportunidades/silos'}}, + {title:'Fiação',kind:'need',origin:{title:'Corredor de origem'},target:null}, + {title:'Formação',kind:'service',origin:{title:'Cereais'},target:{title:'Serviço existente',href:'/parcerias/7'}}, + ]; + const draft={project_title:'Título deliberado',context_applicability_snapshot:JSON.stringify({version:1,complements})}; + const before=JSON.stringify(draft); + const rows=buildProjectDossierRows(draft); + const chosen=rows.filter(row=>row[1]==='Complemento escolhido'); + assert.equal(chosen.length,3); + assert.ok(chosen[0][3].includes('Cereais')); + assert.ok(chosen[1][3].includes('necessidade complementar em preparação')); + assert.ok(chosen[2][3].includes('serviço/instrumento')); + assert.ok(rows.some(row=>row[1]==='Ficha complementar'&&row[3]==='/oportunidades/silos')); + assert.equal(JSON.stringify(draft),before); +});