Como a casa trabalha
Saiba como verificar uma mudança sem CI, o que todo container precisa ter, onde cada contrato está escrito e como mudar esta documentação.
Novo por aqui? A regra do deploy por app, o inventário dos seis apps e a costura entre eles estão em A casa, no portal, e esta página não os repete. A fonte canônica de tudo aqui é o AGENTS.md da raiz: se os dois divergirem, vale ele.
A casa em 30 segundos#
Cada casa tem relógio de luz, chave e escritura próprios. Morar perto não dá direito de entrar na casa do vizinho.
Proximidade não autoriza SELECT direto na tabela do outro time. Aqui o contrato HTTP faz o papel da view contratada.
O código do vizinho está na mesma pasta, e mesmo assim o app fala com ele por HTTP, nunca por import.
Seis apps moram num diretório só para a IA trabalhar com um contexto único. Cada app continua sendo dela: banco, container e deploy próprios. A versão completa, com o inventário e a costura, está em A casa.
A regra é de deploy e de código, não de isolamento total. Os backends autenticam contra o conta-central, e o motor chama o load-balance a cada chamada de LLM. Dependência de rede explícita não quebra a regra; dependência de código-fonte, sim.
Verificar sem CI#
Nenhum app tem pasta .github. Não é esquecimento: é decisão do dono, registrada no AGENTS.md. A verificação roda na máquina de quem codou, e o resultado vai colado na mensagem de merge, como o check de data quality que roda antes de publicar o dashboard.
Para passar pelo gates, você precisa de:
- Dependências do zero:
npm cino app que você tocou. - O agregador:
npm run gatesna raiz do app. Hoje só o motor e o frontend do load-balance têm um; nos outros, rode os scripts do pacote (lint,typecheck,testebuild). - O registro: o output colado na mensagem de merge.
Sem node_modules instalado, diga que não rodou, em vez de afirmar que passou.
As três fechaduras de todo container#
Todo container de produção precisa das três. A tabela mostra por que cada uma existe e quem já tem:
| Fechadura | Por quê | Quem já tem |
|---|---|---|
Usuário não-root (USER) | Fecha o caminho mais direto até o host: o processo não roda como root. | agent-package, render, conta-central e o backend do motor |
HEALTHCHECK | Sem ele, o orquestrador nunca sabe quando o container está pronto, e não há drain nem rollout automático. | agent-package, render, conta-central e motor |
| Base pinada por digest | Tag flutuante muda o que roda em produção sem commit nenhum. | agent-package e render |
O load-balance e o mypanel ainda não têm nenhuma das três: é a TB-05. Uma quarta regra vale para todos: segredo entra por env em runtime, nunca por ARG ou ENV de build.
Onde os contratos estão escritos#
Apps conversam por contrato HTTP versionado, nunca por import e nunca por banco compartilhado. E contrato aqui não é aperto de mão: é documento no repositório, que o código cita pelo nome. As costuras que já existem são estas:
| Costura | Como funciona | Onde está escrita |
|---|---|---|
motor ↔ load-balance | O motor nunca sabe modelo, provider ou credencial | motor/backend/docs/contrato-load-balancer.md |
apps ↔ conta-central | Login conferido no IdP central por OIDC | conta-central/backend/ |
| frontend ↔ backend do app | O nginx repassa /api via BACKEND_UPSTREAM | <app>/frontend/nginx.conf |
agent-package ↔ render | Fork com seed que espelha dados: a costura mais solta da casa | seed-render.ts e o ADR 0014 |
Se o contrato muda, o documento muda no mesmo PR. Mudança que atravessa apps é mudança de contrato, e isso vale para a TB-08 (envelope de erro) e para a TB-11 (contrato REST gerado).
O motor anota o pedido sempre igual. O load-balance decide o fogão e traduz para cada chef. O garçom nunca precisa saber o fogão.
O dashboard pede vendas por mês sempre igual. O modelo resolve de qual tabela buscar. Trocar o fornecedor não quebra o painel.
O nginx é o interfone: a visita bate na mesma porta e ele repassa para dentro. O ramal interno se resolve na hora.
Como entra um app novo#
Para adicionar um app à casa, siga estes passos:
-
Crie backend e frontend
Pastas
backend/efrontend/, cada uma com o seupackage.jsone o seu lock. -
Escreva um Dockerfile por processo
Já com as três fechaduras:
USER,HEALTHCHECKe base com digest. -
Documente só os nomes das variáveis
O
.env.examplelista nomes. O valor fica no.env, nunca no git. -
Escreva o contrato
Toda conversa com outro app vira documento em
<app>/docs/, citado pelo código. -
Entre no gates
O pacote novo participa do agregador. Sem gates, não há verificação.
-
Registre no inventário
Adicione a linha do app na tabela do
AGENTS.md.
Como a IA trabalha neste repo#
O monorepo existe para a IA trabalhar com contexto. Por isso, valem cinco regras:
- Leia o contexto antes de mexer. O
<app>/CLAUDE.mddo app, quando existir (hoje só o motor tem), e o contrato dos apps com quem ele conversa. Usar o que está escrito é mais barato e mais seguro que inferir do código. - Mudança que atravessa apps é mudança de contrato. O documento muda no mesmo diff, e o código passa a citá-lo.
- Não alinhe o app vizinho por conta própria. Padrão diferente no app ao lado é divergência conhecida, medida na auditoria. Ela se corrige por decisão, num PR próprio, não como efeito colateral de outra tarefa.
- Rode os gates do app que você tocou. Sem
node_modules, diga que não rodou. - Conte o que mudou em outro app. Se a tarefa era num app e tocou outro, pare e pergunte, ou registre como decisão explícita.
Antes de dar uma tarefa por concluída#
Uma tarefa só vai para a coluna Feito do board quando passa por estes portões:
npm run gatespassa, ou o equivalente do app onde ainda não há agregador.- Migration nova é versionada: nada de
db pushfora de banco descartável. - Nenhum import entre apps foi introduzido.
- Contrato alterado tem o documento de contrato alterado no mesmo PR.
- Segredo novo tem só o nome no
.env.example, o valor fora do git e o gitleaks passando (a varredura ainda não está instalada no monorepo: é a TB-04).
Depois, mude o estado da tarefa neste guia e cite a evidência, como mostra a próxima seção.
Como alterar esta documentação#
build.py ← gera o portal: visão geral, A casa e as páginas de app
index.html · a-casa.html · apps/ ← saída do build do portal
assets/ ← docs.css e docs.js: um design system só, para tudo
server.js ← servidor estático, sem dependência
tarefas/
build.py ← gera este guia, com o chrome do portal
index.html … roadmap.html ← saída do build do guia
README.md ← como mexer no guia
O portal é a fonte única da documentação: HTML estático gerado por Python, sem framework, sem CDN e sem dependência. O guia de tarefas mora dentro dele e usa o mesmo chrome e o mesmo CSS. Nenhum .html se edita à mão, porque ele é saída do build.
Cada tipo de mudança tem um lugar:
| O que mudar | Onde | Depois |
|---|---|---|
| Visão geral, A casa ou página de app | documentation-portal/build.py: PAGES e a lista APPS | python3 build.py no portal, e depois no guia |
| Tarefa, estado ou fase do roadmap | tarefas/build.py: TASKS e ROADMAP | python3 build.py em tarefas/ |
| Texto das páginas do guia | tarefas/build.py: PAGES | python3 build.py em tarefas/ |
| Cor, layout ou comportamento | assets/docs.css e assets/docs.js | nada: CSS e JS são estáticos |
O guia importa o chrome e a navegação do build.py do portal. Mudou um componente ou a sidebar de lá? Rode os dois builds. Para publicar uma mudança no guia, siga estes passos:
-
Edite a fonte
Tarefa é uma tupla em
TASKS: id, título, descrição, apps, esforço, impacto, estado, origem e evidência. O estado éfazer,decidiroufeito, e a evidência é caminho real no disco, relativo à raiz do repositório. -
Regenere as páginas
Rode o build do guia dentro de
tarefas/:bashcd documentation-portal/tarefas python3 build.pyO build lista as páginas e o resultado da conferência das fontes:
textexit 0OK 5 páginas geradas em tarefas/: index.html visao-geral.html auditoria.html board.html roadmap.html Conferência das fontes: 0 avisos. -
Confira os números
Nenhum número do guia se digita. As contagens do board, das fases e de cada app saem de
TASKSeROADMAP, e os scores saem da listaAPPSdo portal. O build avisa se uma evidência não existe no disco, se uma tarefa aberta está fora do roadmap ou se um score diverge daAUDITORIA-ALINHAMENTO.md. -
Veja no navegador
Abra o
index.htmldireto, ou sirva a pasta do portal:bashcd documentation-portal node server.js 4173
Próximos passos#
Você conhece o dia a dia da casa: o gates, as fechaduras, os contratos e o caminho de uma mudança na doc. A seguir, meça quanto cada app se desvia do padrão.
Explore além: