docs: confirm private offers QA and plan phase two
This commit is contained in:
+168
@@ -0,0 +1,168 @@
|
||||
# InvesteMoz — encerramento técnico da Fase 1 e plano da Fase 2
|
||||
|
||||
Data: 14/11/2026. Referência funcional: RF-MN-003 da matriz existente.
|
||||
|
||||
**Revisão examinada: `1f2990e4`. Fase 1 verificada tecnicamente, com ressalva de conferência visual não realizada. Fase 2 apenas planeada, não autorizada para implementação. Nenhuma instalação em homologação ou produção.**
|
||||
|
||||
## 1. Resultado do encerramento técnico
|
||||
|
||||
A implementação recebida mantém Oportunidades como cadastro principal. Criar, guardar, recuperar, editar e submeter são operações privadas, com os perfis, contactos, localização, versões e auditoria existentes. A submissão não abre automaticamente revisão, aprovação ou publicação. Não foram encontradas alterações posteriores nos 16 ficheiros identificados pelos hashes do recibo, incluindo código, testes e documentação da entrega. Os 17 ficheiros do commit incluem também o próprio recibo.
|
||||
|
||||
O encerramento técnico não constitui aceite visual, aprovação da verificação global de formatação ou autorização de instalação. O módulo Ofertas integral e RF-MN-003, que também abrange Procuras, não ficam encerrados por esta fase.
|
||||
|
||||
### Evidências confirmadas
|
||||
|
||||
| Evidência | Resultado e limite |
|
||||
| --- | --- |
|
||||
| `outputs/offers-private-phase1-20261114/qa-result.json` | Recibo recebido conferido; 16 hashes correspondem aos ficheiros examinados |
|
||||
| Regressão recebida | 35 testes / 548 asserções aprovados, segundo o recibo; prova anterior reutilizada, sem repetir a bateria nesta passagem |
|
||||
| `tests-final.log` | Resultado bruto confere com o recibo: 16 testes / 172 asserções aprovados |
|
||||
| Portabilidade do HTML compilado | Recibo regista 1 teste / 10 asserções aprovado; utiliza o directório do executor e `build` por defeito |
|
||||
| Pint, PHPStan, tipos, lint focado e build QA | Aprovações do recibo reutilizadas, pois os ficheiros e dependências da candidata não mudaram |
|
||||
| Verificação global de formatação | Executada novamente nesta passagem: 61 ficheiros; todos exteriores ao delta e com o mesmo blob Git da revisão anterior |
|
||||
| Preservação | Nenhuma alteração de código, testes, configurações, permissões ou base de dados nesta passagem |
|
||||
|
||||
Os grupos de testes sobrepõem-se: não somar os totais nem tratar o número de testes como funcionalidades concluídas. A bateria canónica extensa interrompida na implementação anterior não é considerada aprovada. O teste antigo de divulgação vinculado a outra base QA conserva a sua guarda; essa base não foi alterada para repetir a prova.
|
||||
|
||||
### Cobertura de autorização e isolamento
|
||||
|
||||
| Comportamento | Evidência existente |
|
||||
| --- | --- |
|
||||
| Anónimo, email não verificado e conta sem atribuição não criam ofertas | `test_other_accounts_ungranted_unverified_and_revoked_actors_cannot_operate` |
|
||||
| Outro promotor individual não lê, edita ou submete; a listagem não revela o registo | Mesmo teste, com pedidos HTTP aos três percursos e listagem vazia |
|
||||
| Atribuição expirada deixa de autorizar acesso | Mesmo teste; a preparação específica usa expiração, não simula revogação administrativa |
|
||||
| Revogação administrativa invalida a sessão; gestor legado não contorna o âmbito | `PortalProfileAccessTest::test_revocation_invalidates_existing_session_and_legacy_manager_cannot_bypass_scope`, na regressão recebida |
|
||||
| Organização não pode ser trocada e perda da representação impede acesso/edição | `test_organization_representation_is_rechecked_and_other_organizations_are_not_assignable` |
|
||||
| Categoria não atribuída e campos de proprietário/estado/contexto forjados são recusados | `test_contact_scope_and_malicious_fields_roll_back_without_parallel_records` |
|
||||
| Contacto de outro titular é recusado; falha reverte a criação | Mesmo teste; sem oportunidade residual |
|
||||
| Gravar contacto exige MFA; contacto eliminado impede a submissão | `test_existing_contacts_registration_still_requires_fresh_mfa_and_submission_rechecks_contact` |
|
||||
| Edição concorrente não substitui dados; repetição da criação conserva a identidade | `test_private_creation_recovery_edit_conflict_and_idempotency_use_one_opportunity` |
|
||||
| Submissão exige confirmação e versão actual; não cria edição ou notificação editorial | `test_submit_is_private_exact_version_confirmed_and_recoverable_without_editorial_actions` |
|
||||
| Rotas nativas não permitem editar/divulgar/publicar a oferta; detalhe e pesquisa públicos não a mostram | `test_no_public_exposure_and_native_routes_cannot_edit_or_publish_offer` |
|
||||
| Modelo impede publicar ou retirar a marca privada; filtro público exclui estado incoerente introduzido directamente em QA | Mesmo teste e `test_model_cannot_publish_or_remove_private_phase_marker` |
|
||||
| Oportunidades anteriores não são convertidas pelo adaptador; âmbito nativo de divulgação mantém-se | `test_existing_opportunity_cannot_be_converted_through_offer_adapter` |
|
||||
| HTML privado usa entradas compiladas reais e resposta `private, no-store` | `test_full_html_uses_real_compiled_private_page_entries` e teste de recuperação |
|
||||
|
||||
São provas com actores e dados sintéticos na base isolada `offers_phase1_20261114_test:55441`. Não comprovam autenticação real observada num navegador, configuração de entrega de email, revisão humana de conteúdo ou funcionamento de NDA. Esses resultados não são alegados.
|
||||
|
||||
### Conferência visual e incidente da ferramenta
|
||||
|
||||
Foi tentada a observação, preservando as sessões existentes. O inventário da ferramenta identifica Edge e Firefox como aplicações, mas devolve `browsers: []` e o erro exacto `Browsers: Error: The browser access host is unavailable`. Não foi possível identificar uma aba nem ler o seu URL pelo conector.
|
||||
|
||||
Foi também tentado o acesso nativo de Windows através de Computer Use. A enumeração de aplicações respondeu, mas a captura da janela Edge falhou: `encode latest capture frame failed: copy Direct3D surface to SoftwareBitmap failed: A instância de dispositivo GPU foi suspensa. Utilize GetDeviceRemovedReason para determinar a ação apropriada. (0x887A0005)`.
|
||||
|
||||
Não foram repetidos reinícios, alteradas configurações ou desactivadas verificações. Não se observou a candidata e não se atribui a causa ao Edge ou ao portal. A conferência visual continua pendente por impedimento da ferramenta. Quando o acesso estiver disponível, conferir apenas a candidata: lista/criação, recuperação, preço «A negociar»/montante, contacto, estado após submissão, erros preservando os campos e apresentação estreita, sem voltar a executar a bateria técnica aceite.
|
||||
|
||||
### Os 61 ficheiros de formatação
|
||||
|
||||
`outputs/offers-private-phase1-20261114/closure-confirmation.json` contém a lista completa, o blob Git de cada ficheiro e a comparação individual. Resultado: **61/61 fora do delta; 61/61 idênticos à revisão base `e8408c27`; intersecção com a entrega vazia**. Os ficheiros de dependências também não integram o delta.
|
||||
|
||||
Não foram corrigidos ou reformatados nesta instrução. A falha global mantém-se registada, sem ser atribuída à Fase 1 nem declarada dispensada. Uma regularização desses ficheiros seria uma alteração separada; não é incluída por conveniência neste plano.
|
||||
|
||||
## 2. Plano técnico proposto para a Fase 2 — aguarda autorização
|
||||
|
||||
### Resultado e fronteira
|
||||
|
||||
Permitir que uma oferta submetida entre nas filas do Dashboard Colaborativo existente, seja revista, devolvida ou rejeitada com fundamento, corrigida e reenviada, ou aprovada internamente na sua versão exacta. Conservar decisões, responsáveis, tarefas, notificações e histórico. **A Fase 2 proposta termina na aprovação privada; a publicação pública permanece bloqueada para Ofertas.** A aprovação não certifica o negócio, a titularidade, o financiamento ou uma validação jurídica que não tenha ocorrido.
|
||||
|
||||
Sem novo dashboard, cadastro, autenticação ou motor editorial. Sem alterar negócios existentes, `mne`, menu principal ou regras dos perfis completos de Oportunidades. Não inclui catálogo público, fotografias, NDA, comprovativos de propriedade, validade, destaque comercial ou SMS novo. As decisões desses ramos não bloqueiam a revisão dos cinco campos comuns em privado.
|
||||
|
||||
### Arquitectura e persistência
|
||||
|
||||
1. Manter `opportunities.id`, `owner_user_id`, `organization_id`, `management_version`, `management_draft`, a marca `workflow_context.private_offer_preparation` e o histórico da Fase 1. A marca permanece e o filtro público continua a excluí-la.
|
||||
2. Acrescentar um adaptador delimitado ao percurso privado para fornecer validação comum, snapshot, hash e estado ao workflow nativo de Oportunidades. Reutilizar `OpportunityProfileWorkflow`, `PortalProfileAccess`, `OpportunityWorkflowTasks` e a integração de oportunidades em `PortalEditorialWorkflow`; não duplicar as transições num segundo motor.
|
||||
3. Não encaminhar simplesmente o formulário reduzido para `OpportunityCanonicalContract::validateSubmission`: esse contrato exige os perfis completos, evidências e verificações especializadas. Não fabricar esses campos nem enfraquecer as validações dos restantes investimentos. O adaptador distingue explicitamente a preparação comercial comum da validação integral do projecto.
|
||||
4. Separar estado editorial privado e disponibilidade pública. `working_state` pode representar a revisão; `status` mantém a barreira privada da oferta e `published_at` permanece nulo. O workflow existente actualmente escreve ambos: a implementação terá de delimitar esse comportamento às Ofertas, preservando-o nos restantes registos.
|
||||
5. Evitar estados divergentes entre `private_offer_preparation.state` e `working_state`: definir uma projecção única de estado para apresentação, autorização e filas, com compatibilidade de leitura da Fase 1. Não converter todos os registos por uma escrita em lote nem criar tarefas ao abrir uma página. A vinculação inicial de uma submissão anterior deve ser explícita, idempotente e auditada, conservando autor, data e revisão originais.
|
||||
6. Usar os registos existentes de `tasks`, `audit_events` e `portal_editorial_notifications`. Esta última já tem referência a oportunidade, versão e índice único por utilizador/oportunidade/versão/acção. Não se prevê uma nova tabela ou migração para o núcleo proposto. Se uma necessidade concreta de persistência não couber nos contratos existentes, apresentar o delta aditivo antes de o executar; não instalar estrutura por esta instrução.
|
||||
|
||||
### Estados e operações propostas
|
||||
|
||||
| Origem | Operação e responsável | Destino e garantia |
|
||||
| --- | --- | --- |
|
||||
| Rascunho | Promotor submete a versão conferida | Submetida; snapshot e tarefa de revisão vinculados à versão/ciclo |
|
||||
| Submetida | Validador autorizado inicia/recebe revisão | Em revisão; responsável explícito, sem atribuição inventada |
|
||||
| Submetida ou em revisão | Validador pede correcção, com fundamento e campos a rever | Correcções solicitadas; edição permitida apenas ao promotor autorizado |
|
||||
| Submetida ou em revisão | Validador rejeita, com fundamento obrigatório | Rejeitada; decisão e versão conservadas |
|
||||
| Correcções solicitadas ou rejeitada | Promotor escolhe «Corrigir e reenviar» | Nova preparação privada ligada à anterior; a rejeição não é apagada nem revertida em aprovação |
|
||||
| Nova preparação corrigida | Promotor guarda e submete | Novo ciclo de revisão; sem duplicação de oportunidade, tarefa ou notificação por repetição do pedido |
|
||||
| Em revisão | Validador independente aprova o snapshot actual | Aprovada internamente; nenhuma exposição pública |
|
||||
| Aprovada internamente | Promotor prepara alteração | Nova revisão privada; aprovação anterior histórica, sem aplicação à nova versão |
|
||||
| Qualquer estado de Ofertas nesta fase | Qualquer tentativa de publicar ou divulgar | Recusada no servidor, mesmo por Publicador ou através de rotas alternativas |
|
||||
|
||||
Reutilizar a regra nativa de fundamento de decisões (`reason`, 20–1000 caracteres), sem substituir fundamentação por um checkbox. Campos de correcção são referências aos dados da oferta, não exigências de um perfil especializado ainda por aprovar. A proposta de retoma após rejeição é própria das Ofertas; não alterar o recurso administrativo dos outros percursos.
|
||||
|
||||
### Autorizações e independência
|
||||
|
||||
| Actor existente | Âmbito proposto |
|
||||
| --- | --- |
|
||||
| Promotor | Criar/editar nos estados permitidos, submeter e preparar correcção, dentro das categorias e representação efectivas; nunca aprovar a sua oferta |
|
||||
| Validador | Consultar/rever/devolver/rejeitar/aprovar dentro da atribuição actual; decisões com MFA recente e verificação de conflitos |
|
||||
| Publicador | Não recebe aprovação por inferência e não publica Ofertas nesta fase; futura publicação continua operação e actor distintos da aprovação |
|
||||
| Auditor | Consulta autorizada e histórico nos limites existentes; sem decisões operacionais |
|
||||
| Gestor/Superutilizador | Conserva os controlos existentes; a condição administrativa não concede automaticamente acesso operacional, âmbito ou dispensa de independência |
|
||||
|
||||
Rever autorização no servidor em cada pedido, API, pré-visualização, tarefa e ligação de notificação; repetir dentro da transacção antes da decisão. Autor, contribuidores e representantes com conflito não aprovam a mesma oferta, mesmo acumulando papéis. Não estender a designação jurídica da legislação a Ofertas. Sem designação jurídica expressa e texto aprovado não se regista «validação jurídica» fictícia.
|
||||
|
||||
### Versões, auditoria e concorrência
|
||||
|
||||
Cada submissão congela um snapshot dos campos comuns, preço/modo/moeda, contacto referenciado, categoria, promotor e localização, com versão do contrato, revisão e hash determinístico. As referências de contacto e localização devem identificar também a versão/hash dos dados efectivamente conferidos; uma alteração posterior na fonte sinaliza reconferência, sem substituir silenciosamente a conclusão. Não criar outro cadastro de contactos ou territórios. Os recursos que futuramente entrem no âmbito terão identificador/versão/hash próprios; a aceitação deles não é antecipada nesta fase.
|
||||
|
||||
Decisões guardam actor, instante UTC, fundamento, transição, ciclo, versão e hash. Edição posterior exige novo ciclo e nova aprovação; a decisão anterior permanece consultável, associada ao snapshot anterior. Reutilizar snapshots cifrados da auditoria e restrições de leitura existentes; não copiar contactos ou documentos para registos públicos.
|
||||
|
||||
Usar `etag`, bloqueio da oportunidade e incremento de versão na mesma transacção. Decisão com versão desactualizada responde a conflito, sem sobrescrever o trabalho do promotor. Repetições da mesma operação não repetem decisões, tarefas ou notificações. Falha na operação reverte conjuntamente os seus efeitos de estado, tarefa e auditoria.
|
||||
|
||||
### Dashboard, tarefas e notificações
|
||||
|
||||
Integrar na secção de Oportunidades já acessível pelo Dashboard Colaborativo, com filtro para Ofertas e estados da revisão. Não criar outro item no menu principal. O controlador editorial actual lista artigos/legislação/documentos e liga Oportunidades separadamente; não assumir que acrescentar um tipo de conteúdo às tabelas editoriais resolve automaticamente esta integração.
|
||||
|
||||
As contagens devem considerar cada oportunidade uma vez: o contador actual já abrange rascunhos de Ofertas. Mostrar ofertas por rever sem duplicar o total entre uma nova vista filtrada e a vista geral. Tarefas sem responsável são visíveis na fila autorizada; não escolher um funcionário ou prazo por inferência. Reenvio cria novo ciclo e conserva tarefas/decisões encerradas.
|
||||
|
||||
Usar a caixa de notificações editorial existente, com ligações para o detalhe privado correcto e revalidação de acesso na listagem e no destino. Notificar autor e responsáveis efectivos sobre submissão, atribuição, correcção, rejeição, reenvio e aprovação, conforme o papel de cada destinatário; não enviar conteúdo confidencial a uma lista geral de gestores. O mecanismo actual de oportunidades cobre autor e responsáveis atribuídos: a escolha de coordenação inicial deve respeitar as designações existentes e o âmbito, deixando a fila por atribuir quando não houver destinatário elegível.
|
||||
|
||||
Para email, reutilizar o transporte e a fila existentes, após confirmação da transacção, com tentativa/erro rastreáveis e revalidação de destinatário. `NotifyInterestReceived` é de manifestações de interesse: reutiliza-se o padrão de transporte, não o seu texto ou evento como se fossem Ofertas. Não prometer entrega exactamente uma vez, leitura da mensagem ou SMS configurado. Em QA, manter mail fake/array e dados sintéticos; não enviar mensagens reais nesta preparação.
|
||||
|
||||
### Componentes existentes provavelmente afectados
|
||||
|
||||
| Componente | Alteração delimitada proposta |
|
||||
| --- | --- |
|
||||
| `app/Services/PrivateOfferPreparation.php` | Validação/snapshot comuns, compatibilidade da submissão F1 e preparação de correcção/reenvio |
|
||||
| `app/Services/OpportunityProfileWorkflow.php` | Adaptar revisão, decisões, ciclos e persistência privada apenas quando a oportunidade for Oferta |
|
||||
| `app/Services/PortalProfileAccess.php` | Estado único e operações/edição permitidas nos estados de correcção, conservando âmbito e conflito |
|
||||
| `app/Services/OpportunityManagement.php` | Preservar versões e invalidação de aprovação da revisão alterada, sem converter registos anteriores |
|
||||
| `app/Services/OpportunityWorkflowTasks.php` | Reutilizar vinculação idempotente por oportunidade/revisão/ciclo e tarefas anteriores |
|
||||
| `app/Services/PortalEditorialWorkflow.php` | Filas/contagens, destinatários e ligações das notificações de Ofertas, sem duplicar o cadastro editorial |
|
||||
| `app/Http/Controllers/PortalEditorialWorkflowController.php` e `OpportunityManagementController.php` | Vista filtrada e dados autorizados de revisão, reaproveitando a entrada de Oportunidades |
|
||||
| `app/Http/Controllers/PrivateOfferPreparationController.php` e `PortalProfileController.php` | Pedidos privados e decisões encaminhados ao serviço autorizado; sem lógica de permissão apenas no cliente |
|
||||
| `app/Http/Middleware/ProtectProfileOpportunity.php` | Permitir somente as operações F2 expressamente suportadas; manter recusados os restantes atalhos |
|
||||
| `app/Models/Opportunity.php` e `app/Services/OpportunityPromotion.php` | Conservar exclusão pública, marca privada e recusa de divulgação; não remover as barreiras ao habilitar revisão |
|
||||
| `resources/js/pages/offers/preparation.tsx`, `preparation-index.tsx` e `components/opportunity-profile-actions.tsx` | Estado, correcção, reenvio, fundamento e acções de cada papel, com campos preservados em conflito |
|
||||
| `resources/js/pages/management/editorial-workflow.tsx` e `management/opportunities.tsx` | Reutilizar secção existente e filtros, sem reorganizar o menu |
|
||||
| `routes/web.php` | Só as rotas privadas necessárias, com middleware de autenticação, perfis e resposta privada |
|
||||
| Testes e os mesmos manual/matriz | Provas focadas, saldo de RF-MN-003 e distinção QA/instalado/pendente |
|
||||
|
||||
Os caminhos acima existem e foram inspeccionados. Não são uma autorização para modificar todos os ficheiros: usar apenas os que o delta demonstrar necessários. Novos auxiliares ou testes deverão ter nomes definidos na implementação, sem serem apresentados aqui como componentes já existentes.
|
||||
|
||||
### Ordem de implementação proposta e aceitação
|
||||
|
||||
1. **Estado e versão:** adaptar a submissão F1 sem perder os seus identificadores/datas; congelar snapshot, ciclo e permissões. Demonstrar que uma Oferta e uma oportunidade normal mantêm os respectivos contratos.
|
||||
2. **Revisão privada:** integrar tarefas e fila existente; iniciar, devolver, rejeitar e aprovar com fundamento, MFA, âmbito e independência. Aprovação continua sem publicação.
|
||||
3. **Correcção e reenvio:** demonstrar rejeição → nova revisão privada → guardar/recuperar → novo ciclo → aprovação, conservando rejeição, comentários, snapshots e tarefas antigos.
|
||||
4. **Notificações:** emitir uma ocorrência por evento/destinatário na caixa existente; testar repetição, falha/rollback, permissão revogada e URL de destino. Email real não é condição para aprovar o transporte fake de QA nem é activado por ele.
|
||||
5. **Aceitação:** testes HTTP de sucesso, erro e concorrência, autorização por organização/categoria/estado, perda de representação, auditor e acumulação de papéis, motivo ausente, hash desactualizado, reenvio sem duplicações e nenhuma exposição por catálogo/API/rotas de divulgação. Regressão focada dos percursos nativos afectados, tipos, análise PHP, lint e compilação conforme o executor existente. Conferência visual quando a ferramenta permitir.
|
||||
|
||||
Percurso de aceitação principal: promotor prepara/submete → validador consulta na fila → rejeita com fundamento → promotor corrige e reenvia a nova revisão → validador independente aprova → autor recupera decisão e histórico → tentativa de publicação permanece recusada.
|
||||
|
||||
### Decisões para a autorização da Fase 2
|
||||
|
||||
Solicitar aprovação do recorte acima, incluindo: aprovação exclusivamente interna; correcção/reenvio após rejeição como nova revisão; estado privado compatível com os dados F1; integração pela área existente de Oportunidades no Dashboard; notificações internas e email apenas simulado em QA. Não são necessárias novas contas ou permissões por defeito.
|
||||
|
||||
Uma designação operacional ausente bloqueia apenas a atribuição a essa pessoa; não justifica inventar destinatários nem suspender as restantes filas autorizadas. NDA, comprovativos, textos jurídicos, formatos/tamanhos das seis fotografias e validade continuam nas fases dependentes. A regra de separação aprovação/publicação mantém-se; publicação, instalação e qualquer alteração operacional exigem autorização expressa própria.
|
||||
|
||||
### Preservação e reversão da futura preparação QA
|
||||
|
||||
Preparar o delta F2 num commit/pacote próprio, após a sua autorização, conservando a referência F1. A revisão técnica deve mostrar alterações apenas nos componentes afectados e revalidar as barreiras de exposição. Uma reversão de código ou desactivação do percurso F2 deve deixar as ofertas e decisões existentes legíveis em privado e bloqueadas para publicação; não eliminar eventos, tarefas, notificações ou snapshots para regressar à versão anterior. Não executar rollback destrutivo de estrutura com histórico.
|
||||
|
||||
Qualquer futura entrega em homologação terá a sua autorização, conferência do delta e processo Git de backup/restauro e recuperação. Este plano não executa nem autoriza essas operações.
|
||||
|
||||
**Estado final desta instrução:** relatório e plano entregues para decisão. Nenhuma implementação F2, migração, instalação, publicação, envio de notificações ou modificação da implementação F1.
|
||||
@@ -0,0 +1,406 @@
|
||||
{
|
||||
"candidate": "1f2990e4",
|
||||
"base": "e8408c27d9aeb17f534f62f18f80a28ba7f9aca5",
|
||||
"source_hashes_verified": 16,
|
||||
"all_source_hashes_match": true,
|
||||
"format_failures": 61,
|
||||
"intersection_with_delta": [],
|
||||
"files": [
|
||||
{
|
||||
"path": "resources/js/components/funding-classification.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "3e374d63957d23516f63ec33d998fb3ee4916ea9"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/institutional-source/source-text.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "ccd33aeeccd10943c5554e86260769b21dfeba08"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/password-input.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "db241de4c3be9d8d74a0419d82590abcc5224a7d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/sector-entry.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "b5e8fe12361b74548c693561ec89c89874e12c4c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/sector-resource-reference.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "bb70c7f472cbe76cfbc011b72f67e8ab2072feaf"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-form.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "0106bfeb859057ec1378c1359c7a27948264623d"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/simulation-irpc-annual.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "2fd2d3abdb853871404e0514994aff56da5b7600"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/structure-geography.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "afe54a3e0ab1d9ca98f35fad56592545ea746777"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/components/tempo-header-tools.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "2296e4b991549ab18ed0da687d49768f1f452a3b"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/investor-path-stage.ts",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "b6dbbb5ee40d1c481ca048d2e9a352abdf7a0329"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/lib/irpc-annual-settlement.ts",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "3b58a99385faa01eea4b026ae7d5eb5f8d91367c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/funding/assisted.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "63b7dcbd7a2a091aefffbb1fc3925857cc04e507"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/funding/manage.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "6490ca6043f09b7527f61a11228e5c4a8ecc15ae"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/funding/saved.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "3bf619018bcaf5a1962bb641ddb980f489edf855"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/investment/catalogue.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "c885b41365c6914252be49167f1e3c2b9085da77"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/investment/detail.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "e595cb0319b29815f645104d304fa5b87f7251fc"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/investor-path/index.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "bc15f514e831c2e329bd358473384b4ef9ccd46c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/investor-path/preparation.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "5f6cb04df23c179197675c0696bf03e219c76611"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/investor-path/show.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "f40fe349583d525be31849eba5c5c7c58839a362"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/management/demography-install.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "af8382e1b8befd567aac1559ad9bb3de8b1549d3"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/portal/fiscal-forms.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "47d87ceaf354cbc6e97ad0a3c4ff65301b6609fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/pages/portal/search.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "6f883e35602f5950bdcb021006b93196089d6b97"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/translation/page-translator.tsx",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "4915cdb7543a33aef7a264fd08705f25b6c0f9fb"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/translation/service.ts",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "d1b3d560e979e0c74c72f44e9dc3033715175563"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/translation/types.ts",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "20bd534d33df9cf0da6f5e7748654db256de510c"
|
||||
},
|
||||
{
|
||||
"path": "resources/js/translation/utils.ts",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "02c6c951cb35e9a5a47e6f8594ffcca983bf357e"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/cluster-editorial.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "1310822dc89c877975736dcb620779639ed0c089"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/dashboard-navigation-sections.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "b1a3b813b0111671de201467b6f6629ee3cd0f15"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/editorial-completion.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "dc95339e678225d78f08baf89af11498e3042fc6"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/editorial-dashboard-manifest.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "9b7a6cdb96a2c0db13a3145a0e1063db136446f5"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/editorial-dashboard-presentation.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "e85185fc9c2209190e4b573a137befc06bbbbb8b"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/editorial-edition.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "75d92ee70d40eb8be7d114a09cda82d802822ce3"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/education-review.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "a0aeed97d2ccd627539a5c1355c308306dbdebfe"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/fiscal-form-entry.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "42b4fe3d47851947239f7b39e71fd8975d12c891"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/funding-directory.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "e05f65d7fa44210bdfda4736de9ef46058c7ea89"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/global-search.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "d3c0a497d8b0ea3583763617516e472784e4f685"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/helpers/irpc-advance-period-case.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "e8385de35f3e13d63d28c10d70b1efbbebecb5f8"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/helpers/irpc-annual-noncivil-case.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "74b7f9880c96d59f7f3d35f5e7101c607d5bf967"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/helpers/irpc-investment-combination-case.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "9b2bba021e262d106490cc29e79a9da18b2a8834"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/investment-map-indicators.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "a11d8f5d9bbed0482a89d4a426bfaca94b4690a7"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/investment-preparation.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "4cd35911219d328e13ba9bcf095f11d63946dd23"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-advance-cashflow-ui.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "b47230bbd3498f7288397e7bcab116d0fb583b9d"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-advance-cashflow.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "51c2f99adbba5f5a3f94ad3e3b902d2064ab20a1"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-advance-period-ui.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "8e1cafbf2e9f7c62b419bba742500e4dde7d7e84"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-advance-period.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "4fd734c733b2f884e20d4edb9e91f43c95c828a9"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-annual-noncivil-ui.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "885639717a93666e243d0af3b4f9975cb051f0ce"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-annual-noncivil.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "c0012e03e3867ac1fc2c217afefc4720764858d1"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-investment-carry-combination.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "1774ca235fd64004a338d3511908b14bdc6bf04c"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-pec-correction.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "f217d14a6c84b138f5d2bf8a949a33e687ed3238"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-pec-last-amount.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "04a7f04db9c5fc0e2144e836a3ac8f86355d694e"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-pec-obligation-ui.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "ad47038dc1ec59810d696c5a5b415e6d1a9a8d6e"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-pec-obligation.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "8de11aca758302c4a787072ac2c39f19607e8a11"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/irpc-ppc-obligation-ui.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "c79141c29606d971e92e0c3b4eba0c7519f68c9b"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/licensing-stage.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "f5e766a316a228ac49ab68f15c381aaa28c7626e"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/navigation-sidebar-render.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "88902b79c45bac318e42fab131012a105eb061e8"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/opportunity-curation.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "b51e8e2dfe1bf9719a2ccb5a5fb6ab9462cff738"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/opportunity-information.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "a0709afde688ff78be46b701fd47d4fa1d63cad3"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/portal-institutional-contact.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "ce5b5b85ead3413384d763944a61389629c66c44"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/portal-navigation.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "852c54a906588a837682051d8a6cfe74dbd99b30"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/portal-six-group-menu.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "1b11d6ad60aad6d208510d1762b2fdbda370066b"
|
||||
},
|
||||
{
|
||||
"path": "tests/frontend/sector-resource-reference.test.mjs",
|
||||
"outside_delta": true,
|
||||
"same_git_blob_as_base": true,
|
||||
"blob": "43ecde597a603df52034527fbfa67e6fe838d1a3"
|
||||
}
|
||||
],
|
||||
"visual": {
|
||||
"browser_connector": "The browser access host is unavailable",
|
||||
"native_capture": "Direct3D surface to SoftwareBitmap failed; GPU device suspended; 0x887A0005",
|
||||
"completed": false,
|
||||
"sessions_or_browser_settings_changed": false
|
||||
},
|
||||
"receipt_log_matches": true,
|
||||
"accepted_results": {
|
||||
"regression": {
|
||||
"tests": 35,
|
||||
"assertions": 548,
|
||||
"evidence": "accepted receipt, not rerun"
|
||||
},
|
||||
"focused": {
|
||||
"tests": 16,
|
||||
"assertions": 172,
|
||||
"evidence": "raw log equals accepted receipt"
|
||||
},
|
||||
"html_portability": {
|
||||
"tests": 1,
|
||||
"assertions": 10,
|
||||
"evidence": "accepted receipt, not rerun"
|
||||
},
|
||||
"overlapping_runs_not_summed": true
|
||||
},
|
||||
"product_files_unchanged": true,
|
||||
"phase2_implemented": false,
|
||||
"installations_performed": false,
|
||||
"database_writes": false,
|
||||
"report": "docs/investmoz/v2/auditoria-portal/ofertas-fase1-encerramento-fase2-plano-20261114.md"
|
||||
}
|
||||
Reference in New Issue
Block a user