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.
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.
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.
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.
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.
| # | Componente | O que faz, e por que está aí |
|---|---|---|
| 1 | Navegador | Aplicação única do tenant. Envia anexo direto ao armazenamento com URL pré-assinada — o byte do arquivo nunca passa pela API. |
| 2 | Fornecedor | Nã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. |
| 3 | CloudFront + S3 | As duas aplicações de tela são estáticas. Nada de servidor de frontend. |
| 4 | ALB + WAF | Entrada única. O firewall de aplicação existe por causa do Portal, a única superfície aberta à internet. |
| 5 | API | Sem estado, n réplicas. Escala com requisição. Não registra job nem consumidor de fila. |
| 6 | Worker | Relay do outbox, jobs agendados, fila de aviso e varredura de arquivo. É o segundo processo — e é ele que torna os sete bloqueios urgentes. |
| 7 | Portal | Só as rotas públicas do fornecedor. Mesmo banco, mesmo domínio, host separado. |
| 8 | RDS PostgreSQL | Primário. Toda invariante mora aqui, e é o único lugar onde a Trava 1 e a Trava 3 se sustentam. |
| 9 | Réplica de leitura | Ainda 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. |
| 10 | ElastiCache Redis | Cache, trava distribuída e lista de revogação de token — que hoje vive em memória de processo. Nunca guarda verdade. |
| 11 | SQS + DLQ | Transporte do outbox. Fila de mensagens mortas nativa; ordenação por grupo só onde a ordem muda o resultado. |
| 12 | S3 | Arquivo. O provedor já vem pronto no framework, com URL pré-assinada. Ver GrydFiles. |
| 13 | Secrets Manager | Credencial e rotação sem redeploy. |
| 14 | CloudWatch + OTel | O framework já emite rastro com identificador de tenant e de usuário. É ligar, não construir. |
| 15 | ECR + Actions | Imagem e entrega. O código e os pacotes do framework já vivem no GitHub. |
| 16 | GrydAuth | Serviç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. |
| 17 | Migration | Ainda é 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.
| Exigência já publicada | O que cobra do banco | Consequê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 custo | Restrição de exclusão por intervalo | Nativa 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 repetido | Incrementar e ler o valor no mesmo comando | Postgres e Oracle diretamente; SQL Server por cláusula equivalente. Sem isso, a corrida volta. |
| Saldo do nó de orçamento sob concorrência | Trava de linha explícita | Existe em todos os candidatos, com semântica diferente. Ver o ADR 5. |
| Snapshot congelado e configuração por tenant | Documento dentro do campo | Postgres e SQL Server. O framework já usa para as configurações do tenant. |
| Busca do catálogo por texto aproximado | Índice de trigrama | Nativo 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ça | Papel | Quando entra |
|---|---|---|
| PostgreSQL | Sistema de registro. Toda invariante mora aqui. | v1 |
| Redis | Cache, trava distribuída, lista de revogação de token e o transporte do ADR 6. Nunca guarda verdade. | antes do 2º processo |
| Armazenamento de objeto | Arquivo. O framework já entrega a abstração com URL pré-assinada de upload. Ver GrydFiles. | v1 |
| Réplica de leitura | Relatório e consulta pesada saindo do caminho transacional. | quando o relatório competir com o transacional |
| Índice de busca externo | Busca do catálogo. | acima de ~500 mil itens ou p95 de busca > 300 ms |
| Armazém analítico | Aná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
- Índices, planos de consulta, limites de listagem e projeções para leituras frequentes.
- Separar capacidade de API, Portal e Worker pelos perfis existentes; medir fila, latência e custo.
- Réplicas de leitura ou particionamento apenas com gatilho observado de volume/tempo de manutenção.
- 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.
| Perfil | O que registra | Réplicas | Por que separado |
|---|---|---|---|
| API | Rotas do tenant, autenticadas | n | Sem estado. Escala com requisição e é o único perfil no caminho do usuário. |
| Worker | Relay do outbox, jobs agendados, fila de aviso, varredura de arquivo | 1 ou n com trabalho particionado | Trabalho de fundo não pode competir com requisição nem disparar uma vez por réplica. É a causa direta do bloqueio 2. |
| Portal | Só as rotas públicas do fornecedor | n | Modelo de autenticação diferente do tenant, exposto na internet aberta. Raio de falha e superfície de ataque isolados. Ver Portal do Fornecedor. |
| Migration | Só o migrador; roda até o fim e sai | 1, no pipeline | Com 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.
| Necessidade | Serviço | Por quê |
|---|---|---|
| Executar os quatro perfis | ECS Fargate | Contêiner sem nó para manter. Kubernetes é imposto fixo: paga-se em toda semana, não só na de pico. |
| Sistema de registro | RDS PostgreSQL Multi-AZ | Custo previsível e baixo no começo. Aurora quando o teto de leitura importar de verdade — não antes. |
| Cache, trava e fila leve | ElastiCache Redis | Também é onde some a lista de revogação de token, hoje em memória. |
| Arquivo | S3 | O provedor já existe pronto no framework, com URL pré-assinada de upload — o arquivo nem passa pela API. |
| Transporte do outbox | SQS | Fila 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ção | Secrets Manager | Rotação sem redeploy; nada de credencial em variável de ambiente escrita à mão. |
| Entrada | ALB + WAF | O WAF é por causa do Portal, que é a única superfície aberta à internet. |
| Observabilidade | CloudWatch + OpenTelemetry | O framework já emite rastro com identificador de tenant e de usuário. É ligar, não construir. |
| Imagem e entrega | ECR + GitHub Actions | O 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
| Estado | Evidência / limite |
|---|---|
| Estrutura implementada | Nexio 23eedd8: quatro hosts, sete contextos e contratos, DbContext compartilhado e testes de composição/arquitetura. Modelo transacional e adaptadores ainda não entregues. |
| Plataforma consumida | Referê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 branch | Revisã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 operar | Migraçõ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 existentes | 163 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ão | Gatilho de revisão |
|---|---|
| ADR 1 · Estilo | Dois 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ência | A 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ção | Worker saturado → particionar por fila em vez de aumentar a réplica. Portal com perfil de carga próprio → dimensionamento separado. |
| ADR 4 · Integração | Segundo 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ência | Contenção medida no nó de centro de custo, não suposta. |
| ADR 6 · Fila | Volume de aviso que a fila gerenciada não absorva — improvável antes de ordens de grandeza acima da meta. |
| ADR 7 · Nuvem | Cré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.