118 lines
14 KiB
Python
118 lines
14 KiB
Python
"""Document a narrowly scoped user confirmation and sector preparation in the existing audit."""
|
|
import collections
|
|
import csv
|
|
import hashlib
|
|
import json
|
|
import re
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
DOC = ROOT / 'docs/investmoz/v2/auditoria-portal'
|
|
OUT = ROOT / 'storage/app/private/investmoz-v2/portal-audit/legacy-sector-reconciliation-20261010'
|
|
csv.field_size_limit(5_000_000)
|
|
r = json.loads((OUT / 'reconciliation.json').read_text(encoding='utf-8'))
|
|
preview = json.loads((OUT / 'import-preview.json').read_text(encoding='utf-8'))
|
|
content = json.loads((OUT / 'content-check-after.json').read_text(encoding='utf-8'))
|
|
assert preview['exit_code'] == 0 and preview['transaction_read_only'] and preview['preview_items'] == 22
|
|
assert content['result'] == 'passed' and not content['database_access'] and not content['interface_accepted']
|
|
|
|
|
|
def section(filename, marker, value):
|
|
file = DOC / filename
|
|
text = file.read_text(encoding='utf-8')
|
|
text = re.sub(r'\n*<!-- ' + marker + r':begin -->.*?<!-- ' + marker + r':end -->\n*', '\n\n', text, flags=re.S)
|
|
first, rest = text.split('\n', 1)
|
|
file.write_text(first + '\n\n<!-- ' + marker + ':begin -->\n' + value.strip() + '\n<!-- ' + marker + ':end -->\n\n' + rest.lstrip(), encoding='utf-8')
|
|
|
|
|
|
manual = '''## Confirmação manual recebida do responsável — 10/10/2026
|
|
|
|
Confirmado nesta conversa: **leitura pública → autenticação → criar/escolher dossier → guardar referência → nova sessão → recuperar dossier e abrir artigo**. Conta, perfil, dispositivo e hora de execução não foram indicados; não os presumir. “Criar/escolher” conserva o relato do responsável, sem declarar que ambas as alternativas foram ensaiadas separadamente.
|
|
|
|
| Critério confirmado manualmente | Correspondência na matriz existente |
|
|
| --- | --- |
|
|
| Leitura pública e autenticação ao entrar no percurso privado | AUD-LEG-03 e AUD-LEG-04 |
|
|
| Criar/escolher dossier e guardar referência | AUD-LEG-03, AUD-LEG-06; gravação/consumidor em AUD-LEG-07 |
|
|
| Nova sessão, recuperação do dossier e abertura do artigo | AUD-LEG-03, AUD-LEG-06 e AUD-LEG-07 |
|
|
|
|
Só estes subcritérios receberam a confirmação manual. Nenhum estado global foi alterado, nenhuma API/persistência recebeu prova técnica adicional por inferência e nenhuma linha foi acrescentada à matriz. O relato manual fica separado das provas Chromium/API/READ ONLY anteriores.
|
|
|
|
**Continuam pendentes:** ensaios manuais móveis, acessibilidade, outros perfis e cobertura integral do legado. As observações automáticas anteriores de viewport/teclado/QA23 ficam preservadas como provas limitadas; não constituem essas aceitações manuais. C37 da conta18 e os cenários A/B completos não foram encerrados. A demonstração não renova backup/restauro nem resolve C71.
|
|
'''
|
|
rows = []
|
|
for s in r['sector_summaries']:
|
|
desc = {
|
|
'energia-mineracao': 'Índice com ligações explícitas a Energia172679 e Mineração172674; preservar as três identidades e os setores existentes2/8/7.',
|
|
'turismo': 'Artigo setorial e 11 artigos territoriais explicitamente ligados; categoria Turismo preservada, sem inferir geometrias.',
|
|
'infraestruturas': 'Artigo integral; C72 removia um título h1. Normalização h1→h2 preparada e conferida sobre o original.',
|
|
'mercado-financeiro': 'Corpo vazio no exemplar atual. Arquivar metadados/original; não inventar texto nem substituir por Fintech.'
|
|
}[s['slug']]
|
|
rows.append(f"| [{s['title']}]({s['url']}) | {s['legacy_id']} / setor QA{s['master_sector']['id']} (`{s['master_sector']['slug']}`) | {desc} |")
|
|
sectors = '''## Reconciliação dos quatro restantes setores — preparação, sem importação
|
|
|
|
As 92 entradas do inventário existente foram conferidas antes da seleção. Os quatro artigos de entrada foram novamente recolhidos por leitura anónima: HTTP200 e corpo/data de modificação iguais ao exemplar inicial. Os artigos descendentes e imagens usam os snapshots já inventariados, com hash conferido. Sitemap misto, paginação e restante acervo continuam abertos.
|
|
|
|
| Fonte legada | Identidade e cadastro existente | Conteúdo e lacuna concreta |
|
|
| --- | --- | --- |
|
|
''' + '\n'.join(rows) + '''
|
|
|
|
**Lote privado preparado: 17 versões de artigos + 5 imagens = 22 documentos.** Inclui quatro entradas setoriais, dois artigos de Energia/Mineração e 11 artigos territoriais de Turismo. A imagem de fundo genérica é um único exemplar por bytes, referenciado por vários artigos; não representa a fotografia de cada território. URLs com/sem barra são conservados como aliases do mesmo ID/versão/hash. Autoria, publicação, alteração, classificação original e HTML ficam preservados.
|
|
|
|
Os setores foram confrontados com a preservação READ ONLY da QA de10/10/2026 às14:54:19UTC, não com a base ativa. Correspondência2/3/4/6 para as entradas setoriais;8/7 para Energia/Mineração. Nenhum setor, identidade, artigo ou oportunidade foi criado na base. Alterações do corpo com a mesma identidade/versão deverão gerar conflito, não substituição silenciosa.
|
|
|
|
**Prévia real do importador existente:** 22 candidatos, zero duplicados por bytes e zero conflitos de identidade encontrados; transação READ ONLY no alvo `desk_restore_20261009_174726_test:55441`. CLI guardado, sem `--apply`, sem contas ou privilégios escolhidos. Não é aplicação/publicação autenticada. Nenhum scan novo foi executado ou declarado limpo; os scans do piloto não se estendem a este lote. C71 impede a aplicação enquanto faltar integridade/backup/restauro QA.
|
|
|
|
Reutilização concreta: biblioteca `documents`/`portal_resources`, importador `documents:import-batch`, verificador de binários, `portal_resource_links`, `LegacyContent`, controlador e componente `portal/legacy`, referências cifradas/eventos do dossier. Rotas de leitura/entrada, identidade do artigo e rótulos do componente ainda estão fixos em agronegócio: parametrizar esses pontos antes de disponibilizar outras páginas. As URLs legadas não são rotas QA disponíveis por estarem nesta tabela. Não criar um cadastro de conteúdo paralelo.
|
|
|
|
**C72 — código preparado:** o sanitizador removia o texto do h1 interno de Infraestruturas. A correção transforma-o em h2 e aplica a limpeza normal dos seus filhos/atributos. Os 17 originais conservaram hash; transformação e remoção de markup ativo verificadas sem bootstrap de aplicação ou acesso à base. Resultado não equivale a apresentação ou percurso dos novos setores demonstrado em QA.
|
|
|
|
Próximo incremento, após recuperar C71: prévia renovada no alvo e aplicação como rascunhos privados → ClamD por ficheiro → metadados/relações por citação e divulgação separada → parametrizar adaptador/componente e URLs preservadas → ensaios públicos e de dossier por setor. Mercado Financeiro mantém corpo vazio visível/identificado até existir conteúdo real; a consulta/cadastro do exemplar não exige uma relação a módulo/regra. Nenhuma importação ativa ou cálculo fiscal é habilitado.
|
|
|
|
Provas privadas: `legacy-sector-reconciliation-20261010/reconciliation.json`, `import-preview.json`, `content-check-before.json`, `content-check-after.json`; manifesto de staging `legacy-setores-20261010/manifest.json`. Inventários únicos atualizados: `legado-inventario.csv` e `legado-conteudos-reconciliados.csv`. Permanecem92 URLs/50 versões de artigos;22 entradas reconciliadas e17 versões preparadas neste incremento, sem omitir as restantes.
|
|
'''
|
|
section('legado-piloto-qa.md', 'legacy-manual-sectors-20261010', manual + '\n' + sectors)
|
|
short = '''## Confirmação manual e reconciliação setorial — 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. AUD-LEG-03/04/06/07 receberam apenas os subcritérios correspondentes; estados e contagens da matriz inalterados. Conta/perfil/dispositivo não indicados. Móvel, acessibilidade, outros perfis, cobertura integral, C37/QA18 e A/B continuam pendentes.
|
|
|
|
Quatro setores reconciliados: Energia & Mineração (índice + dois artigos), Turismo (artigo +11 referências territoriais), Infraestruturas (título corrigido em código) e Mercado Financeiro (corpo vazio preservado). **17 artigos +5 imagens** preparados; prévia CLI em transação READ ONLY:22 candidatos,0 duplicados,0 conflitos; nenhuma aplicação/scan/publicação nova. C72 corrigido na transformação dos originais, sem prova visual dos novos setores. C71 continua P0: recuperar integridade/backup/restauro antes de aplicação QA. Biblioteca/entidades/componentes existentes reutilizados; rotas dos restantes setores ainda por parametrizar. Ver `legado-piloto-qa.md` e inventários existentes.
|
|
'''
|
|
section('relatorio-executivo.md', 'legacy-manual-sectors-20261010', short)
|
|
section('backlog.md', 'legacy-manual-sectors-20261010', short + '''
|
|
|
|
| Prioridade | Próxima ação | Aceitação exigida |
|
|
| --- | --- | --- |
|
|
| P0 / C71 | Recuperar cluster QA preservando dados e renovar backup/restauro. | Conteúdos/schema/sequências/ficheiros conferidos; guarda, chave e percursos recuperados. |
|
|
| P1 / LEG01/05/06/07 | Renovar prévia dos22 exemplares, importar como rascunhos privados após C71, scan e parametrizar leitura/contexto por identidade. | Sem duplicações; fontes/URLs preservadas; publicação separada; origem/referência recuperadas por setor. |
|
|
| P1 / LEG02/07 / C72 | Verificar o título preservado de Infraestruturas na página real após importação. | Conteúdo integral legível; original/hash imutáveis; markup ativo removido. Verificação de transformação já passada. |
|
|
| P1 / Mercado Financeiro | Manter corpo vazio identificado e procurar no acervo um exemplar/conteúdo real. | Sem conteúdo inventado ou Fintech usado como substituto silencioso. |
|
|
| P1 / aceitação pendente | Ensaios móveis, acessibilidade e outros perfis, C37/QA18, A/B e restante acervo. | Evidência própria por percurso/perfil; relato manual do piloto não os encerra. |
|
|
''')
|
|
section('casos-reproducao.md', 'legacy-sector-heading-20261010', '''## C72 — título original removido na projeção de Infraestruturas
|
|
|
|
**Requisitos:** AUD-LEG-02/07; P1 na expansão. **Reprodução:** aplicar `LegacyContent::sanitize()` ao HTML original do post171992, através de `tools/legacy-sector-content-check.php before`. **Esperado:** título “2. Sectores Prioritários de Investimento” preservado sem introduzir segundo h1 de página. **Observado:** título ausente; os restantes16 exemplares do lote não apresentavam essa perda. **Causa:** lista de apresentação não admitia h1 e removia o elemento com todos os filhos. **Correção preparada:** normalizar h1 interno para h2 e manter limpeza de atributos/filhos. **Prova:** verificação after sobre17 originais, hashes preservados, título presente e markup ativo removido; nenhum acesso à base. **Pendente:** importar o exemplar privado depois de C71, divulgar separadamente e demonstrar a página real. Não atualizar outros critérios da matriz com esta prova de transformação, nem declarar o setor publicado. C37/QA18 continua independente.
|
|
''')
|
|
section('plano-ativacao.md', 'legacy-manual-sectors-20261010', '''## Complemento após confirmação manual — preparação QA
|
|
|
|
O relato manual do piloto confirma somente a sequência registada em AUD-LEG-03/04/06/07. C37/QA18, A/B, outros perfis, móvel/acessibilidade e cobertura integral permanecem pendentes. C71 continua a impedir novas aplicações QA e a fixação de candidata.
|
|
|
|
O lote seguinte tem previsão de **17 artigos +5 imagens**, biblioteca existente e zero oportunidades/territórios/contas criados. A prévia READ ONLY encontrou22 candidatos novos; reconfirmar contagens/identidades no alvo após recuperação. Arquivo do exemplar vazio de Mercado Financeiro não significa artigo educativo completo. Relações do Turismo são textuais/editoriais; não importam geometrias.
|
|
|
|
Sequência global030000 →040000 →09/190000 preservada, sem repetir instalações. Após recuperar QA: aplicação privada/scan, parametrização dos consumidores e divulgação separada; depois ensaios específicos. Ativação futura requer revisão candidata, prova da base ativa por leitura e backup/restauro próprio, além da autorização separada. Reversão conserva originais, versões, referências e eventos; retirar divulgação/desabilitar disponibilização não elimina fontes dos dossiers. Nenhuma aplicação ativa nesta frente.
|
|
''')
|
|
|
|
# Prepare source-inventory metadata; its CSV is authored by the same JS pipeline.
|
|
sources_path = DOC / 'inventario-fontes.csv'
|
|
sources = list(csv.DictReader(sources_path.open(encoding='utf-8-sig', newline='')))
|
|
for name in ['legado-piloto-qa.md', 'legado-inventario.csv', 'legado-conteudos-reconciliados.csv']:
|
|
file = DOC / name
|
|
data = file.read_bytes()
|
|
row = next(row for row in sources if row['Exemplar/caminho'].replace('\\', '/').endswith('/' + name))
|
|
old, new = row['SHA256'], hashlib.sha256(data).hexdigest()
|
|
if old != new:
|
|
row['Edição/versão identificada'] += ' | exemplar anterior SHA256=' + old
|
|
row.update({'SHA256': new, 'Bytes': str(len(data)), 'Nota de leitura': 'Confirmação manual limitada e reconciliação dos quatro setores;22 candidatos privados, sem importação/publicação; C71/C37/A-B/móvel/acessibilidade/outros perfis preservados.'})
|
|
(OUT / 'source-inventory-updates.json').write_text(json.dumps(sources, ensure_ascii=False), encoding='utf-8')
|
|
(OUT / 'csv-source-baseline.json').write_text(json.dumps({'inventario-fontes.csv': list(csv.reader(sources_path.open(encoding='utf-8-sig', newline='')))}, ensure_ascii=False), encoding='utf-8')
|
|
print(json.dumps({'manual_confirmed_requirements': ['AUD-LEG-03', 'AUD-LEG-04', 'AUD-LEG-06', 'AUD-LEG-07'], 'statuses_changed': 0, 'database_writes': 0, 'sectors_reconciled': 4, 'new_imports': 0}))
|