Decisão · Arquitetura

Arquitetura

Sete decisões — e a primeira já estava tomada antes de a discussão começar: quatro regras escritas nas specs de negócio eliminam a arquitetura de microserviços sozinhas. Esta página escreve o que elas implicam (um processo, um banco, um outbox), calibra o desenho para um time de uma a três pessoas e uma meta de centenas de tenants, e nomeia os sete pontos que hoje impedem o segundo processo de subir sem duplicar aviso e perder efeito. Substitui o documento de arquitetura de maio de 2026, escrito contra um escopo que já não existe.

7 decisões · 1 desenho · 7 contextos · escada de 7 degraus · 7 bloqueios calibrada para time de 1 a 3 · centenas de tenants · milhares de usuários substitui o documento de arquitetura de maio de 2026 v1.3 · 09/09/2026

Ponto de partida

O que já estava decidido, sem ninguém votar

Quatro regras foram escritas nas specs de negócio por razões que nada tinham a ver com infraestrutura. Juntas, elas decidem a fronteira do sistema — e é por isso que valem: são exigências do domínio, e o desenho que não as honra não é mais simples, é errado.

Trava 1 · Transação

Desfecho e efeito na mesma unidade de trabalho. A aprovação chama explicitamente o módulo dono e o orçamento na transação produtora. Falha técnica reverte a operação; insuficiência de verba na última aprovação é um desfecho de negócio: grava o voto e devolve o documento por falta de orçamento na mesma transação, sem concluir aprovação financeira nem gerar empenho. Pedido já emitido conserva sua versão efetiva durante a análise da alteração. Ver Fluxo de Aprovação.

Trava 2 · Motor universal

Um motor de aprovação sobre dez processos. REQUISITION, QUOTATION, PURCHASE_ORDER, CONTRACT, SUPPLIER_REGISTRATION, SUPPLIER, BANK_ACCOUNT_CHANGE, ITEM, BUDGET e BUDGET_CHANGE passam pelo mesmo motor. Quebrar os domínios em serviços obriga ou um orquestrador distribuído, ou o motor replicado dez vezes — e dez cópias de uma regra de alçada é a definição de defeito futuro.

Trava 3 · Saldo

Razão de orçamento append-only em três estágios. O saldo de um nó é leitura consistente sobre lançamentos que nunca são reescritos. Duas aprovações simultâneas no mesmo nó precisam se enxergar — e a consequência do erro é verba estourada sem ninguém ter aprovado o estouro. Isso exige serialização por nó, no mesmo banco onde o lançamento é gravado. Ver Orçamento.

Trava 4 · Recorte

Três mecanismos por contexto de persistência. Filtro global de tenant, soft delete por interceptor e resolução do UserCompanyScope a cada requisição são mecânica por DbContext, não por serviço. Cada contexto de persistência novo reimplementa os três — e o terceiro falha aberto: se a guarda não roda, o dado de outra empresa aparece. Ver Empresa.

A decisão de banco deixa de estar em aberto aqui — e a regra de escrita das specs não muda. Desde 08/09/2026 nenhuma spec de negócio usa um banco como premissa: mecânica em termos neutros, recurso específico citado só como exemplo com equivalente. Isso continua valendo. O que esta página fecha é a linha “Banco de dados · a decidir” do Modelo de Classes — uma decisão de implementação, que não autoriza a spec a escrever tipo proprietário.

Desenho · novo em v1.1

Como isso fica de pé

O mesmo código-fonte gera quatro perfis e usa um sistema de registro compartilhado. Serviços gerenciados reduzem tarefas de infraestrutura, mas ainda exigem configuração, monitoramento, migração, retenção e restauração. O tracejado indica dependência proposta, não disponível.

