Documentação do spaceAI v1.0

A auditoria: quanto cada app se desvia

Veja quanto cada um dos seis apps adere ao padrão da casa, de 0 a 100. O placar vai de 96 a 43: uma dispersão de 53 pontos.

Leia primeiro

Score alto não significa app bom: significa app parecido com o padrão. O mypanel tem 43 e mesmo assim é o único com verificação hermética em container descartável. A fonte desta página é a AUDITORIA-ALINHAMENTO.md, na raiz do repositório.

O placar geral#

96
agent-package · o modelo
80
render · cópia fiel
67
motor · o mais novo
43
mypanel · o mais distante

A tabela completa, do mais alinhado ao menos alinhado:

agent-package — 96
96
render — 80
80
motor — 67
67
load-balance — 63
63
conta-central — 61
61
mypanel — 43
43

A média de cada app vem de cinco dimensões, como estão na auditoria:

AppArquiteturaOrganizaçãoSoluçõesFerramentalDocumentaçãoMédia
agent-package1009499939796
render868890855080
motor666872587067
load-balance776076564663
conta-central816270702061
mypanel334844335543

A diferença de 2 pontos entre o load-balance (63) e o conta-central (61) é quase toda documentação: 46 contra 20. Nas outras dimensões, o conta-central fica à frente em arquitetura, organização e ferramental, e o load-balance em soluções. Não leia 2 pontos como hierarquia.

MUNDO REAL
Radar de velocidade

Radar mede se você passou do limite daquela via. Não diz se você é bom motorista. O score mede aderência ao padrão, não qualidade.

DADOS / BI
Profiling antes do modelo

Antes de modelar um datamart, você roda o profiling: nulos, tipos errados, duplicadas. A auditoria fez isso com o código.

NA PRÁTICA
Aderência, nunca nota

Use o score para priorizar convergência. Nunca para dizer que um app é melhor que outro.

O padrão de casa em duas camadas#

O padrão existe, mas tem duas forças diferentes. Na medição da auditoria, a divisão era esta:

CamadaO que convergeQuem segue
NúcleoFastify 5, TypeScript strict, pino, zod, shutdown gracioso, migração no boot, Vitest, zero CI5 ou 6 de 6
Frente avançadaRFC 9457, ESLint com fronteiras, lint ratchet, coverage-floor, knip, gitleaks, ADRssó o agent-package e o render

A casa converge no esqueleto e diverge no rigor. O esqueleto todo mundo tem; as travas automáticas, só o agent-package e o render.

Alguns pontos nem chegaram a virar padrão: o envelope de erro (três formatos entre seis backends), a geração de cliente de API (só 1 de 6) e o casing dos arquivos do backend (4 em kebab-case, 2 em camelCase). Cada projeto resolveu do seu jeito.

As 12 divergências#

A auditoria lista 12 divergências, da mais cara à mais barata de conviver: 4 críticas, 5 altas e 3 médias. A última coluna leva à tarefa que fecha cada uma:

#DivergênciaQuem afetaSeveridadeTarefa
1Contrato de API copiado à mão em 5 de 6todos menos o agent-packagecríticaTB-02, TB-11
2Fronteira rota → serviço → ORM violada em 33 arquivos de rotaconta-central, load-balance, motor, mypanelcríticaTB-01 (feita)
3Backend sem ESLint em 3 de 6load-balance, motor, mypanelcríticaTB-01 (feita)
4Documentação ausente, com links mortos ou gate quebrado em 4 de 6conta-central, load-balance, render, motorcríticaTB-03
5Três formatos de envelope de erro convivendoconta-central, load-balance, motor, mypanelaltaTB-08
6process.env lido fora de um módulo único em 4 de 6conta-central, load-balance, motor, mypanelaltaTB-07
7Sem piso de cobertura nem detecção de código morto em 4 de 6conta-central, load-balance, motor, mypanelaltaTB-09
8Varredura de segredo e atualização de dependência em 1 de 6todos menos o agent-packagealtaTB-04
9Container sem HEALTHCHECK, sem USER ou sem digest em 3 de 6load-balance, mypanel, motoraltaTB-05
10@nomad/ui com 3 pins divergentes e ausente no mypanelconta-central, load-balance, mypanelmédiaTB-06
11Três topologias de repositório convivendomotor e mypanel fora do padrão; a decisão vale para os 6médiaTB-10
12features/ ausente em 2 de 6 e kit de UI local fazendo sombra ao @nomad/uirender, mypanel, conta-centralmédiaTB-12

