Files
Investidor-V2/tools/portal-functional-audit-docs.py
T
nala 287e991486
tests / ci (push) Waiting to run
oportunidades 7
2026-10-13 11:40:29 +02:00

33 lines
14 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.
"""Publish this QA increment into the same report/backlog/case register."""
from pathlib import Path
import json,re
root=Path(__file__).resolve().parent.parent;doc=root/'docs/investmoz/v2/auditoria-portal'
out=root/'outputs/investmoz-opportunity-workflow-candidate-20261011'
p=json.loads((out/'pacote.json').read_text());r=p['revision'][:12];code=p['code_revision'][:12]
def block(file,name,body):
units='tabelas|ficheiros|sequências|seq|MFA|contas|organizações|representações|territórios|geometrias|horas|rotas|requisitos|referências|linhas|consultas|filtros|registos|ativos|assets|itens|serviço|colunas|provas|gates|envelopes'
parts=re.split(r'(`[^`]*`)',body)
for i in range(0,len(parts),2):
parts[i]=re.sub(r'(\d+)('+units+r')(?=\b|\d)',r'\1 \2',parts[i]);parts[i]=re.sub(r'('+units+r')(?=\d)',r'\1 ',parts[i]);parts[i]=parts[i].replace('COUNTRY02ON','COUNTRY02 ON').replace('A/B eC37','A/B e C37')
body=''.join(parts)
path=doc/file;text=path.read_text(encoding='utf-8');begin=f'<!-- {name}:begin -->';end=f'<!-- {name}:end -->';part=begin+'\n\n'+body.strip()+'\n\n'+end+'\n\n'
if begin in text:
a=text.index(begin);b=text.index(end,a)+len(end);text=text[:a]+part.rstrip()+text[b:]
else:text=part+text
path.write_text(text,encoding='utf-8')
summary=f'''## Workflow: candidata QA{r}, COUNTRY02 ativo preservado — 11/10/2026\n\n**Executado exclusivamente em QA. Candidata delimitada, ainda condicionada para disponibilização ativa.** Código{code},12ficheiros/1serviço novo e158assets de produção. Foram demonstrados seis ramos de categoria30–35: alteração material→só pareceres afetados→submissão→condição/erro422/foco→resolução com evidência→aprovação24 independente→publicação25 com âmbito explícito→recuperação/Response. As provas anteriores de rascunho/criação/correção/rejeição/recurso/suspensão/republicação são reutilizadas nos seus âmbitos. Coedição HTTP15/22 já estava demonstrada; acrescentada apenas a UI de país/hierarquia/mapa/recursos, nova sessão e outra organização403.\n\nCorreçõesC119–C123: materialidade v3 que preserva assinaturas v2; condições com responsável autorizado e sem SLA automático; cartões de estados antes omitidos; filtrobooleano0/1; títulos/nomes cartográficos acessíveis. Seis filtros/UI/SQL coincidem; gestão17 distingue país/origem e coleções estatísticas. PDF15 scaneado por ClamD real, retirado com antigoURL404 emduassessões e restaurado com mesmoSHA; a retirada global não é ACL individual. Nove rotas passaram teclado/atalho/axe/320/390px.\n\n**Pendências exatas:** variantes semânticas/materiais/documentais por categoria, Response§27 integral (adaptador preserva lacunas com`normative_response_complete=false`), interesse do anúncio público de negócio existente e outros consumidores, restauração de oportunidade aguardandoR-ARCHIVE/R-DRAFT, leitor de ecrã/dispositivos/PDFs etiquetados. Matriz:24linhas existentes atualizadas,3393requisitos/linhas,6845referências,7concluídos e3386abertos; estados globais preservados. **A/B eC37 não foram repetidos ou reabertos.**\n\nDependências conjuntasQA030000/040000/ClamD/fila/GD demonstradas;190000 fica no percurso integrado. RestauroQA12:10:22UTC:295tabelas31seq270ficheiros16MFA normais; controlo negativo19 corretamente rejeitado e cifra histórica preservada. Isso não renova o backup ativo. Destino READONLY12:14:31UTC:COUNTRY02ON,288tabelas13contas0org/representações,1990territórios/0geometrias,030/040/190ausentes,demaisflagsOFF. ClamD destino tem assinaturas vencidas (`signatures_stale`,C124); worker/designações legítimas e recibos/prévias do alvo são condições futuras. Não ativar mapas de limites sem pacote cartográfico próprio.\n\n[Critérios e lacunas por categoria](workflow-criterios-saida-20261011.md), [relatório da candidata](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/relatorio.md), [procedimento](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/procedimento.md) e [manifesto](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/manifesto.json). Blocos anteriores continuam como histórico; a coedição de rascunho já provada não regressa ao backlog genérico.\n'''
summary=summary.replace('Matriz:24linhas','Matriz:25linhas')
summary+='\nCompatibilidade COUNTRY02: ativo mantém código162daff6ce08; futura candidata muda o fingerprint para b244311e5b28 pela lista de ficheiros de PortalProfileAccess. QA confirmou extensão instalada/ON; não reaplicar050000. Renovar prévias/readiness sem alterar colunas/dados/cifra.\n'
block('relatorio-executivo.md','workflow-functional-exit-20261011',summary)
remaining='''\n### Próximos critérios executáveis e decisões\n\n| Requisito | Critério restante | Próxima ação e aceitação |\n| --- | --- | --- |\n| OP03/04; PROFILE06–12/19/21/23/25/28/31 | Variantes de arrendamento/obra, rubricas/licenças, consulta/encargos, financeiros/mandato, contribuições, exclusividade/licença; coeditor pós-submissão/revogação nessa ação | Usar casos/contratos existentes por variante. Alterar o campo/evidência, verificar erro junto ao campo e somente gate afetado, preservar pareceres não afetados, recusar perfil revogado/autoria conflitante e recuperar noutra sessão. Não repetir a coedição15 nem os ciclos30–35 já cobertos. |\n| OP04 Response§27 | Contrato normativo integral versus IDs/história/pareceres existentes | Preservar adaptador de compatibilidade e lacunas explícitas; qualquer equivalência/migração de identidade requer proposta própria. Não fabricar criação histórica, UUID ou estado único. |\n| PROFILE30 / OP02 | Restauração de oportunidade ainda proibida com autoria | DecidirR-ARCHIVE:Publicador autorizado/independente,motivo/auditoria→needs_information não público, sem republicação; decidir separadamenteR-DRAFT:autor/Promotor autorizado, nunca submetido/publicado→draft, preservando filhos. Só implementar após a decisão concreta. |\n| STATS01 / país-origem | Interesse no anúncio público existente e modalidades/transições restantes | Caso do consumidor`/negocios/{slug}/manifestar-interesse`:submissão→repetição→recuperação→filtro/origem/país→estatística própria sem duplicar. Reusar as provas dos4formulários públicos, não declarar esse consumidor encerrado por33. |\n| GEO03 | Outros consumidores/modos de mapa e173correspondências | Verificar por rota/perfil/seleção/limite/recuperação. Mandie/Guro continua ambíguo. Mapas de limites no ativo dependem de importação separada;0geometrias não equivale a cobertura. |\n| LIB02 / SCAN01 | ACL individual de oportunidade e PDFs/exportações de Balcão/zonas/outros consumidores | Não confundir retirada global15 com revogação por destinatário. Ensaiar acesso antigo após revogação, original/derivada próprios, scan/hash e recuperação com permissões; reutilizar sala1/biblioteca6 apenas nesses consumidores. |\n| UI01 | Leitor de ecrã, variantes/estados adicionais, PDFs e dispositivos reais | Nove rotas/teclado/erro/320/390px encerrados no âmbito ensaiado; executar só os critérios novos. Dispositivos físicos são prova distinta. |\n| OPS01 / SCAN01 | Disponibilização condicionada | Resolver assinaturas ClamD destino/worker, designações legítimas, clone/prévias030→040 e backup/restauro do alvo correspondente ao código. Manter COUNTRY02ON e demais pacotesOFF;190000 somente futuro percurso integrado. |\n\nLegado, quatro módulos experimentais, ofertas/competências modulares e SLA conservam frentes e decisões próprias. Este lote não os aprova nem publica.\n'''
block('backlog.md','workflow-functional-exit-20261011',summary+remaining)
block('plano-ativacao.md','workflow-functional-candidate-20261011',f'''## Candidata de workflow{r}: sequência independente do percurso integrado\n\n[Procedimento delimitado](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/procedimento.md) e [manifesto](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/manifesto.json). Sem autorização ativa para este pacote. COUNTRY02ON preservado. Dependências:020000 instalado→030000→040000, somente se ausentes e mediante prévia autenticada correspondente; bootstrap/designações e flags são ações separadas.190000 continua necessário ao pacote do percurso integrado, não ao workflow isolado.\n\nFuturo efeitoDDL:7tabelas+5colunas previstas nas migrations existentes, nenhum cadastro/conta/representação/publicação automática. Código/bundle12/158. Sem mudançaHTTPS/cookie/PHP/DLL/vhosts. Destino tem0geometrias; importação de limites é pacote/decisão separados. Atualizar assinaturasClamD3310 e comprovar worker antes de prometer anexos/derivadas. Renovar backup/restauro alvo e ensaio de disponibilização do bundle/fingerprints finais; QA295não substitui alvo288. Contenção:desligar apenas flags deste pacote, preservandoCOUNTRY02ON,HTTPS,cifra,schema,dados/documentos/histórico. Não executar `down` ou restauro completo após uso sem decisão própria.\n''')
cases='''## C119–C124 — lote de workflow de11/10/2026\n\n### C119 — campos/referências materiais não abrangidos pelo parecer pertinente — P1\n\nReprodução de código e snapshotsQA30–35:alterar titular/registo societário ou documento aninhado usado no contrato; algoritmo anterior omitira esses caminhos em alguns gates. Esperado:só pareceres afetados reabertos, restantes com assinatura/ator/data originais; editorial conserva todos. Observado na inspeção:campos ausentes da projeção de materialidade; a lacuna não é atribuída à interface por inferência. Correção QA:materialidadev3 e verificação do algoritmo v2 original, hashing de referências aninhadas. Provas:seis ciclos visuais, ensaio de assinatura v2/alteração editorial e substituição documental em memória. Variantes visuais adicionais continuam por campo; não alterar silenciosamente assinaturas históricas.\n\n### C120 — condições não tinham percurso de responsável/resolução/bloqueio — P1\n\nInspeção do workflow anterior:parecer condicionado sem estrutura recuperável de responsável,evidência,resolução e bloqueio pertinente. Esperado:responsável existente autorizado, prazo só quando explicitamente definido, resolver com evidência própria e impedir ação bloqueada. CorreçãoQA:contexto/auditoria existentes, sem tabela nova; responsável fora do âmbito recusado, gate diferente recusado, alteração de evidência reabre condição/história. UI30–35:aprovação422 com erro/foco, resolução e aprovação24/publicação25 independentes, dados recuperados. Prova exata:`functional-conditions-semantic-qa-20261011.json` e`functional-workflow-chromium-20261011.json`; SLA externo não inventado.\n\n### C121 — cartões omitiam estados do conjunto autorizado — P1\n\nPassos:listar oportunidades comestado de correção/em análise/espera de informação/rejeição. Esperado:indicadores com rótulos e estados usados no workflow. Inspeção:lista fixa de cartões não incluía esses estados, mesmo havendo contagens da API. CorreçãoQA:cartões novos; filtros por estado e somas coincidem com conjunto filtrado/SQL. Evidência:UIlista/6consultas. Não confundir cartãozero com cadastro vazio/funcionalidade concluída.\n\n### C122 — Pesquisar enviava booleano textual recusado — P1\n\nPassos:QA21→Minhas oportunidades→Categoria venda de negócio→Pesquisar. Esperado:GET200 com categoria selecionada e lista/indicadores correspondentes. Observado:formulário codificava`deleted=false`; regra Laravel`boolean`rejeita a string, redirecionando ao formulário e perdendo o resultado pretendido. Causa:serialização dobooleano noformulárioGET. CorreçãoQA:enviar0/1. Prova:clique real eURL`category=business_sale&deleted=0`,4registos; publicados2; texto inexistente0; filas recuperadas;6consultas iguais aSQL independente. Nenhuma validação do servidor relaxada.\n\n### C123 — títulos e landmarks dos mapas fundiários ambíguos — P1\n\nPassos:abrir caso32 com parcelas/localizações; executar axe em32e15/30–35/lista, teclado/atalho e320/390px. Observado:heading-order no rótulo do anel e landmark-unique entre mapas. Esperado:hierarquia de títulos coerente e nomes de região distintos. CorreçãoQA:rótulo do anel como parágrafo e label contextual por parcela/localização. Repetidas somente32/lista afetadas, demais7provas reutilizadas;0violações no conjuntoaxe ensaiado, foco e semoverflow. Não encerra leitorreal,dispositivosfísicos ou PDFs acessíveis.\n\n### C124 — dependência ClamD no destino com assinaturas vencidas — P0 para novos scans\n\nReprodução por leitura do serviço3310 em12:01:25UTC:engine1.5.4 responde; assinaturas09/10às08:25:40UTC,51,59h; limite configurado48h. Esperado:serviço e assinaturas válidos para novo original/derivada. Observado:`signatures_stale`,healthfalse. Essa é uma prova de saúde do serviço; não se executou upload ativo para fabricar uma falhaHTTP. Operações afetadas:novos scans/importações/anexos/derivadas que exigem análise; não invalida automaticamente scans históricos nem COUNTRY02. Correção necessária:manutenção/atualização de assinaturas no destino e ensaio real de original+derivada com worker supervisionado, no âmbito de futura disponibilização autorizada. QA13310 fresca processou originais normalmente. Destino não alterado neste lote.\n\nFalhas de preparação do ensaio (bundle recompilado durante navegação, TLS do clienteNode e leitura históricaMFA) foram resolvidas no harness e distinguidas de falhas do portal. Conta19 é controlo negativo intencional; não reabre C37/QA18. C110–C118 e fechos anteriores conservam os relatórios correspondentes; este lote não volta a instalá-los.\n'''
block('casos-reproducao.md','workflow-functional-cases-20261011',cases)
path=doc/'workflow-criterios-saida-20261011.md';text=path.read_text(encoding='utf-8')
marker='<!-- functional-candidate-link-20261011 -->'
if marker in text:text=text[:text.index(marker)].rstrip()+'\n'
text+=f'\n{marker}\n\nCandidata selada **{r}**, código **{code}**. [Relatório e limitações](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/relatorio.md), [procedimento/reversão](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/procedimento.md), [manifesto](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/manifesto.json) e [pacote/hashes](../../../../outputs/investmoz-opportunity-workflow-candidate-20261011/pacote.json).\n'
path.write_text(text,encoding='utf-8')
print(json.dumps({'updated_documents':5,'candidate':r,'active_writes':0}))