quem usa AWS · sa-east-1 borda VPC ECS Fargate dados gerenciados Navegador SPA do tenant 1 Fornecedor sem conta do tenant 2 CloudFront + S3 SPA e portal, estáticos 3 ALB + WAF entrada única 4 API n réplicas · rotas do tenant 5 Worker outbox · jobs · fila · varredura 6 Portal rotas públicas do fornecedor 7 RDS PostgreSQL primário · registro 8 Réplica de leitura degrau 2 · não existe 9 ElastiCache Redis cache · trava 10 SQS + DLQ transporte do outbox 11 S3 arquivo · URL assinada 12 Secrets Manager credencial e rotação 13 CloudWatch + OTel rastro por tenant 14 ECR + Actions imagem e entrega 15 GrydAuth serviço separado 16 Migration tarefa do pipeline 17
Legenda
#ComponenteO que faz, e por que está aí
1NavegadorAplicação única do tenant. Envia anexo direto ao armazenamento com URL pré-assinada — o byte do arquivo nunca passa pela API.
2FornecedorNão tem conta no tenant. A plataforma não tem o conceito de usuário externo, e é por isso que o Portal é perfil próprio. Ver Portal do Fornecedor.
3CloudFront + S3As duas aplicações de tela são estáticas. Nada de servidor de frontend.
4ALB + WAFEntrada única. O firewall de aplicação existe por causa do Portal, a única superfície aberta à internet.
5APISem estado, n réplicas. Escala com requisição. Não registra job nem consumidor de fila.
6WorkerRelay do outbox, jobs agendados, fila de aviso e varredura de arquivo. É o segundo processo — e é ele que torna os sete bloqueios urgentes.
7PortalSó as rotas públicas do fornecedor. Mesmo banco, mesmo domínio, host separado.
8RDS PostgreSQLPrimário. Toda invariante mora aqui, e é o único lugar onde a Trava 1 e a Trava 3 se sustentam.
9Réplica de leituraAinda não existe. É o degrau 2 da escada de escala, e o desenho já reserva o lugar dela para que a decisão de roteamento seja tomada antes, não depois.
10ElastiCache RedisCache, trava distribuída e lista de revogação de token — que hoje vive em memória de processo. Nunca guarda verdade.
11SQS + DLQTransporte do outbox. Fila de mensagens mortas nativa; ordenação por grupo só onde a ordem muda o resultado.
12S3Arquivo. O provedor já vem pronto no framework, com URL pré-assinada. Ver GrydFiles.
13Secrets ManagerCredencial e rotação sem redeploy.
14CloudWatch + OTelO framework já emite rastro com identificador de tenant e de usuário. É ligar, não construir.
15ECR + ActionsImagem e entrega. O código e os pacotes do framework já vivem no GitHub.
16GrydAuthServiço separado, integrado por HTTP — é o único salto de rede fora do processo. Serve o diretório de usuários; não está no caminho de nenhuma transação de negócio, e é por isso que ser um serviço à parte não custa nada.
17MigrationAinda é o bloqueio 7. Hoje roda no arranque da aplicação; passa a ser tarefa do pipeline, executada uma vez antes de trocar as réplicas.

Os contextos de negócio compartilham processo e transação quando necessário; integrações externas passam pelos adaptadores. Custo, capacidade de banco e replicas dependem de medição. Migrator já existe como host estrutural; sua cobertura das migrações e segurança de operação ainda precisam ser demonstradas.

ADR 1 · Estilo

Monolito modular, com fronteira compilada

Decisão. O backend do Nexio é uma aplicação, organizada por bounded context em projetos separados, cada contexto referenciando apenas o contrato publicado pelos outros — nunca a entidade. A escala horizontal vem de réplicas sem estado atrás de um balanceador, não de fatiar o domínio.

Monolito modular reduz coordenação e custo operacional para um time de uma a três pessoas, preservando atomicidade entre aprovação, documento e orçamento. Serviços separados exigiriam outro protocolo de consistência e evidência de benefício para justificar esse custo.

A carga não pede outra coisa. Microserviço resolve problema de time e de ciclo de deploy, não problema de requisição por segundo — quem resolve carga é a réplica, e a réplica é a mesma imagem rodando n vezes. Com um time de uma a três pessoas, cada serviço a mais é um pipeline, um alerta, um esquema, uma versão de contrato e um modo de falha novo — pagos todo mês, começando no primeiro mês.

