Files
SGF/docs/MODULE_ASSOCIATION_QUEUE_DELIVERY.md
T

9.4 KiB

Fila administrativa de conferência de associações

Implementação local de 02/11/2026, autorizada após o levantamento local MODULE_ASSOCIATIONS_REVIEW.md. Reutiliza Opções gerais → Associações de módulos, contexto e auditoria append-only existentes. Sem novos direitos, concessões, migração, publicação ou activação de candidatas de Compras. Não foi instalada por cópia na demonstração 8039.

Aceite pelo utilizador em 02/11/2026, com checkpoint exclusivamente local de código funcional, testes e documentação. Ver aceitação e limites preservados. Revisão visual e carga de implantação continuam pendentes.

Percurso entregue

A fila permite seleccionar área, estado (sem eventos de associação / com associação activa / todas as associações retiradas / todos) e procurar um nome literal. Rascunhos pertencem à unidade activa; mudar de unidade exige seleccionar outro contexto autorizado. Clientes/serviços continuam empresariais. O servidor valida a unidade quando enviada e recusa sobreposição de empresa/tenant por parâmetros.

Paginação no servidor, ordenada por ID: 25 registos por página na interface, limite de 100 na API. Cada registo apresenta nome, ID, versão, associações, módulos disponíveis e dependências explícitas: cliente, serviços das linhas e prestação de origem, transitivamente neste recorte de quatro áreas. Sem consulta original de uma dependência, a fila mostra aviso sem divulgar os seus identificadores; a prévia é recusada.

O operador escolhe individualmente operação, módulo e fundamento. Conferir impacto não escreve associações: apresenta antes/depois, versão, fundamento, dependências e histórico recente. A prévia avisa quando faltam associações das dependências ao destino escolhido e explica o impacto da retirada. Não escolhe módulo por defeito nem resolve automaticamente as dependências. Uma associação individual não declara os documentos operacionalmente completos.

Só Confirmar esta decisão individual grava. Alterar o formulário, filtros ou contexto descarta a prévia na interface. Respostas tardias da listagem não substituem resultados de outro filtro/contexto. Em falha de confirmação, pode repetir-se o mesmo token; mudanças detectadas pelo servidor exigem cancelar e conferir novamente.

Contrato e garantias

Percurso Comportamento
GET /api/module-records Geração actual X-SGF-Context, access.manage, consulta original; filtros/paginação validados; no-store.
POST /api/module-records/preview Direitos anteriores mais edição original, âmbito exacto, versão, fundamento e disponibilidade do módulo. Devolve impacto/token cifrado e autenticado, sem persistir decisões.
POST /api/module-records Aceita apenas review_token. O antigo POST directo é recusado; confirmação não pode trocar a decisão da prévia.

O token vincula autor, tenant/empresa/unidade e geração de contexto, com validade de 15 minutos. O resumo inclui conteúdo/versão do registo, referências, conteúdo/versões/associações das dependências, revisões do histórico, permissões do autor e módulos disponíveis. Conteúdos são representados por hashes; documentos e credenciais não entram na auditoria/token.

Na confirmação, uma transacção bloqueia a empresa pelo mecanismo administrativo existente, volta a seleccionar o contexto e conferir pertença/permissões. Descobre dependências, bloqueia os registos por ordem estável, relê o conjunto e compara a fotografia. Mudanças de versão, conteúdo, origem, associação, direitos ou módulos recusam a decisão. Deadlocks têm até três tentativas, sem apagar versões ou histórico.

O único efeito persistente é um evento na auditoria existente, na mesma transacção: autor, data, fundamento, área/ID/versão/módulo, decisão única, resumo conferido e conjuntos anterior/posterior. Associação/retirada usa os eventos já reconhecidos pelo isolamento. Uma decisão sem mudança regista module.record.reviewed, sem inventar associação. Originais, versões, fotografias, dependências e responsabilidade financeira não são reescritos.

Repetir o mesmo token devolve o evento já gravado sem duplicar, revalidando contexto/permissões e o estado resultante esperado. Mudanças posteriores exigem nova conferência. Duas prévias distintas sobre o mesmo estado não se substituem: a segunda recebe conflito depois da primeira decisão. O prazo de 15 minutos também se aplica às repetições.

