Files
Investidor-V2/tools/portal-audit-delivery-lote3.py
T
nala 6ddafc95ba
tests / ci (push) Canceled after 0s
oportunidades 4
2026-10-10 07:03:59 +02:00

203 lines
25 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Reconcile current evidence into the existing documents, preserving history."""
from pathlib import Path
import csv
import json
import xml.etree.ElementTree as ET
from collections import Counter
root = Path(__file__).resolve().parent.parent
docs = root / 'docs/investmoz/v2/auditoria-portal'
d = root / 'storage/app/private/investmoz-v2/portal-audit'
tests = json.loads((d / 'phpunit-final.json').read_text(encoding='utf-8'))
activation = json.loads((d / 'activation-evidence.json').read_text(encoding='utf-8'))
compatibility = json.loads((d.parent / 'opportunity-resources-compatibility.json').read_text(encoding='utf-8'))
preview = json.loads((d / 'resources-lote3-preview.json').read_text(encoding='utf-16').lstrip('\ufeff'))
cases = list(ET.parse(d / 'phpunit-lote3-final.xml').iter('testcase'))
selected = ['CrmIntakeTest', 'InvestmentTerritoryTest', 'LandAssistanceTest', 'OpportunityResourcesTest', 'PartnershipExchangeTest', 'PortalAuditConsumerLotTest', 'PortalAuditContinuationTest', 'PortalAuditNextLotTest', 'TerritorialRegistryTest']
with (docs / 'acoes-perfis-lote3.csv').open('w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Classe', 'Percurso/caso automatizado', 'Asserções', 'Resultado QA', 'UI observada', 'Disponibilidade ativa demonstrada'])
for case in cases:
name = case.attrib.get('class', case.attrib.get('classname', ''))
if name.rsplit('\\', 1)[-1] in selected:
writer.writerow([name, case.attrib['name'], case.attrib.get('assertions', ''), 'passou' if len(case) == 0 else 'ver XML', 'não', 'não'])
report = '''# InvesteMoz — relatório executivo do lote 3
09/10/2026. Continuação da mesma matriz, sem novas jornadas educativas. Código preparado e API/persistência demonstradas em QA; nenhuma escrita ativa pela auditoria. Resultados visuais e anexação direta de PDFs continuam pendentes.
## Lote executado
- **AUD-COUNTRY-04 / AUD-DESK-01, C21:** os três serviços existentes do Balcão têm agora país do requerente separado da origem da solicitação. Ambos guardam no payload cifrado existente e recuperam via GET/Inertia; catálogo de249 países. ZZ recebe422 sem nova versão. Submissão recuperável; dono não analisa o próprio pedido, outra conta não consulta, gestor devolve os campos explicitamente permitidos. Corrigida a rejeição da origem na lista de campos devolvidos para correção. Correção permitida guarda versão5; alteração de título não autorizado422; versão antiga409. Definições/histórico dos serviços preservados, sem reinstalação.
- **AUD-GEO-02/03, C22:** consulta de contexto administrativo ligada ao seletor territorial partilhado, gestão territorial, draft/recursos de oportunidades, catálogo e painel de mapas. TerritoryGeometry usa geo_locations/geo_geometries existentes; não cria local de investimento, perímetro de zona ou ponto fictício. GeoJSON simplificado, origem/edição/hash e legenda administrativa independentes dos marcadores de investimento.
- **Geometrias reais:** na QA171209,361/361 limites importados recuperados pelo novo serviço; zero geometrias internas divulgadas publicamente. Teste HTTP separado demonstra autorização de gestor403 para outra conta, UUID inválido422, geometria arquivada retirada, edição2019 preservada. Localidade sem polígono próprio continua sem geometria própria mesmo tendo contexto ancestral. Nenhuma classificação/publicação ativa alterada.
- **AUD-UI-01:** ações de CRM, Bolsa, recursos, território, fundiário e Balcão passaram nos casos automatizados ligados em acoes-perfis-lote3.csv. Resultado de resposta/GET/Inertia/evento é prova de servidor, não de clique observado. Inventário atual363 botões/272 seletores e mapas não fecha todos os consumidores.
## Cobertura por formulário
| Formulário | País/origem | API, gravação e recuperação | Interface atual |
| --- | --- | --- | --- |
| Manifestação pública | Campos distintos | Provas de InterestOrigin/Continuation/Compatibility: payload, metadata, inválido e replay | Preparada; visual pendente |
| Apoio:4 tipos | País pertinente/origem opcional | Quatro percursos já ensaiados, recuperação/agregado | Preparada; visual pendente |
| Interesse público em negócio | País/origem distintos | Provas anteriores próprias, não confundidas com wizard | Visual/variações pendentes |
| Jornada | País/origem separados | Recuperação de jornada/solicitação | Visual pendente |
| Wizard de negócios | Catálogo249 e legado conservado | Cifra, GET, filtros autorizados, submetido no agregado; draft excluído | Visual/revisão completa pendentes |
| Assistência fundiária | Catálogo249/legado/origem | Grava/recupera, apoio mantém origem, filtros/agregado e hierarquia4 níveis | Visual/mapa/anexos pendentes |
| Balcão preparação | País/origem separados | Novo percurso completo servidor, incluindo devolução/correção autorizada | Visual pendente |
| Balcão alteração | País/origem separados | Mesmo ensaio individual com campos próprios do serviço | Visual pendente |
| Balcão acompanhamento | País/origem separados | Mesmo ensaio individual com campos próprios do serviço | Visual pendente |
| Simulador | Residência fiscal/países dos fundos; sem inferir origem de solicitação | Snapshots cifrados/GET, legado e inválido, sem cálculo por guardar | Demais campos/cálculos/visual pendentes |
| Gestor/CRM | Filtros de país/origem/unknown | Interests/desk/businesses separados; solicitações, não investidores únicos | URL/seleção/tabela visuais pendentes |
Campo opcional ausente permanece não informado. Não preencheu cadastros vazios nem converteu textos/valores históricos silenciosamente. Cobertura global continua parcial: alterações em componentes comuns não demonstram individualmente todos os formulários.
## Três estados territoriais independentes
1. **Território cadastrado:**1920 IDs administrativos públicos recuperados pela API, além do país; fonte workbook existente. Não representa campo preenchido.
2. **Geometria disponível:**361 limites internos QA,9 províncias/120 distritos/232 postos. Fonte INE/UNOCHA,edição07/06/2019, originais/hash/scan preservados e aceitação oficial mantida. Lacunas nominais continuam2 províncias/39 distritos/179 postos; sem polígonos de localidade nesse exemplar. Ativo:zero geometrias.
3. **Apresentação funcional:** endpoints e consumidores preparados, recuperação real361/361, sem divulgação pública. Mapa renderizado/zoom/seleção/filtro/feedback ainda não observados. Não fechar requisito por GeoJSON disponível. Zonas/perímetros e locais documentados de projetos/parcerias têm regras próprias; limite administrativo não os substitui.
## Navegador e documentação
C23: servidor QA18096 não escutava; foi iniciado e respondeu HTTP200 com header de destino _test:55441. O controlo de UI devolveu apps[]/browsers[] antes e depois de reset; Chrome e Edge responderam Browser is not available. Diagnóstico concreto: serviço QA recuperado, fornecedor de UI não registado nesta sessão. Causa subjacente do registo não foi demonstrada. Ligação de navegador solicitada, sem parar API/persistência. Não foram usadas capturas antigas como prova atual.
Não existe ferramenta de anexação nativa de PDF nesta sessão. Os links Adobe anteriores não funcionaram para o utilizador; logo os PDFs **não foram entregues como anexos diretos**, nem considerados revisão documental concluída. Este relatório/backlog mantêm-se no workspace e o conteúdo necessário à revisão é apresentado na conversa, sem novos links Adobe. PDFs do lote2 permanecem históricos.
## Provas, matriz e ativo
TESTS testes passaram, ASSERTIONS asserções, zero skips;156 frontend/reconciliação. TypeScript, PHPStan, build e formato passaram. Lint0 erros/11 avisos; npm check termina1 por avisos, não aprovação limpa. Novos2 testes/124 asserções mais regressão integral381. 360 GET por4 perfis, sem falhas registadas; não demonstra todos os botões/transições.
Mesma matriz:3354 requisitos/3354 linhas de dados+header;5830 linhas de origem preservadas, com referências adicionais ao pedido deste lote. Estados:5 concluídos no critério estreito,3198 parciais,146 não implementados,1 implementado não ativo,0 com falha no critério atualmente registado,4 decisões concretas. Parcial pode conter ações/campos ainda ausentes; zero com falha não significa portal sem falhas. Concluídos:OPS02/03,COUNTRY05,GEO04,STYLE01. Workflow,contratos especializados e decomposição semântica de cláusulas continuam no backlog.
Leitura ativa17:47:24UTC:288 tabelas; zero geometrias; Balcão/Bolsa/gestão básica com um evento de instalação cada. Recursos installed=false,ready=true; não repetidos. Fonte oficial aceite, importação não publica nem ativa cálculo.
Plano atual: código sem migration → recursos autenticados uma vez → importação cartográfica separada/privada → divulgação/camadas por ato explícito e prova por consumidor. Backup/restauro verificado BACKUPDATE, cópia COMPATDB:55441,288 tabelas/cinco ficheiros e reversão comparados. Hash HASH. Validade24h sujeita às guardas. ClamD só afeta scans/libertação binária; manutenção após reinício e GD/WebP web/derivadas pendentes.
Evidências: matriz-requisitos.csv, acoes-perfis-lote3.csv, casos C01–C23, phpunit-lote3-final.xml, geometry-consumers-lote3.json, resources-lote3-preview.json, activation-evidence.json. Dumps/configuração/chaves não são anexos.
'''
backlog = '''# InvesteMoz — backlog do lote 3
09/10/2026. Mesma matriz3354 requisitos/5830 origens; código/QA/ativo separados. Nenhuma nova jornada educativa iniciada.
## P0/P1 corrigidos em QA
**COUNTRY04/DESK01,C21:** país separado no Balcão; origem devolvida para correção já não recebe422 por whitelist incompleta. Três serviços: guardar cifrado → recuperar → submeter → gestor devolver campos permitidos → dono corrigir → versão5/GET; autorrevisão e outra conta403, campo não autorizado422, conflito409. Sem migração/reinstalação. Falta visual.
**GEO02/03,C22:** consulta/preview de limites administrativos em consumidores existentes, incluindo oportunidade draft/recursos e catálogo/painel.361 limites reais QA recuperados; zero divulgação interna pública; contexto ancestral não vira geometria própria da localidade. Sem novas relações/pontos/perímetros. Fonte/edição/hash preservados. Falta renderização e cobertura individual restante.
**UI01,C23:** serviço QA recuperado; HTTP200/_test:55441. Provider de UI continua ausente após reset/Chrome/Edge. Retomar cliques/capturas assim que a sessão de navegador for ligada. Causa de configuração não confirmada; não declarar recuperação visual concluída.
## Próximo lote executável
1. **Ações por perfil/consumidor: UI01,DASH01,DESK01/02,CRM01,BIZ01,LAND01,PART01.** Reutilizar controllers/services/versionamento/audit_events. Usar acoes-perfis-lote3.csv como índice de casos passados, não substituto da inspeção de todos os botões. Aceitação por ação: perfil autorizado/negado → resposta/erro visível → versão/evento/cifra quando aplicável → GET/nova sessão → resultado apresentado; conflito/inválido conserva dados. Escopo atual já inclui CRM6,território13,fundiário6,recursos4,Bolsa9 casos, mas falta cada consumidor/transição visual. Ensaios API avançam independentemente do browser. Anexos têm dependência ClamD/GD concreta.
2. **Países/origem/estatísticas: COUNTRY01–04/06–07,STATS01,SIM01.** Revisar variações condicionais/nova sessão/URL/unknown/todos e filtros por cada formulário da tabela do relatório. CountryCatalogue/CountrySelect/payloads cifrados existentes; sem inferir residência/nacionalidade/origem. Aceitação:249 opções/pesquisa, código conhecido, recuperação nome/código, texto histórico conservado, sem nova versão após inválido, conjuntos interests/desk/businesses reconciliados. Falta interface atual e comprovação por cada variação, sem ClamD.
3. **Seletores/mapas: GEO01–03/AUD-FIELD.** Em TerritoryFields, gestão territorial, drafts/recursos, catálogo/painel, testar filhos limpos ao trocar pai, paginação, seleção/recuperação, disponibilidade geométrica por perfil, edição/camada/legenda/zoom e ausência visível. Integrar consumidores restantes de estruturas, parcerias e zonas conforme seu contrato: contexto administrativo nunca autoriza perímetro ou localização de investimento. Usar geo_locations/geo_geometries existentes. Sem criar módulos/tabelas paralelos.
4. **Lacunas GIS:** resolver explicitamente2/39/179 correspondências não inequívocas e procurar exemplar oficial de localidades. Reconciliar Maputo/edições/nome/pai; não fuzzy-remapear ou assumir equivalência de códigos. Aceitação:original/hash/scan/correspondência única/validezSRID4326; replay zero duplicados, classificação e histórico preservados. Aceitação oficial já dada não é reaberta. Atividade/divulgação exige ato explícito, não importação.
5. **Ativação:** seguir plano consolidado separado. Código sem migration, extensão de recursos uma vez autenticada, cartografia em lote separado privado. Contagens previstas361=9+120+232 somente se baseline ativo ainda0 e sem conflitos; zero novos geo_locations, zero relações/pontos de oportunidade inferidos. Prévia/cartografia ativa ainda precisa do mecanismo autenticado correspondente: não adaptar o importador QA para apontar ao ativo. Backup/restauro/contagens/hash/rollback verificados antes do ato. Não repetir Balcão/Bolsa/gestão básica.
## Backlog preservado
**OP03/04/05:** workflow completo e contratos especializados; filtros/ficha pública conscientes da maturidade versionada, sem vazar draft nem reinterpretar legado. Mantidos abertos; não iniciados como jornadas novas neste lote.
**EDU02/03/01:** rascunho incompleto, jornadas/painéis educativos continuam depois das falhas prioritárias acima. Sem novas jornadas até seu fecho.
**LIB01/02,SIM02,GUIDE01:** acervo, regras/cálculos e orientação conforme critérios existentes; estados consulta/jurídico/cálculo independentes. Sem preenchimentos artificiais, parâmetros ausentes nunca zero/taxa recente.
**SCAN01:** ClamD real funciona e testes reais passaram; arranque após reinício/manutenção/GD web/scan de derivadas ainda pendentes por operação. Não bloquear países/estatísticas/seletores por isso.
**DOC01:** estados reconciliados, fontes/versões preservadas; revisão semântica de cláusulas ainda pendente. PDFs diretos não entregues por falta de ferramenta nativa; links Adobe falhados não contam como entrega.
Decisões humanas mantidas: pares de IDs oportunidade–projeto/cluster e citação/papel; entidade operadora/contactos/termos; responsável/links por serviço; pesos/limiares/baseline dos pilotos. Nenhuma revalidação genérica da fonte oficial aceite.
QA atual TESTS/ASSERTIONS,zero skips;156 frontend/reconciliação,TypeScript/PHPStan/build/formato passam,lint11 avisos. UI não observada. Installed=false,ready=true emPREVIEWDATE;backup BACKUPDATE/COMPATDB:55441/hashHASH. A preparação técnica não fecha ações/mapas/workflow nem é instalação.
'''
plan = '''# Plano consolidado de ativação — lote 3
09/10/2026. Três grupos separados, nenhuma instalação/importação ativa executada. Preview PREVIEWDATE: installed=false,ready=true. QA global TESTS testes/ASSERTIONS asserções/zero skips; visual pendente.
| Grupo | Ordem/efeito | Dependência e contagem prevista | Reversão |
| --- | --- | --- | --- |
| Correções de código/assets | Primeiro: país/origem/correção Balcão, consulta/preview de limites, maturidade draft/filtros já preparados | Sem migration; zero cadastros/relações/classificações reescritos; confirmar versão servida/assets e percursos | Reverter código compatível preservando novos payloads e versões, sem apagar campos novos |
| Recursos privados | Depois: ação autenticada existente /management/opportunity-resources-install, migration2026_10_09_030000_extend_opportunity_resources uma vez | Backup/prova/fingerprint; tabelas/recurso privado da extensão, zero publicação automática. Não repetir instalações básicas. ClamD só para binários; GD web/derivadas específicos | Up/down demonstrado antes de novos dados. Depois de uso, preservar/consolidar novas escritas; não executar down que apague versões/ficheiros |
| Importação cartográfica | Lote independente, preview/original/hash/scan/dedup/conflitos, escrita privada por mecanismo autenticado | Baseline ativo0:361=9+120+232 correspondências previstas; zero geo_locations novos, zero locais/pontos/perímetros de investimento.2/39/179 não importados. Fonte2019 não presume vigência atual | Identificar lote/origem/edição/IDs/eventos; arquivar/reverter apenas o lote novo não usado. Se houver novas relações/escritas, reconciliar antes de restaurar snapshot |
| Camadas/divulgação | Ato separado de importação, com âmbito/edição e acesso por consumidor | Publicar só geometrias autorizadas; fonte aceite não implica publicidade automática. Contexto administrativo não autoriza zona/implantação. UI atual ainda pendente | Retirar camada/autorização sem apagar original/hash/histórico; preservar relações legítimas |
Backup/restauro **BACKUPDATE**, destino ativo investemoz:5432, cópia compatível **COMPATDB:55441**.288 tabelas/cinco ficheiros iguais; reversão demonstrada. Fingerprint **HASH**. Validade24h; mudanças/expiração/destino exigem renovar provas pertinentes. Recursos ready=true não indica instalação nem aceitação funcional.
QA cartográfica preservada:desk_restore_20261009_171209_test:55441,361 limites internos, replay zero novos e consulta361/361 READ ONLY. Não é a cópia de compatibilidade dos recursos, não importar fixtures. O importador existente é deliberadamente QA-only. **Execução cartográfica ativa ainda precisa de preview/aplicação autenticados no mecanismo existente**; não há autorização para contornar essa condição com CLI ou converter o script QA em instalador ativo.
Antes do ato: verificar identidade/hash/validade/estado instalado e schema; preservar classificações IDs1–6, relações28/13, originais/histórico; obter contagens frescas para recusar duplicados/conflitos. Após cada ato, consultar migration/evento/autor/versão e comparar baseline. Dumps/.env/chaves privados. Nenhuma importação/publicação ativa cálculo fiscal.
Browser:QA18096 responde HTTP200/_test, mas provider de UI ausente; Chrome/Edge indisponíveis após reset. Não certificar resultado visual. Fluxos ativos de revisão/publicação e contratos especializados continuam no backlog; não criados pela instalação de recursos.
'''
def resolve(text):
replacements = {
'de249': 'de 249', 'recebe422': 'recebe 422', 'versão5': 'versão 5',
'autorizado422': 'autorizado 422', 'antiga409': 'antiga 409',
'QA171209': 'QA 171209', 'inválido422': 'inválido 422',
'gestor403': 'gestor 403', 'edição2019': 'edição 2019',
'atual363': 'atual 363', 'Apoio:4': 'Apoio: 4', 'Catálogo249': 'Catálogo 249',
'catálogo249': 'catálogo 249', 'hierarquia4': 'hierarquia 4',
':1920': ': 1920', ':361': ': 361', ',9 províncias': ', 9 províncias',
'Fonte INE/UNOCHA,edição07': 'Fonte INE/UNOCHA, edição 07',
'continuam2': 'continuam 2', 'ativo17:47:24UTC:288': 'ativo 17:47:24 UTC: 288',
'QA18096': 'QA 18096', 'servidor QA18096': 'servidor QA 18096',
'matriz:3354': 'matriz: 3354', 'matriz3354': 'matriz 3354',
';5830': '; 5830', 'Estados:5': 'Estados: 5', ',3198': ', 3198',
',146': ', 146', ',1 implementado': ', 1 implementado',
',0 com falha': ', 0 com falha', ',4 decisões': ', 4 decisões',
'TESTS testes': 'TESTS testes', ';156': '; 156', 'Novos2': 'Novos 2',
'Lint0': 'Lint 0', '/11 avisos': '/11 avisos', 'por4': 'por 4',
'.288': '. 288', 'Validade24h': 'Validade 24h',
'emPREVIEWDATE': 'em PREVIEWDATE', 'hashHASH': 'hash HASH',
'ativos0': 'ativos 0', 'ativo0': 'ativo 0', 'Fonte2019': 'Fonte 2019',
'investment.2': 'investment. 2', 'investimento.2': 'investimento. 2',
'CRM6,território13,fundiário6,recursos4,Bolsa9': 'CRM 6, território 13, fundiário 6, recursos 4, Bolsa 9',
'explicitamente2': 'explicitamente 2', 'validadeSRID4326': 'validade SRID 4326',
'validezSRID4326': 'validade SRID 4326', 'IDs1–6': 'IDs 1–6',
'relações28/13': 'relações 28/13', 'Balcão:país': 'Balcão: país',
'nos3': 'nos 3', 'ensaia3': 'ensaia 3', ':HTTP200': ': HTTP 200',
}
for before, after in replacements.items():
text = text.replace(before, after)
return text.replace('TESTS', str(tests['tests'])).replace('ASSERTIONS', str(tests['assertions'])).replace('BACKUPDATE', activation['verified_at']).replace('COMPATDB', compatibility['target']['database']).replace('HASH', activation['code_hash']).replace('PREVIEWDATE', preview['captured_at'])
for name, text in [('relatorio-executivo.md', report), ('backlog.md', backlog), ('plano-ativacao.md', plan)]:
file = docs / name
previous = file.read_text(encoding='utf-8')
marker = '## Histórico do lote 2 e anteriores — não representa o estado atual'
if marker in previous:
previous = previous.split(marker, 1)[1].lstrip()
file.write_text(resolve(text) + '\n' + marker + '\n\n' + previous, encoding='utf-8')
extra = '''
## C21 — Balcão sem país e sem devolução da origem para correção — P1
Reprodução anterior por código: country não autorizado em validateFields; declared_origin_country_code disponível no formulário, mas não admitido em editable_fields da devolução. Esperado: país e origem distintos, persistidos e correção explícita permitida por gestor. Observado: country sem campo/percurso e devolução da origem422. Causa: campos comuns não incluídos na whitelist de correção/país. Correção: campo separado e duas whitelists coerentes, sem alterar definição histórica do serviço. PortalAuditConsumerLotTest ensaia3 serviços, POST/PUT/GET, cifra, ZZ422, submissão, dono autorrevisão403, gestor devolve, título não autorizado422, country/origin corrigidos versão5, conflito409 e outra conta403. API/props/persistência demonstradas, visual pendente, ativo sem escrita.
## C22 — geometria importada sem percurso de consulta nos campos/mapas — P1
Reprodução por código/dados QA: geo_geometries tinha361 limites internos, consumidores partilhados só recuperavam nomes/IDs; mapas públicos exigiam geometrias publicadas/locais e não havia preview administrativo por perfil. Esperado: cadastro/geom disponível/contexto/apresentação separados, sem publicar para resolver UI. Correção: TerritoryGeometry, endpoints público/gestor e preview contextual com edição/legenda, preservando classificação. Prova real READ ONLY361/361 e zero divulgação pública; HTTP sintético testa gestor/outra conta/arquivamento/fallbacklocalidade. Integrações frontend preparadas, mapa renderizado ainda não observado.
## C23 — servidor QA parado e provider de UI indisponível — P1
Passos: verificar18096; getState, abrirChrome, reset, getState, abrirEdge. Antes:sem listener18096. Após iniciar servidor QA guardado:HTTP200/header _test:55441. Ainda observado:apps[]/browsers[];Browser is not available:chrome/edge após reset. Causa do servidor:processo QA não em execução; causa subjacente do provider não confirmada, apenas ausência de registo demonstrada. Ligação de navegador pedida ao utilizador. Interface permanece pendente; API/persistência continuam. Nenhum bypass de autenticação/controlo ou captura antiga usada.
'''
file = docs / 'casos-reproducao.md'
if '## C21 —' not in file.read_text(encoding='utf-8'):
file.write_text(file.read_text(encoding='utf-8') + extra, encoding='utf-8')
diagnosis = {'captured_at': preview['captured_at'], 'before': {'qa_18096_listening': False, 'apps': [], 'browsers': []},
'recovery': {'qa_http_status': 200, 'qa_target_guard': '_test:55441', 'ui_reset_attempted': True},
'after': {'chrome_error': 'Browser is not available: chrome', 'edge_error': 'Browser is not available: edge', 'apps': [], 'browsers': []},
'ui_available': False, 'root_cause_of_provider_registration_confirmed': False, 'direct_pdf_attachment_tool_available': False,
'new_adobe_links_supplied': False, 'visual_acceptance': False, 'active_writes': 0}
(d / 'browser-diagnosis-lote3.json').write_text(json.dumps(diagnosis, indent=2), encoding='utf-8')
notice = '\n## Estado de auditoria — lote 3, 09/10/2026\n\nBalcão:país/origem e devolução para correção demonstrados nos3 serviços; contexto administrativo ligado aos consumidores existentes e361 limites QA recuperados sem publicação.381 testes/5046 asserções/zero skips. QA HTTP recuperada; provider de UI indisponível e visual pendente. Recursos prontos,não instalados; cartografia ativa requer ato autenticado separado. Workflow/contratos mantidos no backlog; nenhuma jornada educativa nova. Prevalecem [relatório](auditoria-portal/relatorio-executivo.md),[backlog](auditoria-portal/backlog.md) e [plano](auditoria-portal/plano-ativacao.md) atuais sobre estados anteriores. PDFs diretos não anexados nesta sessão.\n'
for name in ['gestao-oportunidades-dashboard.md', 'backlog-mestre.md']:
file = docs.parent / name
if '## Estado de auditoria — lote 3' not in file.read_text(encoding='utf-8'):
file.write_text(file.read_text(encoding='utf-8') + notice, encoding='utf-8')
print(json.dumps({'current_requirements':3354, 'source_lines':5830, 'parallel_matrix':False, 'direct_pdf_attached':False}))