O fio que liga quase todas é regra escrita sem ferramenta fiscalizando. A fronteira rota → serviço → ORM existia como texto, e sem gate 33 arquivos de rota a violaram: 8 no conta-central, 11 no load-balance, 7 no motor e 7 no mypanel.

MUNDO REAL
Cardápio copiado à mão

Cada garçom copia o cardápio à mão. A cozinha muda um prato e metade dos cardápios fica errada. Contrato manual apodrece igual.

DADOS / BI
A mesma métrica com três nomes

Receita, faturamento e valor em três tabelas: nenhum dashboard fecha sem tratar cada nome à mão. Três envelopes de erro custam o mesmo.

NA PRÁTICA
Placa sem radar

Placa de 60 sem radar não segura ninguém. Regra sem gate automático não segura nenhum projeto.

O que mudou desde a medição#

A auditoria mediu o disco em 2026-10-25, antes do primeiro commit do monorepo. Desde então, 5 pontos mudaram:

OndeO que mudouTarefa
Divergência 3 · ESLint no backendFechada. Os 3 backends sem lint ganharam ESLint flat e Prettier.TB-01 (feita)
Divergência 2 · fronteira rota → ORMMedida, ainda não fechada. A regra roda como aviso nos 3 backends novos e lista cada rota que importa o ORM; zerar a lista e promover a regra a erro é o passo seguinte.TB-01 (feita)
Divergência 8 · varredura de segredoPiorou. O .pre-commit-config.yaml e o .gitleaks.toml que a auditoria contou no agent-package não entraram no monorepo: hoje são 0 de 6. Sem a trava, dois tokens chegaram ao histórico pelo .mcp.json.TB-04, TB-29
Divergência 4 · documentaçãoO AGENTS.md do agent-package, com a tabela de gates que a auditoria citava, também não entrou no monorepo, e o backend/README.md dele aponta para o arquivo que falta.TB-03
Logger do load-balanceO lint novo achou um eval('require') que nunca funcionou em ESM. Trocado por createRequire.TB-30 (feita)

O caso do motor em 30 segundos#

1Renamebe/ e fe/ viram backend/ e frontend/
→
2Quebratudo que apontava para o nome antigo
→
3ConsertoTB-13, e o guard da TB-15
→
4Faltagates limpo e systemd

O motor trocou as pastas be/ e fe/ por backend/ e frontend/, e cada referência ao nome antigo quebrou junto: os scripts da raiz, os 3 contexts do compose, um import de teste, os testes que liam paths, o gerador do catálogo e o WorkingDirectory do systemd.

O conserto (TB-13) atualizou tudo isso menos o systemd, e um guard novo trava a volta do erro: o teste de Dockerfiles reprova se o backend copiar o frontend (TB-15). Falta rodar o npm run gates com instalação limpa (TB-16) e corrigir o WorkingDirectory dos dois units, no repo e na VPS (TB-17).

A lição cabe numa frase: renomear é fácil; o trabalho é atualizar tudo que apontava para o nome antigo. É igual a renomear coluna no data warehouse sem avisar: o ETL quebra, o dashboard zera e o teste acusa.

Próximos passos#

Você mediu a casa e sabe de onde vem cada divergência. A seguir, veja o trabalho que fecha cada uma.

Explore além:

Documentação gerada por build.py.