O próprio Gryd.IO já pratica essa fronteira: módulo por pasta, DbContext e migrations próprios, e referência cruzada sempre para o .Core do outro módulo. O Nexio copia o padrão em vez de inventar.

As três regras da fronteira

Um projeto por contexto

Organização · Catálogo · Fornecimento · Orçamento · Aprovação · Espinha transacional · Transversais. A fronteira é referência de projeto, não convenção de pasta: o compilador recusa o atalho.

Nenhuma chave estrangeira cruza contexto

Referências entre contextos usam IDs e contratos, sem navegações indiscriminadas. FKs estratégicas e consultas de relatório controladas são permitidas na persistência, com registro de responsabilidade, filtros e plano de migração.

A fronteira é testada, não confiada

Um teste de arquitetura no CI reprova referência proibida entre projetos. Sem isso, a fronteira dura até a primeira sexta-feira apertada — e a extração futura vira reescrita em vez de mudança de host.

Descartado: microserviços por domínio — saga sobre dinheiro, motor de aprovação replicado dez vezes, três mecanismos de recorte reimplementados por serviço, com um time de três pessoas. Monolito sem fronteira compilada — barato hoje e caríssimo no dia da extração, porque a fronteira que ninguém verifica não existe.

Contrato vigente · revisão consolidada

Módulos, contratos e persistência

Preservar monolito modular: Organization, Catalog, Reference, Approval, Budget, Sourcing e Procurement expõem contratos sem importar Core de outro contexto. SharedKernel contém apenas tipos estáveis comuns; Platform adapta dependências externas; Persistence implementa portas e mapeia o banco compartilhado.

O NexioDbContext compartilhado simplifica transações para um time de uma a três pessoas. É uma escolha de implementação, não condição técnica absoluta: EF Core permite compartilhar transação entre DbContexts quando compartilham DbConnection e DbTransaction. Coordenar vários contextos requer esse contrato explícito e testes; conexão ao mesmo banco, sozinha, não basta.

Integridade estratégica: referências entre contextos continuam por IDs e contratos, sem navegações indiscriminadas. FK composta por tenant/empresa pode ser autorizada para invariantes importantes, com dono, justificativa, comportamento de exclusão, impacto de migração e registro de exceção. Descritores polimórficos não ganham FK fictícia; combinam validação atômica e reconciliação.

Relatórios: permitir consultas SQL/read models controlados e joins entre contextos na camada de leitura, com contrato de colunas, filtros de tenant/empresa e limites de custo. Nenhum relatório escreve em outro módulo. Evitar N+1 por chamadas repetidas; usar consultas em lote ou projeções reconstruíveis.

Os testes atuais de PersistenceBoundaryTests proíbem toda FK/navegação entre contextos, e o modelo ainda está vazio. Antes de introduzir a primeira exceção estratégica, adaptar os testes para validar o registro de exceções e as guardas. Este PR muda a decisão documental, não os testes ou o runtime.

ADR 2 · Persistência

Um sistema de registro, e ele é PostgreSQL

Decisão. PostgreSQL é o único sistema de registro. Redis e armazenamento de objeto são coadjuvantes — cache, trava e arquivo, nunca verdade. Qualquer outro armazenamento que venha a existir é derivado e descartável: pode ser reconstruído a partir do Postgres sem perda.

A escolha não saiu de preferência: saiu das exigências que as specs já escreveram. Cada linha abaixo é um requisito publicado, e a coluna do meio é o que ele cobra do banco.

