"""Append criterion evidence to the existing matrix, preserving IDs, source rows and states.""" from pathlib import Path from datetime import datetime,timezone import csv,json,hashlib,collections csv.field_size_limit(20000000) R=Path(__file__).resolve().parent.parent;D=R/'docs/investmoz/v2/auditoria-portal';P=R/'storage/app/private/investmoz-v2/portal-audit' read=lambda n:json.loads((P/n).read_text(encoding='utf-8')) code=read('workflow-upgrade-code-20261011.json');qa=read('workflow-upgrade-backup-restoration-qa-20261011.json');target=read('workflow-upgrade-target-backup-20261011.json') assert qa['result']==target['result']=='passed' and code['code_revision']==qa['code_revision']==target['candidate_code_revision'] for n in ['workflow-upgrade-fixed-install-chromium-20261011.json','workflow-upgrade-document-pipeline-chromium-20261011.json','workflow-upgrade-office-chromium-20261011.json','workflow-upgrade-final-ui-chromium-20261011.json']: assert read(n)['result']=='passed' tag='[Atualização do clone/ACL Super QA 11-10-2026] ' evidence='Clone real do alvo restaurado288→295tabelas:030000→040000 por HTTP autenticado/Chromium/MFA normal; prévia divergente409 sem DDL, repetição030000 com prévia renovada sem duplicação e040000 com mesmo recibo/chave; bootstrap distinto com2titulares sintéticos e terceiro aprovador. COUNTRY02/050000 e190000 ausente preservados. PDF/PNG: envio→fila→quarentena423→worker terminado após reservar→mesmo trabalho recuperado após210s→ClamD1.5.4/definições11out→3WebP com scans próprios→downloads/hash/preview. DOCX/XLSX próprios também scan real/hash/recuperação. Repetir processamento não cria novos ficheiros/versões/auditoria. Super sem âmbito ou elevação403, autoaprovação403, scope+elevação independente200 só no dossier; outro dossier403; revogação invalida sessão e novo login403. Expiração e Auditor acumulado recusados no teste afetado. Aviso/derivada390px e bundle servido pelo hash demonstrados.' refs='workflow-upgrade-fixed-install-chromium-20261011.json; workflow-upgrade-document-pipeline-chromium-20261011.json; workflow-upgrade-worker-fault-20261011.json; workflow-upgrade-office-chromium-20261011.json; workflow-upgrade-final-ui-chromium-20261011.json; workflow-upgrade-backup-restoration-qa-20261011.json; workflow-upgrade-target-backup-20261011.json; workflow-upgrade-affected/policy-validity-20261011.xml. Provas anteriores das seis categorias/A-B/C37/coedição conservadas, não repetidas.' implementation='PortalProfileAccess exige perfil operacional no âmbito e elevação de consulta independente/temporária para Superutilizador, inclusive recursos/Response/URLgenérico/preview; usa portal_security_approvals existente, sem novas tabelas de ACL. Superuser+Auditor não contorna a restrição. PortalSuperusers aceita view vinculado ao registo; UI esclarece. OpportunityImageProcessor reutiliza derivadas do mesmo original e pode reenfileirar scans pendentes, sem novos streams/versões.' gap='Destino ainda não atualizado: ClamD3310 com assinaturas09out recusado(stale); worker supervisionado e GD/WebP/CLI/web documental no destino ainda por verificar;2titulares legítimos+terceiro gestorMFA+âmbitos Promotor/Validador/Publicador a designar. Restauração de oportunidade e partilha individual continuam desabilitadas/fora do pacote; variantes não ensaiadas,Response§27normativo integral,190000,cartografia/importações,legado,módulos/ofertas/SLA e leitores/dispositivos reais permanecem separados. Sem novas organizações ou representações.' deps='030000 precede040000;020000 existente e050000 preservada;190000 NÃO é dependência DDL do workflow isolado. Backup real do destino renovado '+target['verified_at']+':288tabelas/31seq/799ficheiros/2MFA, restauro apenas55441. Pós-utilização QA '+qa['verified_at']+':295tabelas/31seq/188ficheiros/9MFA;285tabelas originais não transitórias preservadas. Revisão código '+code['code_revision'][:12]+'. A aprovação/serviços/readiness do destino continuam necessários; readyQA não significa ativo.' active='Leitura exclusiva investemoz:5432:288tabelas,020000+050000,COUNTRY02ON,030000/040000 ausentes,demaisflagsOFF,13contas,0organizações/representações/geo_geometries. ClamDativo3310stale. Nenhuma alteração ativa de código,bundle,serviço,chave,flag,schema,dados ou privilégios.' ids={'AUD-OP-02','AUD-OP-03','AUD-OPS-01','AUD-PROFILE-14','AUD-PROFILE-31','AUD-PROFILE-32','AUD-UI-01'} packet={'proof_filename':'csv-authoring-proof.json','files':[]};folder=P/'workflow-upgrade-finalize-20261011';folder.mkdir(exist_ok=True) for name in ['matriz-requisitos.csv','backlog-priorizado.csv']: f=D/name;raw=f.read_bytes() with f.open(encoding='utf-8-sig',newline='')as stream:rows=list(csv.reader(stream)) h=rows[0];patches=[] for number,row in enumerate(rows[1:],1): if row[h.index('ID')] not in ids:continue def append(k,v): old=row[h.index(k)];assert tag not in old return old+'\n'+tag+v if name=='matriz-requisitos.csv': values={'Implementação encontrada':append('Implementação encontrada',implementation),'Disponibilidade ativa':active,'Evidência funcional':append('Evidência funcional',evidence+' '+refs),'Lacuna':append('Lacuna',gap),'Dependência':append('Dependência',deps), 'Interface':append('Interface','ChromiumHTTPS do clone, aviso de âmbito do Super/derivada390px e seletor de elevação identificados; hash do asset realmente carregado confere com bundle final. Dispositivos físicos e acessibilidade integral não encerrados.'), 'API':append('API','409divergência antes DDL, mesmas instalações sem repetição;423quarentena;200binários íntegros/scan;403sem scope/elevação,autoaprovação ou outro dossier;revogação nega URL anterior e novo login.'), 'Gravação':append('Gravação','Somenteclones55441:7tabelas previstas; zero linhas originais não transitórias alteradas; novas contas/roles/documentos estritamente sintéticos. Auditoria única030/040, histórico/MFA/cifra originais preservados.'), 'Recuperação':append('Recuperação','Worker real recupera o mesmo job após210s;PDF/PNG/DOCX/XLSX com hashes;3WebP recuperáveis;repetição não duplica. Restauro completo pós-utilização295tabelas e188ficheiros iguais.'), 'Resultado apresentado':append('Resultado apresentado',evidence), 'Versões divergentes':append('Versões divergentes','e871f8aadb59 preservada como referência; a leitura administrativa universal do Super é restringida nesta revisão. São17ficheiros de código;5alterados face àquela. Último delta após ensaio autenticado é somente rótulo de consulta no seletor; pedidos/autorização/DDL/transações iguais, reconferidos por prévia final e nova compilação. Não converter propostas em regras ativas.')} else:values={'Pendência':append('Pendência',gap),'Correção/componentes':append('Correção/componentes',implementation+' '+evidence+' '+refs),'Dependência/pergunta':append('Dependência/pergunta',deps+' Designar: dois titulares; terceiro gestor independente comMFA; perfis funcionais e tipos/organizações legítimos. Restauração permanece proposta separada.'),'Ordem do próximo lote':append('Ordem do próximo lote','Conferir candidata única/delta; resolver serviços e designações no destino sob autorização própria; renovar prova do destino após alterações;030000→040000→bootstrap separado→habilitar apenas flags do workflow. Não aplicar190000/050000,importações ou publicações; não inventar organização para ensaio.')} patches.append({'row':number,'values':values}) assert len(patches)==len(ids) packet['files'].append({'filename':name,'input_sha256':hashlib.sha256(raw).hexdigest(),'rows':rows,'patches':patches,'allowed_columns':sorted({k for p in patches for k in p['values']}),'source_hash_updates':[]}) if name=='matriz-requisitos.csv':counts={'requirements':len(rows)-1,'rows':len(rows)-1,'source_occurrences':sum(int(r[h.index('Quantidade de linhas de origem')])for r in rows[1:]),'states':dict(collections.Counter(r[h.index('Estado')]for r in rows[1:])),'updated_IDs':sorted(ids),'new_IDs':0} (folder/'csv-edits.json').write_text(json.dumps(packet,ensure_ascii=False),encoding='utf-8');(folder/'counts.json').write_text(json.dumps(counts,ensure_ascii=False,indent=2),encoding='utf-8') cases=D/'casos-reproducao.md';t=cases.read_text(encoding='utf-8');assert '## C127 —' not in t t+='''\n\n## C127 — Superutilizador administrativo com acesso operacional global a anexos - **P0, apenas QA; fonte/cobertura:** a leitura do código anterior encontrou `canView` a devolver true para todo Superutilizador. Essa constatação é de código; não se apresenta como exploração observada no destino, que ainda não tem030000/040000. Contraria v1§345: elevação não substitui perfil operacional; administração não concede consulta universal. - **Reprodução/esperado:** titular sintético15, sem âmbito, GET `/minhas-oportunidades/7/resources` e download próprio/genérico do PDF. Deve receber403; com papel funcional, ainda403 até outro titular aprovar elevação de consulta para7. Autoaprovação e acesso ao dossier8 devem continuar403. - **Correção/evidência:** PortalProfileAccess/PortalSuperusers existentes: scope+elevação independente `view`, objeto e validade15min/MFA recente. Mesmo Super com Auditor não contorna a negação. Chromium:403→elevação aprovada200(hash)→outro dossier403; revogação invalida sessão, URL antigo e novo login403. Expiração/escopo/conflitos confirmados no teste afetado. `workflow-upgrade-document-pipeline-chromium-20261011.json`, `workflow-upgrade-policy-validity-20261011.xml`, UI/bundle final. - **Limite:** não implementa ACL individual nem autoriza operação/administração universal. Provas de gestão de papéis não substituem decisão sobre titulares legítimos. ## C128 — repetição de processamento de imagem gerava novas derivadas - **P1, achado de código corrigido emQA:** versão anterior gerava novosUUIDs/streams em cada execução com versão/etag atualizados, mesmo sem mudar o original. Não foi apresentado um ensaio HTTP «antes»; a causa está no laço incondicional de geração. - **Reprodução/esperado:** após gerar e analisar uma imagem, recuperar etag/versão e voltar a preparar o mesmo original. Deve manter documentos, hashes, versão e decisões, sem duplicar. - **Correção/prova:** reutilizar derivações coerentes com hash/larguras/bytes existentes; reenfileirar só scans pendentes. ImagemQA800×600: trêsWebP320/640/800, scans próprios reais; repetiçãoHTTP200 mantém IDs, versão, hashes/cifra e fila vazia. Teste afetado conserva contagem/documentos/versões/auditoria. `workflow-upgrade-document-pipeline-chromium-20261011.json` e teste de imagens em `workflow-upgrade-affected-20261011.xml`. ''' cases.write_text(t,encoding='utf-8');print(json.dumps(counts,ensure_ascii=False))