Uma versão mais avançada não é uma versão melhor.

O mesmo app, em 28 versões. A qualidade do código sobe quase o caminho todo. A facilidade para o agente, não: ela chega ao máximo na família 6 e cai na família 7, onde o código ganha bancos separados e fronteiras que o agente precisa atravessar.

Role para os lados para comparar todas as branches. As tabelas abaixo têm os mesmos dados.

Qualidade do código (Rubycritic, 0–100) 95 90 85 80 Facilidade para agentes (0–25) 25 20 15 10 5 0 10 1A 15 1B 17 2A 19 2B 14 3A 15 3B 16 3C 17 3D 16 3E 20 3F 21 3G 14 4A 18 4B 17 5A 18 5B 21 5C 23 5D 19 6A 22 6B 19 6C 21 6D 22 6E 19 6F 24 6G 19 7A 19 7B 17 7C 19 7D
7D: maior Rubycritic, 94,55, mas 19/25 para agentes 6G: melhor nota para agentes, 24/25

Nas tabelas, role na horizontal para comparar todas as colunas.

Famílias 1 e 2: arquitetura de controllers

Branch Regra LOC Rubycritic Agente
1A-fat-controller Se toca no model, vai para o controller. 1.310 79,48 10/25
1B-extract-concerns Extraia o arquivo, mantenha a classe. 1.377 84,95 15/25
2A-multi-controllers Uma classe por responsabilidade, não uma por entidade. 1.355 83,02 17/25
2B-rest-actions-only Se a ação não cabe nos 7 verbos, o recurso está errado. 1.390 84,71 19/25

Família 3: estrutura de domínio

Branch Regra LOC Rubycritic Agente
3A-namespaced-controllers O prefixo vira pasta. 1.390 84,71 14/25
3B-nested-namespaces Se o prefixo sobreviveu ao namespace, o namespace não é fundo o bastante. 1.390 84,71 15/25
3C-context-views Domínio no caminho, recurso no nome. 1.390 84,71 16/25
3D-context-mailers Declare o caminho; não deixe o Rails adivinhar pelo nome da classe. 1.390 84,71 17/25
3E-singular-resources Expresse toda rota como declaração de recurso. 1.389 84,41 16/25
3F-resource-discipline Corrija o nome, não a rota. 1.397 83,92 20/25
3G-domain-naming Nomeie a operação, não a página. 1.417 83,22 21/25

Família 4: separação de pontos de entrada

Branch Regra LOC Rubycritic Agente
4A-separation-of-entry-points Um controller, um formato, um produto. 1.741 78,55 14/25
4B-controller-deduplication Escolha a ferramenta de extração pela relação. 1.667 87,13 18/25

Família 5: autoridade do model

Branch Regra LOC Rubycritic Agente
5A-fat-models Se dois controllers calculam a mesma coisa, o model calcula uma vez. 1.640 91,51 17/25
5B-model-callbacks Se todo caminho de criação dispara o efeito, o evento é do model. 1.638 91,23 18/25
5C-unified-vocabulary O nome do model acompanha o namespace do controller. 1.641 91,18 21/25
5D-model-authority Pergunte ao model dono do dado; não atravesse as associações dele. 1.646 91,21 23/25

Família 6: nomes de domínio

Branch Regra LOC Rubycritic Agente
6A-member-object Quando um conceito cresce além da infraestrutura, dê a ele classe e nome. 1.696 91,36 19/25
6B-token-secret Funções puras junto com persistência precisam de casa própria. 1.712 91,46 22/25
6C-task-status Se o código fala uma palavra em vários lugares, dê a ela uma casa canônica. 1.717 91,45 19/25
6D-query-objects Quando um cálculo cresce além do model, dê a ele um objeto próprio. 1.735 91,58 21/25
6E-declared-authority Se o dado é seu, responder sobre ele é responsabilidade sua. 1.717 91,72 22/25
6F-contextual-names Se o namespace já diz, o nome dispensa o prefixo. 1.717 91,72 19/25
6G-named-orchestrations Coordenação entre vários models ganha nome próprio. 1.799 92,08 24/25

Família 7: contextos delimitados e isolamento

Branch Regra LOC Rubycritic Agente
7A-domain-boundaries Nenhum model referencia classes de outro domínio. 1.785 93,80 19/25
7B-process-managers Quando estado intermediário se acumula entre fases, a orquestração ganha objeto próprio. 1.793 93,67 19/25
7C-domain-databases Cada contexto delimitado tem seu próprio banco. 1.818 93,81 17/25
7D-shared-kernel O app host guarda só o que as duas interfaces compartilham. O resto vai para uma engine. 1.832 94,55 19/25

LOC: bin/rails stats. Rubycritic: bin/rails rubycritic. Dados de 26/09/2026. Nota para agentes: o relatório Agent-Friendliness, com as cinco dimensões de cada branch