Checklist: app novo entrando no padrão¶
Passo a passo para colocar a documentação de um app novo no ar. Em ~30 min o
site do app aparece em docs.xadm.biz/aplicacoes/<app>/.
1. Escolha o slug — com calma¶
O slug (nome do repo e do prefixo no bucket) é o ID público do app, para sempre: vira URL, links e alvo do futuro RAG. Renomear depois quebra tudo.
- minúsculas, hífens, sem acento:
bi-transporte-xls, nãoBI_TransporteXLS - confira a grafia em voz alta antes de criar o repo (um typo aqui já quase ficou permanente)
2. Crie o repo no Forgejo¶
- Em
fonte.xadm.biz, na organização certa. - Estrutura
docs/da constituição §3:index.md(Resumo Executivo),glossario.mde, conforme o caso,projeto/(Etapas),decisoes/,dev/,operacao/, epublic/(manual + API públicos) (criepublic/img/junto com a primeira screenshot — Git não versiona pasta vazia). - Crie
docs/anexos/edocs/anexos/privado/com os READMEs canônicos (templates/anexos-readme.mdetemplates/anexos-privado-readme.mddo repo central): anexo público emanexos/, dado real de cliente só emanexos/privado/— nunca publicado (constituição §5). - Use os templates de documento — frontmatter no formato da constituição §4.
- App de cliente? O frontmatter leva
cliente:(ver constituição §5). - Crie
docs/app.jsoncom os metadados do app — é ele que faz o app aparecer com nome e grupo certos na página Aplicações. App Java/Flutter: declaretoolchain(ex.{ "java": "25" }) — é obrigatório (o validador falha sem ele) e deve casar com a tag que ocontainer:do CI usa. Ordem importa (fábrica de imagens de CI): a versão tem que existir namatriz-baseline.jsondo central (PR + push → a fábrica builda) antes de ocontainer:apontar pra ela — senão o pull falha. Versão já homologada (Java 25) → só declarar; versão nova → PR na baseline primeiro. - Central de Apps: declare o
app_id(identidade canônica). As funcionalidades (erros, arquivos, analytics, docs) você configura depois de codar e antes da release, rodando/xadm-setup— ele pergunta o que ativar, provisiona e preenche o blocofeaturesdoapp.json(build-time). Ver Central de apps. - Crie
docs/changelog.mda partir detemplates/changelog.md— uma linha que embute oCHANGELOG.mdda raiz (--8<-- "CHANGELOG.md"); omkdocs.ymljá vem com a entrada de nav "Mudanças". Fonte única: não copie o conteúdo, só o stub. - Crie
overrides/main.htmla partir detemplates/overrides-main.html(omkdocs.ymljá apontatheme.custom_dir: overrides) — é o aviso de "versão antiga" do seletor de versão (decisão 0004). Ocustom_direxige o arquivo existir, mesmo antes de versionar. - Garanta
site/no.gitignore: o build local do MkDocs (passo 5) gera a pasta na raiz do repo, e site gerado nunca é commitado (constituição §1).
3. Copie os templates canônicos do repo central¶
Antes de copiar, confira a versão vigente da constituição em
constituicao-versao.txt
— e re-confira ao terminar a adoção: se mudou no meio (já aconteceu),
re-derive os templates copiados; o constituicao: do app.json deve
registrar a versão que os templates realmente seguem.
Versão da constituição ≠ versão do site. O número que o app registra e
compara é só o da constituição (constituicao-versao.txt = app.json
constituicao:). O repo central tem também um VERSION (o release do
site, ex. 0.18.2, com cara de SemVer), o /versao.txt (rotulado
site X.Y.Z) e a tag vX.Y.Z — esses são do site, não da constituição;
nunca os use como versão-base (era a confusão clássica num clone local —
versionamento).
Baixe sempre do mirror público docs.xadm.biz/toolchain/ — nunca de um
clone local (diverge) nem do fonte.xadm.biz (o Forgejo é privado: serve
edição/hosting e dá 404 sem auth — inviável num bootstrap, inclusive por
agente de IA). A lista canônica e a versão de cada artefato vivem no
manifesto.json (a mesma
fonte única que a /xadm-docs consulta); o conteúdo cru de cada um está em
https://docs.xadm.biz/toolchain/raw/<caminho> — ex.:
curl -fsSLO https://docs.xadm.biz/toolchain/raw/templates/mkdocs.yml
Copie cada artefato para o destino abaixo (o nome do template ≠ caminho no app
em alguns casos — o mesmo mapa que a /xadm-docs aplica):
templates/mkdocs.yml→mkdocs.ymlna raiz do app (troque<app>)templates/docs.yml→.forgejo/workflows/docs.yml(troque<app>e os passos de Javadoc/dartdoc conforme a stack; o branch émaster, já no template — constituição §5)xadm.css→docs/stylesheets/xadm.css(identidade visual)templates/claude-regras.md→ bloco no topo doCLAUDE.mddo repo (regras de IA: não decide sozinha, não commita sozinha — constituição §6).- Skills (
.claude/skills/<nome>/SKILL.md) — instale TODAS, não só duas. Copie todas as*-skill.mdque omanifesto.jsonlista, exceto as do campoopcionais(hoje sóxadm-docx— export Word para a diretoria; instale apenas se o app gera.docx). O conjunto core que todo app conformante carrega são 10: as 6 de workflowx-desenhar,x-definir,x-refinar,x-planejar,x-implementar,x-documentar+xadm-meta-audit-work,xadm-docs,xadm-releaseexadm-setup(Central de Apps — o passo 2 manda rodá-la depois de codar, antes da release). Asx-*são diretórios (templates/<nome>/com SKILL.md +references/) → copie o diretório inteiro para.claude/skills/<nome>/; asxadm-*são arquivo único (templates/<nome>-skill.md→.claude/skills/<nome>/SKILL.md). Não pare em docs+release (erro real de bootstrap): omanifesto.jsoné a lista mecânica completa — cruze com ele, não com esta prosa. Duas skills têm passo extra:xadm-docs— copie tambémtemplates/checa-constituicao.sh→.claude/checa-constituicao.sh(+ hookSessionStartno.claude/settings.json, snippet no topo do script). Preenchaconstituicao:nodocs/app.jsoncom a versão vigente (constituição §6) e anote-a no CLAUDE.md.xadm-release— troque<app>/<repo>e mantenha só o bloco de "Particularidades" da sua stack. É o wiring de release, fácil de esquecer porque a doc flui antes: instale junto, não depois. OCHANGELOG.mdnão se cria à mão — nasce na primeira/xadm-release(infere dogit loge cobre o histórico). Ver versionamento.
App que renderiza HTML no servidor (Micronaut Views/Thymeleaf — telas de admin/ops/dev,
inclusive internas e atrás do gate de auth) copia também o kit de UI opcional
(templates/views/** + templates/public/** → layout.html, custom-theme.css,
logo.png, favicon.ico) e usa o layout padrão X-Adm em vez de reinventar o visual
(constituição §5). Copie também o scaffold templates/app.css →
public/css/app.css (CSS de componentes deste app; o head sempre o linka — sem o
arquivo, 404 em toda página). Ausente no opcionais do manifesto para app headless/Flutter. Receita e
static-resources em Java/Micronaut §UI.
Hook de estilo terso (recomendado): some ao .claude/settings.json o hook SessionStart
que injeta a regra de output terso + o carve-out verbatim da casa (.claude/caveman.sh) — corta
~65–75% dos tokens de output do agente, exatidão intacta, e protege os deliverables (mensagem de
commit, §6, .ia/) da compressão. Receita em
Ferramentas de token § caveman. Opcional no
mesmo array: .claude/token-check.sh (lembrete de eficiência do rtk gain no start —
auto-análise).
Higiene do settings.json: versionado enxuto (padrões largos compartilhados) + pessoal em
.claude/settings.local.json gitignored — senão o allow-list incha a cada sessão e o --amend
solta a tag da release. Regra em
Ferramentas § higiene do settings.json.
Não copie de outro app — clones divergem do padrão.
Template × piloto — não confundir a fonte
O template (vem do central, sincronizado via manifesto) é a única fonte de cópia para um app novo. Um app piloto / de referência (por stack, citado nas páginas de Engenharia) é o exemplo onde o padrão foi provado e destilado — serve de referência, nunca de base de cópia (copiar dele = "clones divergem"). O que um app novo segue vem de: templates + a página de Engenharia da stack + a skill da stack, não de clonar um piloto.
4. Secrets — nada a criar, só confira¶
Os secrets DOCS_S3_ENDPOINT, DOCS_S3_ACCESS_KEY e DOCS_S3_SECRET_KEY
já existem na organização xadm do Forgejo (key única de escrita no
bucket docs-sites, compartilhada por todos os apps — ver
Garage). O aviso de
falha do CI não precisa de secret nem de passo no YAML — é um webhook
nativo da organização que cobre todos os workflows
(Forgejo e CI).
Repo criado na organização herda automaticamente; só confira que o repo está
na org.
Credenciais — não confundir (Central de Apps é build-time)
O client-grade (DSN, app key, bucket) não é secret — vive no app.json (o
/xadm-setup grava). São secrets (fora do app.json): (1) DOCS_S3_* — publicação de
docs, herdada da org; (2) key de escrita do Garage (só web/server, se usa arquivos) — o
/xadm-setup registra e o deploy injeta no Coolify (mobile escreve via presign); (3)
SENTRY_AUTH_TOKEN (upload de sourcemap do GlitchTip), idem. Ver
Central de apps.
5. Valide e publique¶
- Local (opcional):
mkdocs build --stricte o validador de frontmatter — no Ubuntu, instale o MkDocs via pipx (como configurar); o validador, baixe do site (não copie para o repo do app):curl -fsSLO https://docs.xadm.biz/toolchain/valida-frontmatter.py && python3 valida-frontmatter.py docs/. - Push no branch padrão → o workflow builda, valida e publica no bucket →
em ~2 min o site está em
docs.xadm.biz/aplicacoes/<app>/. - A entrada na página Aplicações (e na API
Reference, se houver
api/) é automática — confira se o app apareceu no grupo certo; se caiu em "Outros", oapp.jsonnão foi publicado ou está inválido. - Resumo Executivo (constituição §2): a home (
index.md) é a porta do diretor — problema + como resolve, sem jargão, 1–2 parágrafos, terminando em "→ Documentação Completa". Ponha<!-- etapas -->e o hook injeta as listas "entregue/planejado" do campoentrega:+statusde cada etapa. Template: Resumo Executivo. - Documentação Completa = o livro do sistema, autorado (constituição §2): crie
docs/projeto/index.mda partir do template — um esqueleto na ordem lógica (contexto → dados → modelo → mapeamento → fluxos → transversais → contratos → changelog) que mostra o sistema no estado atual, não a soma das etapas. Você escreve o fio narrativo; o factual vem das fontes: o<!-- GERADO: changelog -->injeta etapas+decisões, e um<!-- RECONCILIAR: … -->falha o build até reconciliar. Projeto com banco: crie tambémprojeto/modelagem.md— o modelo de dados consolidado (ER Mermaid), embutido no livro e atualizado por toda etapa que evolui o banco, no mesmo PR (§5). - Etapas do Projeto (constituição §5): os docs de
projeto/sãoNN-titulo.md(duas casas, semPROJ-/ano); avulso vai emprojeto/diversos.md. A seção no site chama-se "Etapas do Projeto". - Público/privado (constituição §5):
docs/é privado por padrão; o público vive emdocs/public/(public/index,public/manual/,public/api/) — uma pasta, sem marcação por página. O manual do usuário e a API exposta moram aí. Guarda: página empublic/não linka para fora depublic/(o validador falha). Login e dois domínios são specs futuras — por ora um site só, nada de infra. - Referência de API (constituição §5): se o app expõe API, descomente no
docs.ymlo passo "Gerar referência de API" da sua stack — o CI de docs gera do código, antes do build, para dentro dedocs/: Javadoc/dartdoc (interno) →docs/dev/api/(linke com[API Reference](api/index.html)numa páginadev/); OpenAPI (público) →docs/public/api/openapi.yaml+ a páginadocs/public/api/index.md(template)..gitignore:docs/dev/api/edocs/public/api/openapi.yamlsão gerados — ignore-os (junto comsite/).
6. CI de código (dois workflows)¶
O docs.yml cuida só da documentação. O código do app tem dois workflows
de papéis distintos (constituição §6):
ci.yml — gate de qualidade (push/PR): roda o gate completo de análise
estática + testes da stack — só testes deixa lint/estilo (checkstyle,
analyze) escapar para o master. Por stack:
| Stack | Comando do gate |
|---|---|
| Java/Gradle | ./gradlew check (testes + checkstyle + verificações) |
| Flutter | dart format --output=none --set-exit-if-changed . && flutter analyze && flutter test |
| Dart | dart format --output=none --set-exit-if-changed . && dart analyze && dart test |
| Node | npm run lint && npm test |
App só-script (sem suíte): lint é o piso (sempre); testes cobrem a lógica pura onde existir; não invente suíte para um script trivial.
release.yml — rede de segurança do release (push de tag): roda o
valida-release.py (SemVer no manifesto ↔ CHANGELOG ↔ tag). Independe da skill
/xadm-release — pega tag fora-de-banda ou bug da skill.
Templates canônicos:
templates/ci.ymletemplates/release.yml. Sem passo de aviso — a falha vai pelo webhook nativo da org (Forgejo 15).Migração (apps com
ci.ymlantigo): se o seuci.ymljá rodava ovalida-release.pyem push de tag, ele virourelease.yml— renomeie e adote o novoci.yml(gate de qualidade) ao lado.
7. Container — se o app deploya¶
App que sobe no Coolify leva Dockerfile + .dockerignore na raiz desde o primeiro
commit de código (constituição §3). O Coolify builda o Dockerfile do repo (não há
buildpack) e o ci.yml não builda imagem: se faltar, o primeiro a descobrir é o
deploy em produção — foi assim que um app da casa passou em testes e e2e local e
quebrou só no Coolify. Derive de
templates/dockerfile-java e
templates/dockerignore-java; não copie do repo irmão. App Java/Gradle leva junto o
.gitattributes (templates/gitattributes-java) — sem ele, checkout Windows deixa o
gradlew com CRLF e o docker build morre com ./gradlew: not found no Alpine. Detalhe
por stack: Java/Micronaut §Deploy.
Repo que não deploya (biblioteca, CLI distribuído pela aba Releases) pula este passo.
Repo que era só doc e passou a ter código?¶
Caso comum: o repo entrou no padrão pela documentação (pré-projeto, projeto), o projeto
foi aprovado e virou app. O checklist acima é doc + CI; ao aparecer o primeiro
src/, faltam os passos de código:
ci.ymlcom o gate da sua stack (passo 6) — sem ele, nada roda em push.release.yml(passo 6) e a fonte de versão da stack (gradle.properties/pubspec.yaml).Dockerfile+.dockerignore(passo 7) se o app deploya.toolchainnodocs/app.json, dentro da baseline da fábrica./healthcom shape{status, versao}e o health check (versionamento).
O plano do primeiro ciclo de código (/x-planejar) puxa esses itens para a fase de
bootstrap. Deploy não é só "operação humana no painel": a metade que mora no repo é
tarefa de código como qualquer outra.
Migrando de doc legada (arc42 monolítico)?¶
Se o app vinha de um doc único arc42 (um index.html com tabela de ADRs), a
migração para os seis níveis é trabalho da skill /xadm-docs. Um
cuidado específico: gere uma tabela de equivalência ADR-legado → decisão
NNNN (ex. ADR-004 BYTEA → 0008) na primeira migração — quem conhecia a
numeração antiga não acha a nova sem ela. Barato de fazer uma vez, caro de
reconstruir depois.
Achou brecha no padrão?¶
Se ao aplicar o padrão algo travou, ficou ambíguo ou você decidiu às cegas:
não contorne localmente. Peça ao Claude do seu app um texto descrevendo
o problema e cole-o numa sessão do Claude Code no repo central
documentacao — a correção sai de lá, para todos
(constituição §6).