O que as specs exigem do banco — e o que isso elimina
Exigência já publicadaO que cobra do bancoConsequência da escolha
Soft delete global com unicidade preservadaÍndice único parcial (WHERE isDeleted = false)Elimina MySQL e MariaDB, que não têm. A plataforma já depende disso na unicidade da preferência de usuário.
Vigência sem sobreposição — preço de fornecedor, atribuição de centro de custoRestrição de exclusão por intervaloNativa só no Postgres. Nos demais, a garantia migra para trava na aplicação — que com n réplicas precisa de trava distribuída.
Sequência de numeração sem número repetidoIncrementar e ler o valor no mesmo comandoPostgres e Oracle diretamente; SQL Server por cláusula equivalente. Sem isso, a corrida volta.
Saldo do nó de orçamento sob concorrênciaTrava de linha explícitaExiste em todos os candidatos, com semântica diferente. Ver o ADR 5.
Snapshot congelado e configuração por tenantDocumento dentro do campoPostgres e SQL Server. O framework já usa para as configurações do tenant.
Busca do catálogo por texto aproximadoÍndice de trigramaNativo no Postgres — o que adia o motor de busca externo por muito tempo. Ver os gatilhos.

Caminho materializado de árvore (categoria, centro de custo, plano de contas) não entra nesta tabela: a mecânica foi escrita em termos neutros — texto com prefixo escapado — justamente para não depender de tipo proprietário. Continua assim.

Um banco de registro, não dois

A regra é simples e vale para sempre: uma verdade só. O que mais existir é derivado.

PeçaPapelQuando entra
PostgreSQLSistema de registro. Toda invariante mora aqui.v1
RedisCache, trava distribuída, lista de revogação de token e o transporte do ADR 6. Nunca guarda verdade.antes do 2º processo
Armazenamento de objetoArquivo. O framework já entrega a abstração com URL pré-assinada de upload. Ver GrydFiles.v1
Réplica de leituraRelatório e consulta pesada saindo do caminho transacional.quando o relatório competir com o transacional
Índice de busca externoBusca do catálogo.acima de ~500 mil itens ou p95 de busca > 300 ms
Armazém analíticoAnálise histórica multi-tenant.não antes do primeiro cliente pagante

Multiempresa e a porta de saída para isolamento físico

Esquema único com tenantId em toda tabela, com o filtro global do framework. É o que o produto precisa para centenas de tenants, e é o que mantém o custo baixo enquanto os primeiros clientes são pequenos.

A porta de saída já existe no framework: o resolvedor de conexão por tenant e o orquestrador de migrations por tenant suportam banco por tenant. Para que ela continue aberta — e ela vai ser usada, porque cliente grande pede isolamento físico —, vale uma regra desde já: nenhum código assume conexão única. A conexão é sempre resolvida pelo contexto de tenant, mesmo quando a resposta é a mesma para todos. Provar o caminho uma vez, com um tenant de teste apontando para outro banco, custa pouco agora e evita redesenho depois.

Descartado: banco de documento — o domínio é invariante pura, com transação sobre dez tabelas num ato só; a consequência do erro é fiscal. Dois sistemas de registro — dobra a conciliação sem resolver nada que a réplica de leitura não resolva. Banco por tenant na v1 — paga o custo operacional do isolamento antes de existir cliente que o exija.

Contrato vigente · revisão consolidada

Escalar mediante evidência

  1. Índices, planos de consulta, limites de listagem e projeções para leituras frequentes.
  2. Separar capacidade de API, Portal e Worker pelos perfis existentes; medir fila, latência e custo.
  3. Réplicas de leitura ou particionamento apenas com gatilho observado de volume/tempo de manutenção.
  4. Isolamento físico de tenant ou contexto somente com necessidade contratual ou operacional demonstrada, com projeto de migração e revisão das transações.

Particionar antes de dados reais aumenta operação para um time pequeno. PostgreSQL exige que chaves únicas de tabela particionada incluam a chave de partição; preservar idempotência global deve fazer parte da decisão. Separar bancos exige mover dados, rever FKs, backup, relatórios e atomicidade; não é apenas configuração.

ADR 3 · Implantação

Um código-fonte, quatro perfis de execução

