Andrade Systems
FiveM
Framework próprioFiveMEm desenvolvimento

TRIAD

Framework próprio · Lua 5.4

Framework FiveM escrito do zero, desenvolvido após análise de vRP, ESX, QBCore e Mercy.

Decisões registradas
9 ADRs

cada uma com alternativas e evidência

Lua nos cinco resources
7.333 linhas

mais 4.580 na bancada de benchmark

Migrations versionadas
9
Documentos técnicos
38

Contexto

O que é

TRIAD é um framework de servidor FiveM escrito do zero. As bases existentes foram lidas para saber o que não repetir — e o documento mais importante da fase inicial não é uma comparação de recursos, é a lista de erros de produção que já custaram caro. Cada um virou uma regra da casa.

A ordem de prioridade está escrita no repositório e serve para resolver empate: performance, estabilidade, segurança, experiência do jogador, qualidade visual, facilidade de estender, velocidade de desenvolvimento. A prioridade técnica declarada é performance, estabilidade, segurança, experiência do jogador, qualidade visual, extensibilidade e velocidade de desenvolvimento; benchmarks prevalecem quando há conflito entre alternativas.

A consequência prática dessa última regra é que a fundação foi medida antes de ser construída. Onde não existe número, a documentação escreve "não medido" em vez de opinar — e há nove registros de decisão, cada um com as alternativas consideradas e a evidência que decidiu.

Arquitetura explorável · em desenvolvimento

Cinco responsabilidades.
Fronteiras explícitas.

Quem pode agir? Onde ficam os itens? O que aparece na tela? Cada módulo cuida de uma parte do jogo. Explore o mapa para entender essa divisão e as decisões que a sustentam.

triad-core selecionado. A descrição e as decisões estão a seguir.

Núcleo · Lua 5.4

triad-core

Arquitetura e evidências do módulo →

As partes do jogo precisam conversar e registrar o que aconteceu. O CORE fornece essa base comum, com regras explícitas para cada pedido e resposta.

Responsabilidade

A base de tudo: chamada remota com esquema obrigatório, persistência, razão econômico, limite por balde de tokens, resultado e rastreio.

Fronteira

Cada export é função nomeada com contrato declarado. Mudar exige subir a versão da API.

Lua, mesmo com o Node medido como mais rápido.

Por que foi escolhido

A vantagem do Node aparece em computação pura, de 2 a 12×, e o orçamento real é dominado por espera de banco e travessia de fronteira — centenas de nanossegundos dentro de milissegundos. Além disso, só arquivo Lua é protegível pelo mecanismo de escrow da plataforma, o que importa para distribuir o framework.

O que custou

Abre mão de desempenho em laços numéricos pesados. Se algum subsistema futuro for de fato limitado por CPU, a decisão precisa ser reaberta com número novo.

Conta, sessão e capacidades · Lua 5.4

triad-identity

Arquitetura e evidências do módulo →

Antes de permitir uma ação, é preciso saber quem está jogando e o que essa pessoa pode fazer. Aqui ficam conta, sessão, personagem e permissões.

Responsabilidade

Quem é este jogador e o que ele pode. Conta, sessão, personagem e capacidades — checadas em memória, nunca no banco.

Fronteira

A identidade tem regras duras e escritas: o identificador da conexão nunca é identidade; nenhum identificador vindo do cliente é aceito; contas de terceiros servem para reconhecer, nunca para ancorar; e endereço de rede está explicitamente na lista de rejeitados, com o motivo ao lado, no lugar exato onde alguém o acrescentaria por engano.

Interação com o mundo · Lua 5.4

triad-world

Arquitetura e evidências do módulo →

Os pontos com que o jogador interage precisam ter um responsável. Este módulo organiza esses alvos e os registra novamente quando o módulo reinicia.

Responsabilidade

Interação com o mundo: registro de alvos com ownership decidido pelo motor, e re-registro depois que o resource reinicia.

Fronteira

Sem essa fronteira, cada organização do servidor teria um desenho diferente para a mesma coisa: um para a polícia, outro para a mecânica, um terceiro para o script comprado.

Itens e containers · Lua 5.4

triad-assets

Arquitetura e evidências do módulo →

Itens representam valor dentro do jogo. Este módulo organiza itens e seus recipientes no servidor, sem entregar à tela do jogador uma forma genérica de criá-los.

Responsabilidade

Núcleo de itens e containers. Primitiva de servidor, sem nenhuma porta genérica de criar valor e sem nada exposto ao cliente.

Fronteira

Não existe criar, dar, destruir ou ajustar quantidade. Não é esquecimento: item nasce e morre por operação nomeada, com motivo e trilha — a mesma razão pela qual não existe somar dinheiro no núcleo. E hoje não há motivo de domínio concreto para nenhuma criação específica: saque, compra, fabricação e criação administrativa pertencem a sistemas que ainda não existem. Criar a API antes do motivo seria decidir o desenho dela sem conhecer o caso, e ela nasceria genérica — que é exatamente o que se quer evitar.

Shell de interface · Solid e TypeScript

triad-ui

Arquitetura e evidências do módulo →

Um painel precisa existir quando é usado e sair de cena quando é fechado. Este módulo coordena esse ciclo; cada painel cuida do próprio conteúdo.

Responsabilidade

Shell da interface em jogo. Não desenha nada: registra painéis, monta quando ficam visíveis e desmonta quando somem.

Fronteira

A regra que ele existe para garantir é uma só: um painel só é montado quando fica visível, e é desmontado quando some. Componente montado e invisível continua assinando evento, animando e recebendo estado — o benchmark mediu os três candidatos fazendo exatamente isso depois de escondidos, cada um a seu ritmo, porque nada os impedia.

Solid como runtime da interface em jogo.

Por que foi escolhido

Com os eliminatórios empatados, a diferença nos secundários não é marginal: 7,4× em bundle comprimido, metade do tempo de inicialização, 8× na pintura de abertura e atualização praticamente um para um com o DOM.

O que custou

Ecossistema menor e menos gente contratável do que a alternativa mais popular — e isso importa porque o framework será vendido e suportado. Se na prática o comprador tiver de escrever código idiomático do runtime para customizar, a premissa cai e a decisão volta à mesa.

Mapa editorial de responsabilidades, sem interfaces privadas. Fonte verificada em 08/09/2026.