from pathlib import Path import csv, hashlib, json, collections csv.field_size_limit(20000000) ROOT=Path(__file__).resolve().parent.parent DOC=ROOT/'docs/investmoz/v2/auditoria-portal' OUT=ROOT/'outputs/investmoz-portal-stability-20261011' D=ROOT/'storage/app/private/investmoz-v2/portal-audit/portal-stability-finalize-20261011' packet=json.loads((D/'csv-edits.json').read_text(encoding='utf-8')) for edit in packet['files']: with (DOC/edit['filename']).open(encoding='utf-8-sig',newline='') as f:actual=list(csv.reader(f)) expected=[r[:] for r in edit['rows']] for patch in edit['patches']: for name,value in patch['values'].items():expected[patch['row']][expected[0].index(name)]=value assert actual==expected, 'Untargeted matrix/source cells changed' matrix=packet['files'][0] with (DOC/'matriz-requisitos.csv').open(encoding='utf-8-sig',newline='') as f:rows=list(csv.DictReader(f)) counts={'requirements':len(rows),'rows':len(rows),'source_occurrences':sum(int(r['Quantidade de linhas de origem']) for r in rows),'states':dict(collections.Counter(r['Estado'] for r in rows)),'changed_IDs':['AUD-COUNTRY-02','AUD-OPS-01'],'all_other_cells_preserved':True,'AB_C37_closed_states_preserved':True,'active_database_writes':0} assert counts['requirements']==3393 and counts['source_occurrences']==6845 (D/'preservation-proof.json').write_text(json.dumps(counts,ensure_ascii=False,indent=2),encoding='utf-8') rev=json.loads((OUT/'manifesto-candidata.json').read_text(encoding='utf-8'))['delivery_revision'][:12] begin='' end='' for file in [DOC/'relatorio-executivo.md',DOC/'backlog.md',DOC/'plano-ativacao.md',DOC/'execucao-percurso-i1-i3.md']: relative='../../../../outputs/investmoz-portal-stability-20261011/' block=f'''{begin} ## Estado atual — estabilização integrada QA, ativação suspensa **A instrução de suspensão substitui qualquer passo histórico para retomar a ativação. COUNTRY02 permanece desabilitado no ativo.** A autorização anterior `13644ed74a48`/`162daff6ce08` fica registada no âmbito original, sem aprovar automaticamente os acréscimos da revisão fixa `{rev}`. Nenhuma alteração ativa nesta estabilização; Apache ativo não reiniciado. COUNTRY02 foi demonstrado no Chromium com Apache/PHP do destino, hostname `portal-investidor.test`, HTTPS reconhecido e produção final: estado anterior → login/MFA → prévia → instalação somente050000 → replay único → perfil/PT/F5 → MZ/v3 → voltar/avançar cifrados → logout/API401/Back sem master → nova sessão/MFA/recuperação. SQL: duas colunas, zero tabelas novas, uma auditoria de instalação, duas edições cifradas; fixtures apenasQA. Backup original real restaurado (288 tabelas/31 sequências/379 ficheiros/2MFA) e backup pós-utilizaçãoQA também restaurado, preservando os dados novos. Frente C110–C112 consolidada com C113–C117: 25 chamadas em14componentes usam utilitário CSPRNG comum; cURL/DLL corrigido só na cópiaApacheQA; OPcache isolado; GeoJSON porfeature dentro de128MiB; bootstrapMFA normal sem recifrar; mensagens consecutivas não perdem texto. Critérios e limites individuais no relatório. O clone cartográfico atual contém408registos comhash integral preservado;393é histórico. Não houve divulgação nem instalação deoutros pacotes ativos. Ativo lido às09:40:51UTC:13contas/0organizações/0representações/79migrations/126audits;050000 ausente, flagfalse e código/config/bundle/chave/dados originais. Dados mestres legítimos/vínculos continuam necessários para a gravação real do país, mas não paraDDL. Faltam a apreciação explícita do delta e o levantamento da suspensão antes de disponibilizar. Ofertas, competências modulares, SLA, workflow/documentos/cartografia/acessibilidade/dispositivos reais mantêm os critérios próprios. A/B eC37 preservados, sem repetir os ensaios completos. [Relatório e limitações]({relative}relatorio-estabilizacao.md) · [Causas/reprodução]({relative}casos-reproducao.md) · [Consumidores/rotas/perfis]({relative}cobertura-consumidores.md) · [Manifesto fixo]({relative}manifesto-candidata.json) · [Procedimento único e reversão]({relative}procedimento-unico.md). Mesma matriz:3393requisitos/3393linhas/6845referências,7concluídos e3386abertos (3234parciais,145não implementados,2implementados masnãoativados,5decisões concretas). SomenteAUD-COUNTRY-02 eAUD-OPS-01 receberam critérios novos; restantes células/referências preservadas. Os blocos abaixo são histórico datado. {end} ''' # Keep the latest block concise and readable without changing literal IDs/hashes. for before,after in {'somente050000':'somente 050000','apenasQA':'apenas em QA','2MFA':'2 MFA','pós-utilizaçãoQA':'pós-utilização QA','em14componentes':'em 14 componentes','cópiaApacheQA':'cópia Apache QA','porfeature':'por feature','de128MiB':'de 128 MiB','bootstrapMFA':'bootstrap MFA','contém408registos':'contém 408 registos','comhash':'com hash',';393é':'; 393 é','deoutros':'de outros','às09:40:51UTC':'às 09:40:51 UTC',':13contas/0organizações/0representações/79migrations/126audits':': 13 contas/0 organizações/0 representações/79 migrations/126 audits',';050000':'; 050000','flagfalse':'flag false','paraDDL':'para DDL','eC37':'e C37',':3393requisitos/3393linhas/6845referências':': 3393 requisitos/3393 linhas/6845 referências',',7concluídos e3386abertos':', 7 concluídos e 3386 abertos','3234parciais,145não implementados,2implementados masnãoativados,5decisões':'3234 parciais, 145 não implementados, 2 implementados mas não ativados, 5 decisões','SomenteAUD':'Somente AUD','eAUD':'e AUD'}.items():block=block.replace(before,after) text=file.read_text(encoding='utf-8-sig') if begin in text: a=text.index(begin);b=text.index(end,a)+len(end);text=text[:a]+text[b:].lstrip('\r\n') file.write_text(block+text,encoding='utf-8') activation=ROOT/'outputs/investmoz-country02-https-activation-20261011/resultado.md' notice=f''' # Atualização vigente: ativação suspensa O responsável suspendeu novas tentativas. COUNTRY02 continua desabilitado e050000 não instalado no ativo. A CA foi confirmada e a confiança demonstrada na QA; não é necessário repetir essa confirmação. A configuração ativa permanece reposta e Apache não foi reiniciado nesta estabilização. A autorização13644ed74a48/162daff6ce08 permanece registada no âmbito original, sem extensão ao delta novo. **Não executar agora os passos históricos de retoma abaixo.** Revisão técnica fixa `{rev}`, demonstrada exclusivamenteQA: [relatório](../investmoz-portal-stability-20261011/relatorio-estabilizacao.md) e [procedimento único](../investmoz-portal-stability-20261011/procedimento-unico.md). Os resultados anteriores seguem preservados como histórico. ''' text=activation.read_text(encoding='utf-8-sig') assert '' not in text activation.write_text(notice+text,encoding='utf-8') print(json.dumps({'result':'same_matrix_preserved_documents_updated','counts':counts,'active_writes':0},ensure_ascii=False))