Decisão. A mesma solução gera quatro perfis: API, Worker, Portal e Migration. Não são serviços — não têm banco próprio, nem contrato de rede entre si, nem versão independente. São recortes de superfície do mesmo código, e é isso que dá isolamento de falha e de escala sem pagar o preço do sistema distribuído.

Os quatro perfis
PerfilO que registraRéplicasPor que separado
APIRotas do tenant, autenticadasnSem estado. Escala com requisição e é o único perfil no caminho do usuário.
WorkerRelay do outbox, jobs agendados, fila de aviso, varredura de arquivo1 ou n com trabalho particionadoTrabalho de fundo não pode competir com requisição nem disparar uma vez por réplica. É a causa direta do bloqueio 2.
PortalSó as rotas públicas do fornecedornModelo de autenticação diferente do tenant, exposto na internet aberta. Raio de falha e superfície de ataque isolados. Ver Portal do Fornecedor.
MigrationSó o migrador; roda até o fim e sai1, no pipelineCom n réplicas, migrar no start é corrida — e a corrida acontece exatamente no deploy que muda o esquema.

A consequência prática cabe numa frase: o registro de serviços passa a depender do perfil. O Worker não registra controller; a API não registra job nem consumidor de fila; o Portal registra um conjunto reduzido de rotas e nenhuma delas exige token de tenant. Um teste de fumaça por perfil basta para provar que a separação não escorregou.

Descartado: tudo num processo só — é o desenho de hoje, e é o que a fila em memória força; quebra na segunda réplica. Função sem servidor para a API — partida a frio e o custo de inicialização do ORM pesam num backend transacional, e a transação da Trava 1 não ganha nada com isso. Portal como serviço com banco próprio — duplicaria o cadastro de fornecedor e a cotação, que é justamente o dado que ele existe para escrever.

Contrato vigente · revisão consolidada

Transações, eventos e outbox

Efeito obrigatório é chamada explícita dentro da transação. Eventos em memória saem depois do commit produtor e são reservados a reações cuja perda seja aceitável. Convite, aviso crítico, integração ERP e projeção obrigatória precisam de registro durável.

Gryd.IO fornece o mecanismo do outbox; cada contexto produtor possui tabela, mapeamento e migração, gravados junto do fato. O negócio define significado e versão; o consumidor deduplica junto de seu efeito. Tabela central em banco separado não cumpre atomicidade. Regras de coleta, lease e ordem estão em Eventos e outbox.

Fila gerenciada é transporte, não sistema de registro. Confirmação de envio não significa aplicação no ERP. Wolverine continua adiado: o spike é evidência limitada de compatibilidade, não adoção aprovada.

ADR 5 · Concorrência

Três mecanismos, cada um onde o dano seria

Decisão. Token de versão no agregado, trava de linha no saldo do nó de orçamento, chave de idempotência na borda. Nada de bloqueio global e nada de isolamento serializável em toda transação.

Token de versão otimista

As specs já pedem version inteiro e expectedVersion na escrita. A entidade base do framework não tem coluna de versão, e alterar a base é mudança que atravessa todos os módulos — então o token é coluna do agregado do Nexio. Onde a corrida é sobre estado, há precedente melhor na própria plataforma: marcar a coluna de estado como token de concorrência, que é como o vínculo entre tenants resolve duas decisões simultâneas.

Saldo materializado, sob trava de linha

O razão continua append-only, mas o saldo é materializado e atualizado na mesma transação do lançamento, com trava da linha do nó. Somar o razão a cada leitura não sobrevive a duas aprovações simultâneas no mesmo nó — as duas leem o saldo antigo, as duas passam, e a verba estoura sem que ninguém tenha aprovado o estouro. A contenção fica no nó, que é onde a concorrência real acontece, e não na tabela inteira.

Idempotência na borda

Toda rota de ato e todo consumidor de fila aceitam chave de idempotência: repetir a mesma chave devolve o mesmo resultado e não duplica efeito. É o par obrigatório da entrega “pelo menos uma vez” do ADR 4, e é também o que protege o duplo clique do usuário.