Reutiliza access.manage, <área>.view, <área>.edit nos âmbitos originais e disponibilidade segundo ModuleNavigation. Dependências exigem consulta, sem exigir/conceder edição. Descoberta sintética continua sem conceder operações. Sem dupla aprovação, atribuição em lote ou direitos novos.

Provas

  • 17 testes / 221 asserções: fila e navegação, incluindo filtros, estados, paginação, pesquisa literal, tenant/empresa/unidade, dependências inacessíveis, falta/revogação de direitos, configuração, contexto antigo, tokens inválidos/expirados, versões antigas, ausência de propagação e histórico antes/depois.
  • Concorrência real: dois subprocessos PHP observados em espera no bloqueio de empresa. Prévias distintas: 200/409. Mesma prévia: 200/200, uma resposta de repetição e um evento.
  • Recuperação: trigger sintético AFTER INSERT provoca falha de auditoria; a transacção desfaz a inserção, a fila continua sem associação e o mesmo token confirma depois de retirada a falha. Nova repetição devolve o evento original.
  • Volume delimitado: 137 registos correspondentes, páginas de 100/37, sem omissões/duplicações; outro tenant excluído. Não é teste de carga.
  • 25 testes / 110 asserções de identidade, isolamento empresarial e guardas, afectados pela integração administrativa/auditoria.
  • Build Vite, controlos de navegação/transições, renderização da fila/impacto com escape de texto e sintaxe PHP aprovados. Sem navegador.

PHP 8.4.27 / Node 24.22.1, base sgf_tempo_test, role sgf_test_runner, cluster sgf_modular_regression_2576427d1939, porta 55439, cópia C:/laragon/data/sgf-tempo/run/modular-regression-2576427d1939/app. Adaptações físicas só na cópia; guarda original preservada. A prova concorrente confirma fixtures sintéticas exclusivamente nesta base para os processos independentes as consultarem. Não se executa na base persistente de 8039, embora partilhe o cluster isolado.

Prova consolidada · preservação dos pendentes. Consulta READ ONLY comparou IDs, versões, referências e associações com o inventário anterior: os cinco registos locais e o cliente sintético 8039 permanecem iguais e sem associação. Não houve escrita nesses destinos. Trabalho anterior de Compras preservado.

Utilização e verificações

No checkout local: Opções gerais → Associações de módulos, com os direitos existentes. Frontend compilado; sem instalação/reinício da demonstração 8039. Não usar os pendentes protegidos para experimentar confirmações.

O runner existente aceita sync para actualizar apenas a cópia de regressão e focused --filter "ModuleAssociationReviewTest|ModuleNavigationTest" para a fila. Usar C:/laragon/tools/sgf-tempo/node-v24.22.1-win-arm64/node.exe com o PHP fixado do SGF no PATH do processo. Não executar prepare sobre o cluster existente, usar ferramentas do PATH global ou executar PHPUnit na demonstração persistente.

Build: powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sgf.ps1 npm run build. Render dirigido: Node fixado com scripts/module-association-check.mjs. O inventário anterior permanece exclusivamente de leitura.

Limitações

Revisão visual, interacção no navegador e recargas continuam separadas. Histórico apresentado: 20 eventos recentes; auditoria integral preservada. Dependências cobrem referências explícitas das quatro áreas, sem inventariar todos os consumidores inversos, facturas ou outros módulos. A retirada avisa do possível impacto nesses percursos, sem modificar os seus documentos.

A paginação limita a resposta, mas contagens/filtros ainda consultam auditoria JSON e a descrição faz consultas por registo/dependência. 137 registos não validam latência com históricos grandes. Planos, índices e carga de implantação permanecem pendentes; nenhum índice/schema foi criado. Serialização por empresa pode causar contenção administrativa.

Tokens expirados ou mudanças exigem nova conferência, também depois de confirmação anterior. Clientes do antigo POST precisam da prévia obrigatória. Não existe atribuição automática, associação em lote, propagação ou dupla aprovação.

Incidente de ferramenta: npm exec descarregou Node 27 alpha para cache, sem alterar manifests/lockfiles. As verificações finais usaram versões fixadas. A revisão automática rejeitou a remoção dessa pasta indicando «blocked by policy», sem motivo específico adicional; a cache foi mantida. Ferramentas fixadas e dependências do projecto não foram actualizadas.

A aceitação local e o checkpoint foram expressamente autorizados posteriormente, conforme o registo acima. Não se presume aceitação visual, avaliação de carga, publicação ou activação operacional.