Aceita fila administrativa de associacoes com checkpoint local
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
# Navegação modular — regressão e perfis de desenvolvimento
|
||||
|
||||
Incremento local posterior: [fila administrativa de conferência](MODULE_ASSOCIATION_QUEUE_DELIVERY.md), com filtros/paginação, prévia obrigatória, decisão individual e provas sintéticas isoladas. Não altera os pendentes protegidos nem constitui aceitação visual ou implantação em 8039.
|
||||
|
||||
Fila aceite em 02/11/2026, com autorização de checkpoint local de código funcional/testes/documentação; ver [aceitação](MODULE_ASSOCIATION_QUEUE_ACCEPTANCE.md). Revisão visual, carga de implantação, seis registos sem associação e cache bloqueada permanecem separados e preservados.
|
||||
|
||||
**Aceitação técnica expressa em 02/11/2026**, registada no [relatório de entrega](MODULAR_NAVIGATION_DELIVERY.md), com autorização de checkpoint exclusivamente local e limitado à entrega. Revisão visual, associações antigas pendentes e volume/paginação permanecem separados. Não autoriza publicação, direitos públicos novos ou activação de candidatas; Compras mantém-se em **0.1.1**.
|
||||
|
||||
Actualização de 01/11/2026 à [entrega inicial](MODULAR_NAVIGATION_DELIVERY.md). Concluídas as duas frentes técnicas: regressão da suite existente e configuração de perfis sintéticos num ambiente de desenvolvimento separado. A [revisão visual](MODULAR_NAVIGATION_VISUAL_REVIEW.md) continua pendente e separada.
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
# Aceitação da fila administrativa de associações
|
||||
|
||||
Em **02/11/2026**, o utilizador determinou: «Regista a aceitação da fila de associações e cria um checkpoint local apenas desta entrega, preservando alterações alheias e excluindo credenciais e dados privados.»
|
||||
|
||||
Fica aceite a implementação local descrita em [entrega e limitações](MODULE_ASSOCIATION_QUEUE_DELIVERY.md): filtros/paginação no servidor, isolamento, prévia de impacto, decisão individual fundamentada, revalidação de contexto/permissões/versões/dependências, histórico append-only, concorrência, repetição e recuperação transaccional.
|
||||
|
||||
O checkpoint inclui **código funcional**, interface, rotas, testes, verificações de apresentação e documentação/provas resumidas desta entrega. Não é um checkpoint apenas documental. Não inclui configuração privada, credenciais, dumps, sessões, tokens concretos, documentos empresariais, inventários linha a linha dos registos locais ou alterações em curso de Compras. O levantamento anterior e os respectivos ficheiros locais permanecem fora deste checkpoint; não são apagados.
|
||||
|
||||
São reutilizados os resultados válidos já registados: 17 testes/221 asserções da fila/navegação, 25 testes/110 asserções de identidade/isolamento/guardas, concorrência com dois processos, recuperação, build e verificações de apresentação. **Não se repetiram testes, build ou consultas aos dados para esta aceitação.** A conferência desta passagem limita-se aos ficheiros e ao conteúdo do checkpoint.
|
||||
|
||||
Permanecem pendentes revisão visual/interacção/recargas e avaliação de carga de implantação. O ensaio de 137 registos não constitui prova de carga. Mantêm-se os restantes limites do relatório, incluindo histórico recente de 20 eventos e validade de 15 minutos das prévias.
|
||||
|
||||
Os cinco registos pendentes do SGF local e o cliente sintético pendente de 8039 permanecem sem associação, dependentes de decisões individuais posteriores. Não se executam decisões, concessões, migrações, reinícios ou implantação na demonstração por consequência desta aceitação. Cache bloqueada mantida intacta, sem nova tentativa de limpeza. Não há publicação, push, activação de Compras ou alterações de direitos públicos.
|
||||
|
||||
A aceitação e o checkpoint são exclusivamente locais. O identificador Git é devolvido após a criação; este documento integra o próprio checkpoint.
|
||||
@@ -0,0 +1,66 @@
|
||||
# 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](MODULE_ASSOCIATION_QUEUE_ACCEPTANCE.md). 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](proofs/module-association-queue-20261102.json) · [preservação dos pendentes](proofs/module-association-queue-preservation-20261102.json). 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.
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"date": "2026-11-02",
|
||||
"scope": "Local administrative module association queue",
|
||||
"runtime": {
|
||||
"port": 55439,
|
||||
"php": "8.4.27",
|
||||
"node": "24.22.1",
|
||||
"cluster": "sgf_modular_regression_2576427d1939",
|
||||
"role": "sgf_test_runner",
|
||||
"database": "sgf_tempo_test"
|
||||
},
|
||||
"focused": {
|
||||
"assertions": 221,
|
||||
"errors": 0,
|
||||
"tests": 17,
|
||||
"junit_sha256": "69ce9779f96ca8e37387774970d7cd5676d076b173a962b333aa01a44a0492cb",
|
||||
"failures": 0
|
||||
},
|
||||
"foundation": {
|
||||
"assertions": 110,
|
||||
"errors": 0,
|
||||
"tests": 25,
|
||||
"junit_sha256": "8d4f4022486383066ad6bd33e9ba760b12c5d2ac15ad8a7598167754bea9b0ef",
|
||||
"failures": 0
|
||||
},
|
||||
"concurrency": {
|
||||
"events_per_decision": 1,
|
||||
"distinct_reviews_statuses": [
|
||||
200,
|
||||
409
|
||||
],
|
||||
"independent_php_workers": 2,
|
||||
"same_review_statuses": [
|
||||
200,
|
||||
200
|
||||
],
|
||||
"observed_lock_waits": 2
|
||||
},
|
||||
"recovery": "Synthetic AFTER INSERT audit trigger raises; transaction rolls back; same preview retries successfully and subsequent replay returns original event",
|
||||
"synthetic_volume": {
|
||||
"matching_records": 137,
|
||||
"page_size": 100,
|
||||
"page_counts": [
|
||||
100,
|
||||
37
|
||||
],
|
||||
"production_load_claim": false
|
||||
},
|
||||
"build": "passed, Vite 8.3.5; navigation/render/transition controls passed",
|
||||
"render": "scripts/module-association-check.mjs passed",
|
||||
"browser_used": false,
|
||||
"new_runtime_rights": false,
|
||||
"schema_migrations": false,
|
||||
"candidate_activation": false,
|
||||
"publication": false,
|
||||
"preservation_proof": "module-association-queue-preservation-20261102.json",
|
||||
"limitations": [
|
||||
"Recent history limited to 20 events; full append-only audit retained",
|
||||
"SQL scans and dependent-record queries still require production-volume evaluation",
|
||||
"Review expires after 15 minutes; retries later require a new review",
|
||||
"No visual or browser interaction acceptance"
|
||||
],
|
||||
"tooling_incident": "npm exec fetched node 27 alpha into an npm cache directory; no manifest or lockfile changes; final validation used pinned Node 24 and PHP 8.4. Removal of the cache directory was rejected by automatic policy review."
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"date": "2026-11-02",
|
||||
"read_only": true,
|
||||
"checks": {
|
||||
"installed": {
|
||||
"read_only": "on",
|
||||
"database": "sgf_tempo_dev",
|
||||
"pending_records_versions_links_and_references_unchanged": true
|
||||
},
|
||||
"demo": {
|
||||
"read_only": "on",
|
||||
"database": "sgf_modules_dev_2576427d1939",
|
||||
"pending_records_versions_links_and_references_unchanged": true
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user