Módulo de back-end no padrão das skills wehive
TLDR: remover do
modules/backendos metadados de repo que vazaram para dentro do módulo, completar o conjunto padrão de entrypoints comlint, e mover oapp/para o layout completo da Arrow Architecture — antes que qualquer código de domínio chegue.
Nota de status: a spec original ficou marcada como
proposed. Está implementada — oapp/temcore/ports/bridges/platforme os metadados de repo não estão versionados dentro do módulo. Duas coisas mudaram depois da spec: a camada de terceiros chama-sebridges/, nãoexternal/, e os entrypoints vivem emrun/, não embin/.
Contexto
O scaffold Rails da spec 20260723085311 deixou
modules/backend divergindo das skills wehive em três pontos:
| Skill | Divergência |
|---|---|
commons:structure / modules.md |
O módulo contém .claude/, .codex/ (symlinks) e .project/ai/ — metadados de nível de repo que nunca pertencem a um módulo. Estão até cobertos pelo .gitignore (modules/**/.claude/), mas foram commitados assim mesmo. Um módulo guarda só .module/, seu Makefile e suas fontes |
commons:structure (entrypoints) |
O conjunto padrão é runtime, install, test, lint. O back tem os três primeiros e não tem lint (o front tem). Cada entrypoint <name> vira make backend.<name> automaticamente, via make/core/commands.mk do commons |
commons:rails (Arrow Architecture) |
O app/ usa o layout default do Rails (controllers/, jobs/, models/) em vez de core/ports/terceiros/platform. O módulo ainda não tem código de domínio — só a fundação da USER-001 —, então a mudança é barata agora e evita um refactor disruptivo depois |
Decisões já tomadas com o owner: escopo completo (layout + Arrow), manter todos os binstubs do Rails
(dev, setup, ci, thrust, etc.), criar a task no Asana.
Asana: https://app.asana.com/1/1208104128529800/project/1214395788660507/task/1216836595697181
Objetivos
modules/backendlivre de metadados de nível de repo (.claude/,.codex/,.project/).- Conjunto padrão de entrypoints completo:
runtime,install,test,lint. app/no layout da Arrow Architecture, com autoloading configurado ezeitwerk:checkpassando.- Árvore de testes espelhando o novo layout de
app/. - Suíte verde (
make backend.test) e healthcheck funcionando depois da mudança.
Fora de escopo
- Adicionar
good_job, tabelaEventou qualquer maquinário assíncrono. - Deploy do back-end / conteúdo de
.infra/backend/. - Remover os binstubs do Rails deixados pelo
rails new(o owner escolheu mantê-los). - Qualquer mudança em
modules/frontend.
Mudanças
Estrutura do módulo
Remover (git rm) modules/backend/.claude/ (symlinks commands, skills),
modules/backend/.codex/ (idem) e modules/backend/.project/ai/ (só .gitkeeps). O .gitignore já
ignora esses caminhos para módulos, então eles ficam de fora dali em diante.
Criar o entrypoint lint (executável):
```bash #!/usr/bin/env bash set -e
exec bundle exec rubocop “$@” ```
Arrow Architecture
Moves de arquivo (git mv, sem mudança de conteúdo além do que o autoloading exige):
| De | Para |
|---|---|
app/controllers/application_controller.rb |
app/ports/controllers/application_controller.rb |
app/controllers/health_controller.rb |
app/ports/controllers/health_controller.rb |
app/controllers/api/v1/base_controller.rb |
app/ports/controllers/api/v1/base_controller.rb |
app/controllers/concerns/paginatable.rb |
app/ports/controllers/concerns/paginatable.rb |
app/jobs/application_job.rb |
app/ports/jobs/application_job.rb |
app/models/application_record.rb |
app/core/application_record.rb |
- Remover as pastas agora vazias
app/controllers/,app/jobs/,app/models/(incluindo osconcerns/.keep). - Criar as demais pastas principais da Arrow, seguradas por
.keeponde vazias — a camada de terceiros eapp/platform/. O layout completo fica visível na árvore desde o primeiro dia. -
config/application.rb— registrar os diretórios deportscomo autoload roots:ruby %w[controllers controllers/concerns jobs].each do |dir| path = root.join("app/ports/#{dir}") config.autoload_paths << path config.eager_load_paths << path end
No código atual, a camada de terceiros é
app/bridges/,app/core/está subdividido emmodels/euse_cases/(ambos autoload roots), eserializersentrou na lista deports. Ver Camadas do app Rails.
Testes
test/controllers/**→test/ports/controllers/**, espelhando oapp/(as referências de classe não mudam; o Minitest faz glob emtest/**/*_test.rb).test/integration/etest/models/ficam como estão (test/models/guarda só um.keepaté a primeira entidade).
Como verificar
make backend.test— suíte verdemake backend.lint— roda rubocop pelo novo entrypointcd modules/backend && bin/rails zeitwerk:check— autoloading consistente com o novo layoutmake backend.upecurl localhost:4010/health→200ls modules/backend/app→core,ports,platforme a camada de terceirosgit ls-files modules/backend | grep -E '\.claude|\.codex|modules/backend/\.project'→ vazio
Documentação
- Camadas do app Rails — o layout do
app/:core(negócio),ports(controllers/jobs),bridges(terceiros),platform(transporte), com as regras da Arrow Architecture - Convenção de módulos — sem mudança (já diz que um módulo guarda só
.module/+ fontes) - Plano de execução