Descartado: bloqueio pessimista amplo — transforma contenção pontual em fila global. Isolamento serializável por padrão — troca corrida por tempestade de retentativa, sem ganho onde o token de versão já basta. Alterar a entidade base do framework para ganhar versão — muda todos os módulos de todos os produtos para resolver uma necessidade de um.

Contrato vigente · revisão consolidada

Fila, jobs e composição dos perfis

O isolamento dos quatro perfis deve ser demonstrado pela lista efetiva de hosted services e por execução. API e Portal não consomem filas ou executam schedulers de negócio; Worker executa os consumidores registrados; Migrator executa migrações exclusivas e termina.

Há implementações em processo na plataforma. Nem toda inscrição é TryAdd: o scheduler de GrydJobs usa registro que exige substituição explícita ou adaptação da composição. Avaliar o adaptador GrydNotifications.Scheduling existente e controlar EnableQueue e hosted services de limpeza/processamento. Trocar apenas uma interface não prova que os demais loops foram desligados.

PlatformModule ainda é ponto vazio de composição no Nexio. Adaptações, identidade de worker, leases e testes com dois processos são pendências anteriores ao primeiro cliente; não capacidades já entregues pelo pacote 5.0.2.

ADR 7 · Nuvem

AWS, tudo gerenciado, região de São Paulo

Decisão. AWS em sa-east-1, com contêiner sem servidor para operar — nada de orquestrador de contêineres administrado pelo time. O critério que ordena todas as escolhas abaixo é um só: quantas horas por mês essa peça custa a um time de três pessoas.

De necessidade a serviço
NecessidadeServiçoPor quê
Executar os quatro perfisECS FargateContêiner sem nó para manter. Kubernetes é imposto fixo: paga-se em toda semana, não só na de pico.
Sistema de registroRDS PostgreSQL Multi-AZCusto previsível e baixo no começo. Aurora quando o teto de leitura importar de verdade — não antes.
Cache, trava e fila leveElastiCache RedisTambém é onde some a lista de revogação de token, hoje em memória.
ArquivoS3O provedor já existe pronto no framework, com URL pré-assinada de upload — o arquivo nem passa pela API.
Transporte do outboxSQSFila de mensagens mortas nativa, ordenada por grupo quando preciso, cobrança por uso. Publicação em leque só quando houver o segundo consumidor.
Segredo e configuraçãoSecrets ManagerRotação sem redeploy; nada de credencial em variável de ambiente escrita à mão.
EntradaALB + WAFO WAF é por causa do Portal, que é a única superfície aberta à internet.
ObservabilidadeCloudWatch + OpenTelemetryO framework já emite rastro com identificador de tenant e de usuário. É ligar, não construir.
Imagem e entregaECR + GitHub ActionsO código já vive no GitHub e os pacotes do framework já vêm de lá.

Por que São Paulo

Dado de compra de empresa brasileira, com nota fiscal, CNPJ e fornecedor identificado. Manter o dado no país é resposta pronta na primeira reunião de segurança do primeiro cliente médio — e a latência para o usuário é consequência gratuita. É argumento comercial antes de ser técnico.

O que isso custa e o que não prende

No começo a conta é dominada por banco e balanceador, não por computação: o Fargate de dois perfis pequenos é a menor linha da fatura. E a portabilidade real está preservada onde importa — o armazenamento de arquivo já é abstraído em três provedores pelo framework, e fila e cache ficam atrás de interface do Nexio. Trocar de nuvem custaria infraestrutura, não domínio.

Descartado: Kubernetes gerenciado — capacidade que o time não tem e não vai ter no ano. Aurora Serverless v2 na largada — tem piso de capacidade, e no cenário de poucos usuários custa mais, não menos. Azure — defensável para uma casa .NET, e sem motivo concreto (crédito, exigência de cliente, time que já opera) não paga a mudança. Nuvem do cliente ou instalação local — mudaria a fila, o agendamento e a entrega inteira; se virar exigência comercial, é revisão do ADR 3 e do ADR 7 juntos, não ajuste.

