Skip to content

test(mcp): validar resiliência, carga e SLOs - #38

Merged
neomaike merged 10 commits into
mainfrom
test/795-mcp-resilience-slos
Jul 30, 2026
Merged

neomaike merged 10 commits into
mainfrom
test/795-mcp-resilience-slos

Conversation

@neomaike

Copy link
Copy Markdown
Contributor

Issue vinculada

LexNotify/LexNotify-Web#795

Escopo

  • validação integrada de freshness, autenticação/autorização, isolamento, publicação atômica e rollback;
  • tratamento estruturado de timeout;
  • cache apenas de provas Git imutáveis, sem cachear HEAD, marker ou estado de freshness;
  • benchmark local/sanitizado reproduzível;
  • runbook de SLOs, recuperação e rollout futuro.

Este PR é empilhado sobre security/792-mcp-boundary e depende dos PRs #32, #36 e #37. Não amplia as tools e não altera o LexNotify produtivo.

Fora de escopo

  • merge, deploy ou rollout;
  • credenciais reais, TLS ou provedor corporativo de identidade;
  • testes de carga contra produção;
  • expansão de tools (#794);
  • mudanças nos fluxos Avancard/Fênix.

Contratos e segurança

A ordem integrada permanece: autenticação → autorização de projeto/tenant/tool → validação de entrada → freshness → execução → redaction/limite → auditoria. Assim, chamadores não autorizados não recebem SHA, contagens ou estado interno, mesmo quando o índice está stale.

Testes locais/sanitizados

  • pytest -q: 115 passed;
  • suíte integrada: 9 cenários;
  • segurança: 8;
  • lifecycle: 11;
  • freshness: 17;
  • git diff --check: limpo.

Cobertura integrada inclui: matriz auth×freshness; indexação/publicação durante leitura; falha de publicação sem substituir índice ativo; ENOSPC; rollback; snapshot corrompido; backend indisponível; marker/schema inválidos; timeout; compatibilidade de assinaturas; 500 chamadas concorrentes isoladas por tenant.

Carga medida — ambiente local/sanitizado

5000 chamadas, concorrência 32, índice sintético com 848 componentes:

  • antes do cache imutável: p50 230,98 ms; p95 326,72 ms; p99 364,98 ms; 136,45 req/s; 0 erros; RSS máx. 88.820 KiB;
  • depois: p50 112,84 ms; p95 184,00 ms; p99 214,89 ms; 274,60 req/s; 0 erros; RSS máx. 77.804 KiB.

Medição serial (1000 chamadas): p50 5,73 ms; p95 8,73 ms; p99 34,19 ms; 154,13 req/s; 0 erros; RSS máx. 58.732 KiB.

São medições locais, não SLOs comprovados em homologação/produção. O runbook separa objetivo proposto, resultado, ambiente e limitações.

Recuperação

  • candidato nunca é servido como ativo;
  • publicação usa troca atômica e preserva snapshot anterior;
  • falha mantém o índice válido;
  • rollback valida integridade e é auditado;
  • artefato defeituoso é preservado para investigação.

Rollback deste PR

Reverter os commits deste branch. O cache é interno e dispensável; nenhuma migração ou alteração de dados existe.

Riscos residuais

  • benchmarks são locais e sintéticos;
  • não há CI configurada observada no repositório do kit;
  • lock/rate limit são por processo/host;
  • identidade remota, TLS e storage distribuído exigem etapa futura autorizada;
  • PR permanece draft aguardando revisão humana e integração ordenada da pilha.

Checklist

@neomaike

Copy link
Copy Markdown
Contributor Author

Checkpoint de revisão Fase 4

Este PR foi revisado na base empilhada exata e permanece draft/mergeável, sem review humano ou thread pendente. A pilha combinada termina em 2bfa8edd67a0c8125a4b793c99d7c5c452ed56d2; o envelope de CI #40 termina em f9a1f11c5e9e664d1a709420685b757899fd99a7.

CI combinada: Python 3.10/3.12 e dependency audit/SBOM verdes no run https://github.com/MHX-Digital/agent-architecture-kit/actions/runs/30477544972. Validação local final: 123/123, secret scan 0 matches, compileall/diff check verdes.

Correções foram mantidas no PR que introduziu o comportamento: binding explícito do golden corpus ao commit no #32; fronteira autenticada sanitizada do corpus no #37. Nenhum gate foi relaxado.

Estado: implementado/testado; aguardando revisão humana; não integrado; não implantado. Rollback por revert dos commits da unidade, sem mutação de índice ou ambiente externo.

* ci: pin release-gate Python environment for #39

* ci: add aggregate-only high-confidence secret gate for #39

* ci: enforce MCP release gates for #39

* test(ci): lock down release workflow security contract

* test(ci): avoid secret-scanner filename false positive

* fix(ci): pin rpds version compatible with Python 3.10

* fix(runtime): parse Git UTC timestamps on Python 3.10

* test(runtime): cover Git Z timestamps on Python 3.10

* ci: publish short-lived CycloneDX SBOM for release evidence
@neomaike

Copy link
Copy Markdown
Contributor Author

Integração ordenada interrompida — divergência remota

Checkpoint em 2026-07-30 UTC:

Causa objetiva da falha: o workflow executa git log --check sobre todo o intervalo do PR #38. Isso volta a inspecionar o commit histórico 473a74a7245b25833142ec50ffdd34aa8368c411, que continha dois espaços finais posteriormente corrigidos por f00e8fbc2d23fe8fc2334528f8e3360cd305f034. O job para antes dos testes; o upload JUnit também falha porque o relatório não chegou a ser produzido.

Pelas condições de parada autorizadas — head inesperado e check obrigatório falhando — nenhum dos PRs #32, #36, #37 ou #38 foi integrado e nenhuma branch foi alterada por esta execução.

Próximo gate: decisão humana entre corrigir o gate para validar o estado final do diff (git diff --check) ou reescrever histórico. Recomenda-se a primeira opção, pois reescrever a pilha exigiria force push e foi expressamente proibido. Após correção em PR/commit próprio e CI verde no #38, revalidar a ordem restante antes de qualquer merge.

Corrige o gate da issue #39 sem reescrever histórico e sem alterar o comportamento do MCP.
@neomaike
neomaike changed the base branch from security/792-mcp-boundary to main July 30, 2026 18:12
@neomaike
neomaike marked this pull request as ready for review July 30, 2026 18:19
@neomaike
neomaike merged commit 926130c into main Jul 30, 2026
3 checks passed
@neomaike

Copy link
Copy Markdown
Contributor Author

Integração ordenada concluída — 2026-07-30 UTC

main avançou de 63921de34f5265f7c3cb7c45de2df9f43872e932 para 926130c7c9c1e54a6508c5a0cf30f3c012cb6f30.

Unidade Head revisado Merge resultante
PR #32 / #791 2e5a9f992c78b20420ea120d92072feeb7d1931e 02886de9f167eca9df389ef6a4dfa355084ff9c8
PR #36 / #793 39f37d69e75c006ef270b31fdbefe286d599c75f e5e919520741b2c61cb39c17cee451fe0385ed56
PR #37 / #792 10556be22914d540142e1044c098c86526fc3b1f f2e731925d59ef191d78cffa6e7099bd587edce5
PR #40 / #39 f9a1f11c5e9e664d1a709420685b757899fd99a7 46b58ccddd0a853817a0f927181080d667ee2a8d na branch #38
correção PR #45 / #39 bc421de2a8fa099284bf920796fcf525b17f2c85 84116f861aaab875e23ff50824e302f21fe44e99 na branch #38
PR #38 / #795 84116f861aaab875e23ff50824e302f21fe44e99 926130c7c9c1e54a6508c5a0cf30f3c012cb6f30 em main

O #40 já havia sido empilhado no #38; portanto seu conteúdo chegou a main pelo merge final do #38. Nenhum force push, bypass de proteção, deploy ou alteração do LexNotify foi realizado.

Validação no SHA final

Run manual exato: https://github.com/MHX-Digital/agent-architecture-kit/actions/runs/30570028307

  • Python 3.10: verde, 123 testes, 0 falhas;
  • Python 3.12: verde, 123 testes, 0 falhas;
  • dependency audit: verde;
  • sete suítes explícitas locais: 70/70;
  • suíte completa local: 123/123;
  • secret scan: 79 arquivos, 0 matches;
  • schemas, manifestos, compileall e whitespace gate: verdes;
  • as sete tools existentes permanecem nominalmente cobertas.

Artefatos novos, vinculados somente ao SHA final

  • arquivo Git determinístico: c9cb996338ce33d0e8895b83d98aeffcc4ea10d2d1908ad44b4aabc79541299c;
  • SBOM CycloneDX 1.4 (34 componentes): 4005c8a4937f996d4da87448249c85b4158d4325d28cf992fc6959b5f4583bcd;
  • JUnit Python 3.10: 5402ac5a8a407229045e06120dadcec03bfc03c02021a2946043c0238442da64;
  • JUnit Python 3.12: 18750397c61ef086c02babb33a3ae50174e88e79ce61550656181525039d56d7.

Os artefatos da RC anterior não foram reutilizados ou reatribuídos.

Estado: integrado e validado localmente/na CI; não implantado; canário não executado. Próximo gate: autorização humana explícita para o canário sanitizado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant