100 lines
10 KiB
Python
100 lines
10 KiB
Python
"""Supplement the existing audit documents and a capability map, without a second audit matrix."""
|
||
from pathlib import Path
|
||
import json
|
||
import re
|
||
|
||
root = Path(__file__).resolve().parent.parent
|
||
docs = root / 'docs/investmoz/v2/auditoria-portal'
|
||
private = root / 'storage/app/private/investmoz-v2/portal-audit'
|
||
source = json.loads((private / 'assistant-source-full.json').read_text(encoding='utf-8'))
|
||
runtime = json.loads((private / 'investor-consolidation-runtime.json').read_text(encoding='utf-8'))
|
||
proposal = docs / 'proposta-consolidacao-percurso.md'
|
||
text = proposal.read_text(encoding='utf-8').replace('Emóvel', 'Em móvel')
|
||
for number in range(22, 41):
|
||
text = text.replace('§' + str(number) + ' /', 'P' + str(number) + ' /')
|
||
proposal.write_text(text, encoding='utf-8')
|
||
paragraphs = {p['paragraph']: p['text'] for p in source['parts'][0]['paragraphs']}
|
||
stages = []
|
||
for line in text.splitlines():
|
||
if not line.startswith('|'):
|
||
continue
|
||
cells = [x.strip() for x in line.strip().strip('|').split('|')]
|
||
if len(cells) != 5:
|
||
continue
|
||
code = re.search(r'\bS(\d{2})\b', cells[0])
|
||
paragraph = re.search(r'P(\d+)\s*/', cells[1])
|
||
if not code or not paragraph:
|
||
continue
|
||
number = int(code.group(1))
|
||
stages.append({'stage_id': 'S' + code.group(1), 'phase': 1 if number <= 4 else 2 if number <= 7 else 3 if number <= 11 else 4 if number <= 15 else 5,
|
||
'source': {'sha256': source['sha256'], 'part': 'word/document.xml', 'paragraph': int(paragraph.group(1)), 'text': paragraphs[int(paragraph.group(1))]},
|
||
'diagram_mapping': cells[1].split('/', 1)[1].strip(), 'capabilities': cells[2], 'applicability_dependencies_result': cells[3],
|
||
'audit_requirement_refs': cells[4], 'proposed': True, 'runtime_definition_prepared': True, 'integrated_ui_demonstrated': False})
|
||
assert [s['stage_id'] for s in stages] == ['S%02d' % i for i in range(1, 20)]
|
||
assert [s['source']['paragraph'] for s in stages] == list(range(22, 41))
|
||
mapping = {'kind': 'capability_map_not_a_parallel_requirement_matrix', 'source_sha256': source['sha256'], 'runtime_read_only_capture': runtime['captured_at'],
|
||
'stage_count': 19, 'phase_count': 5, 'structural_implementation_approved': True, 'active_writes': 0, 'stages': stages,
|
||
'qa_scenarios': {'A': {'land_needed': False, 'external_funding_needed': False, 'status': 'api_persistence_demonstrated_integrated_ui_pending'},
|
||
'B': {'land_needed': True, 'external_funding_needed': True, 'status': 'api_persistence_demonstrated_integrated_ui_pending'}}}
|
||
(docs / 'proposta-percurso-19-etapas.json').write_text(json.dumps(mapping, indent=2, ensure_ascii=False), encoding='utf-8')
|
||
|
||
updates = {
|
||
'relatorio-executivo.md': '''## Consolidação do percurso — aprovação QA e execução parcial
|
||
|
||
O estado atual inclui a [proposta fundamentada](proposta-consolidacao-percurso.md), baseada na leitura integral do DOCX solicitado e do seu fluxograma: cinco fases e 19 etapas, vinculadas aos IDs da mesma matriz. O texto tem 19 etapas; a imagem tem 17 blocos numerados e decisões separadas. Os roteiros E0–E11, sete grupos de orientação e outro roteiro com 14 atividades permanecem identificados por versão.
|
||
|
||
PostgreSQL/PostGIS e CRM externo desativado foram confirmados por leitura efetiva. O complemento não reinicia inventário: acrescenta um original e um anexo, ficando 525 ficheiros + 61 anexos = 586 registos. A matriz conserva 3.354 requisitos/linhas e 5.830 linhas de origem; estados não mudam por proposta. Os 381 testes/5.046 asserções do lote 3 abaixo são históricos desse lote; a nova regressão fica em consolidation-regression.log/XML.
|
||
|
||
C24: corrigido o encaminhamento do dossier para o draft específico do simulador, sem partilha de dados pessoais ou permissão do gestor. Regressão red→green: 16 testes de orientação/285 asserções; UI pendente. Execução I1–I3 aprovada em QA. Código/modelo/motor preparados e API/persistência A/B demonstradas; aceitação na interface ainda pendente. A extensão foi instalada apenas na cópia QA restaurada, sem conversão de roteiros anteriores. Ver execucao-percurso-i1-i3.md; a aprovação não autoriza a base ativa. Nenhuma escrita ativa.
|
||
|
||
''',
|
||
'backlog.md': '''## Prioridades organizadas em torno do percurso do investidor
|
||
|
||
Consultar a [proposta de consolidação](proposta-consolidacao-percurso.md) e a correspondência das 19 etapas aos IDs da matriz. Execução QA aprovada; código e API/persistência preparados, aceitação visual pendente.
|
||
|
||
1. **I0/P0–P1, já autorizado:** falhas de ações/recuperação, países/origem por formulário, cartografia por consumidor e contexto correto; C24 corrigido em QA, visual pendente. Nenhuma dependência de aprovação da consolidação para estes reparos.
|
||
2. **I1, QA autorizada e parcial:** painel composto com projeto atual, etapas, pendências/documentos/resultados e próxima ação. Preservar URLs e funções da gestão. Aceitação: UI completa e autorização por origem.
|
||
3. **I2, QA autorizada e parcial:** dados mestres e prefill consentido, resultados/contexto por ID/versão, nova sessão e alternância A/B sem contaminação. Aceitação inclui conflitos e ausência de sobrescrita; C25 permite rascunhos independentes por dossier; API/persistência demonstradas, interface pendente.
|
||
4. **I3, QA autorizada e parcial:** definição configurável/versionada das 19 etapas, aplicabilidade triestado, dependências por ação e estados separados. Reutilizar QuestionnaireVersion, investor_journeys/journey_steps, tasks e eventos. A/B completos na interface são condição de fecho; migration nova executada exclusivamente na cópia QA; nenhuma migration ativa.
|
||
5. **I4:** licenças/terra/financiamento/execução e monitoria conforme evidências e âmbito, sem integrações externas obrigatórias. Workflow e contratos especializados mantidos. Educação permanece depois das falhas prioritárias, sem nova jornada iniciada.
|
||
|
||
Ativação de recursos/cartografia continua separada; não inclui automaticamente o futuro motor. Backup/compatibilidade/rollback deverão ser renovados após alterações estruturais. As quatro decisões humanas anteriores e a aceitação oficial permanecem preservadas.
|
||
|
||
''',
|
||
'plano-ativacao.md': '''## Limite do plano face à consolidação proposta
|
||
|
||
Este plano cobre os recursos e importação identificados na auditoria; **não autoriza a ativação do painel/modelo/motor das 19 etapas na base ativa**. A [proposta](proposta-consolidacao-percurso.md) recebeu aprovação expressa de I1–I3 somente em QA. Código/API/persistência e interface devem manter estados separados. I0, correções existentes, continua autorizado.
|
||
|
||
A alteração pontual C24 reutiliza uma URL de draft já existente e não instala schema. Cenários A/B não foram demonstrados. Depois de qualquer mudança estrutural aprovada, preparar preview de migrations/contagens/órfãos, preservar snapshots e renovar backup/restauro/compatibilidade antes do ato autenticado. Reversão pós-uso nunca apaga decisões, vínculos, consentimentos, documentos ou auditoria.
|
||
|
||
'''
|
||
}
|
||
for name, addition in updates.items():
|
||
file = docs / name
|
||
content = file.read_text(encoding='utf-8')
|
||
marker = '## Consolidação do percurso — aprovação QA e execução parcial' if name == 'relatorio-executivo.md' else '## Prioridades organizadas em torno do percurso do investidor' if name == 'backlog.md' else '## Limite do plano face à consolidação proposta'
|
||
if marker not in content:
|
||
title, rest = content.split('\n', 1)
|
||
file.write_text(title + '\n\n' + addition + rest.lstrip(), encoding='utf-8')
|
||
|
||
case = '''
|
||
## C24 — orientação abre o simulador sem identificar o draft ligado — P1
|
||
|
||
Passos anteriores: criar dossier ligado a um draft do dono; consultar orientação; abrir ação financeira/plano quando a conta tem outro draft corrente. Esperado: recuperar exatamente a origem associada, preservando dono/versão. Observado na reprodução de servidor: href genérico /simulador-fiscal, apesar de existir simulation_id autorizado; destino pode escolher outro draft corrente. Causa: InvestorGuidance::view descartava o identificador na ação; SimulationForm já suporta ?draft=ID e API por ID.
|
||
|
||
Correção pontual: actions.simulator, actions.plan e recomendação financeira usam ?draft=ID somente se context confirmou disponibilidade/autorização; gestor permanece sem leitura do draft privado. QA: teste primeiro falhou no href genérico; depois 16 testes de orientação/285 asserções passaram, incluindo duas origens do mesmo dono, recuperação específica e gestor 404. Provas: consolidation-context-red.log, consolidation-context-green.log/XML. Link preparado e API/persistência demonstrados; clique/resultado visual pendentes. Nenhuma mudança de navegação/modelo/motor estrutural ou escrita ativa.
|
||
'''
|
||
file = docs / 'casos-reproducao.md'
|
||
if '## C24 ' not in file.read_text(encoding='utf-8'):
|
||
file.write_text(file.read_text(encoding='utf-8') + case, encoding='utf-8')
|
||
notice = '''
|
||
## Execução I1–I3 autorizada em QA
|
||
|
||
Foi lido integralmente o documento de assistente por etapas. A [proposta](auditoria-portal/proposta-consolidacao-percurso.md) organiza cinco fases/19 etapas e cenários A/B, com dados mestres, estados/permissões, reutilização, compatibilidade e reversão. I1–I3 têm execução QA aprovada; modelo/motor/rotas preparados atrás de flag, API/persistência A/B demonstradas e aceitação visual pendente. Nenhuma escrita ativa. Correções anteriores de países/cartografia permanecem em I0. C24 corrige somente o link para o draft associado, demonstrado em API/QA e ainda sem clique visual. A proposta complementa a mesma matriz, não a substitui.
|
||
'''
|
||
for name in ['gestao-oportunidades-dashboard.md', 'backlog-mestre.md']:
|
||
file = docs.parent / name
|
||
if '## Execução I1–I3 autorizada em QA' not in file.read_text(encoding='utf-8'):
|
||
file.write_text(file.read_text(encoding='utf-8') + notice, encoding='utf-8')
|
||
print(json.dumps({'stages': len(stages), 'phases': 5, 'parallel_matrix': False, 'structural_changes_qa': True, 'qa_scenarios_demonstrated': False}))
|