Contrato vigente · revisão consolidada

Estado real e pendências operacionais

EstadoEvidência / limite
Estrutura implementadaNexio 23eedd8: quatro hosts, sete contextos e contratos, DbContext compartilhado e testes de composição/arquitetura. Modelo transacional e adaptadores ainda não entregues.
Plataforma consumidaReferências Gryd 5.0.2 nos projetos. Checkout develop a4e8260 não contém o outbox proposto; comportamento do código-fonte e disponibilidade do pacote devem ser verificados separadamente.
GrydFiles parcial em branchRevisão 879dd954 preserva trabalho parcial; scan é stub e métodos de consulta/download ainda têm NotImplementedException. Não comprova liberação e download seguro ponta a ponta.
Pendências antes de operarMigrações de todos os contextos/módulos, autorização empresarial, consumidores isolados, revogação de sessão/cache, inbox/outbox, reconciliação e restore ensaiado.
Testes existentes163 testes na revisão-base: 42 de base, 117 de arquitetura, 4 de composição. Não comprovam concorrência de orçamento, entrega ERP, scan real, RLS ou restauração em produção.

Manutenção

Quando revisar cada decisão

Decisão de arquitetura sem gatilho vira dogma: ninguém revisa porque ninguém sabe o que observar. Cada linha abaixo é um sinal observável — quando ele aparecer, a decisão correspondente volta à mesa; enquanto não aparecer, não volta.

DecisãoGatilho de revisão
ADR 1 · EstiloDois donos de contexto com colisão real de deploy; ou um contexto com necessidade de escala dez vezes diferente dos outros. Crescer o time não é gatilho sozinho. Dentro da organização do backend há mais dois, menores: quatro projetos por contexto quando um contexto ganhar dono próprio, e controllers em projeto por contexto quando duas pessoas colidirem em endpoints diferentes.
ADR 2 · PersistênciaA escada de sete degraus tem gatilho próprio por degrau — ver a seção de escala. Fora dela: cliente exigindo isolamento físico → partição por tenant, pelo caminho que o framework já tem; catálogo acima de ~500 mil itens ou p95 de busca acima de 300 ms → índice externo.
ADR 3 · ImplantaçãoWorker saturado → particionar por fila em vez de aumentar a réplica. Portal com perfil de carga próprio → dimensionamento separado.
ADR 4 · IntegraçãoSegundo consumidor do mesmo evento → publicação em leque. Necessidade de reconstruir estado a partir do histórico → aí, e só aí, log de eventos.
ADR 5 · ConcorrênciaContenção medida no nó de centro de custo, não suposta.
ADR 6 · FilaVolume de aviso que a fila gerenciada não absorva — improvável antes de ordens de grandeza acima da meta.
ADR 7 · NuvemCrédito relevante de outro provedor, exigência contratual de cliente, ou entrega em nuvem do cliente.

Contrato vigente · revisão consolidada

Sequência e requisitos antes do primeiro cliente

Antes da implementação transacional: contratos de linha/revisão/parcela, propriedade de dados ERP, autorização empresarial, dinheiro, razão e aprovação. Compras diretas exigem ao menos entrada rastreável de demanda, estoque e programação externos; estoque e MRP não passam a ser responsabilidade do Nexio.

Antes do primeiro cliente: migrador exclusivo cobrindo Nexio e módulos Gryd; backups de banco e objetos, definição de RPO/RTO e teste de restauração; filtros de workers, revogação de sessões, retry/reprocessamento, observabilidade, limites por tenant e retenção. Mudança de esquema usa expansão/contração compatível; migração falha não inicia versão incompatível. Operação manual de reconciliação deve existir antes de automatizar integralmente o ERP.

Antes da IA: dados de decisão e alternativas, fontes e atualidade, restrições, resultados observados e avaliação com baseline. Infraestrutura dedicada de modelos, feature store e isolamento físico aguardam evidência. Contratos mínimos em Contratos transacionais.