Encontra oportunidades de "deepening" no codebase — refactors que transformam modulos shallow (interface complexa, implementacao simples) em deep (interface simples, implementacao rica). Foco em testabilidade e AI-navigability. Use quando usuario quiser melhorar arquitetura, encontrar oportunidades de refactor, consolidar modulos acoplados, ou preparar codebase para trabalho de agente. Trigger em: "deepening", "deep module", "shallow module", "refactor architecture", "improve architecture", "consolidate modules", "agent-friendly codebase", "AI-navigable", "module depth".
68
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Identificar friccao arquitetural e propor deepening opportunities — refactors que transformam modulos shallow em deep. Objetivo: testabilidade + AI-navigability (codebase que agente consegue evoluir sem quebrar coisas).
Adaptado de mattpocock/skills/engineering/improve-codebase-architecture e integrado ao kit (skill 23 Migration & Refactor + skill 33 Detective Spec + policies/vertical-slices.md).
Inspirado em Birgitta Böckeler (Thoughtworks) + Neal Ford ("Building Evolutionary Architectures"). Ver
docs/inspiration/harness-engineering.md+policies/harness-categories.md.
Esta skill agora também produz fitness functions runnable quando o usuário pedir auditoria arquitetural com gates concretos. Formato canônico:
# .harness/fitness-functions.yml
fitness_functions:
- id: <kebab-case-id>
description: "Frase clara do que regula"
type: structural | performance | accessibility | security
runner: grep | dep-cruiser | lighthouse | custom-script
rule: <padrão ou query do runner>
fail_threshold: <int — 0 = zero tolerância>
severity: high | medium | low
applies_to: <glob opcional>Exemplo prático — leaky abstraction de DB:
- id: no-db-in-domain
description: Domain layer não importa bibliotecas de DB
type: structural
runner: dep-cruiser
rule:
forbidden:
- from: 'src/domain/'
to: '(prisma|typeorm|sequelize|knex|pg|mongodb)'
severity: highQuando produzir YAML vs apenas relatório:
| Output | Quando |
|---|---|
| Relatório markdown apenas | Auditoria inicial, usuário entendendo opções |
+ fitness-functions.yml | Quer gate automatizado, tem CI, prevenir regressão |
| + Aplicar refactor | Via /auto, /swarm ou refactor-safely |
Ao produzir YAML, salvar em <consumer>/.harness/fitness-functions.yml. Roadmap v2.5.1: /run-fitness command runs the file.
Esta skill segue GLOBAL.md, policies/source-driven.md, policies/writing-clarity.md, policies/handoffs.md e policies/readiness-gate.md (decisão de arquitetura registrada explicitamente, não implícita, é um dos critérios que decide PASS/CONCERNS/FAIL antes do slice ir para implementação — decisão pendente reprova o gate).
Deletion test: imagine deletar o modulo. Se complexidade desaparece, era pass-through. Se complexidade reaparece em N callers, estava ganhando seu lugar.
The interface is the test surface.
One adapter = hypothetical seam. Two adapters = real seam.
Nao deslizar para "component", "service", "API", "boundary". Definicoes:
/detective-spec em legado (Detective ja mapeou; Deepener propoe melhorias)CONTEXT.md ou docs/glossary.md)docs/adr/ se existiremgraphify-out/graph.json — god nodes priorizados_detective_sdd/ — Detective Spec ja mapeou## Architecture Deepening Candidates mais abaixo)_architecture_review/YYYY-MM-DD-candidates.md (criar dir se nao existir, gitignored por default)CONTEXT.mddocs/adr/CONTEXT.md ou docs/glossary.md) — sem isso, nomes ficam genericosdocs/adr/ (se existirem) — respeitar decisoes registradasgraphify-out/graph.json — god nodes sao candidatos prioritarios_detective_sdd/ — Detective ja mapeou; reusarLer glossario de dominio + ADRs primeiro. Depois usar Read/Grep/Glob (ou despachar Explore subagent) para caminhar pelo codebase.
Nao siga heuristicas rigidas — explore organicamente e anote onde voce sente friccao:
Aplicar o deletion test em qualquer suspeito de shallow: deletar concentraria complexidade ou apenas a moveria? "Sim, concentra" e o sinal que voce quer.
Lista numerada de deepening opportunities. Para cada candidato:
Usar vocabulario do glossario do projeto para o dominio, e o glossario desta skill para arquitetura. Se CONTEXT.md define "Order", fale "modulo de Order intake" — nao "FooBarHandler", nem "Order service" generico.
Conflitos com ADR: se candidato contradiz ADR existente, so trazer quando friccao for real o suficiente para reabrir o ADR. Marcar claramente: "contradicts ADR-0007 — but worth reopening because…". NAO listar todo refactor teorico que ADR proibe.
NAO propor interfaces ainda. Perguntar: "Qual destes voce quer explorar?"
Quando usuario escolhe um candidato, entrar em conversa de grilling (analoga a /grill-me). Caminhar pela arvore de design — restricoes, dependencias, shape do modulo deepened, o que fica atras do seam, quais testes sobrevivem.
Side effects acontecem inline conforme decisoes cristalizam:
CONTEXT.md? Adicionar termo ao CONTEXT.md — mesma disciplina de skill 28 (CLAUDE.md Generator). Criar arquivo lazy se nao existir.CONTEXT.md ali mesmo.Checkpoint apos o deepening implementado: rodar a suite de testes que a Fase 2 previu que "sobreviveriam" pela interface nova — se algum teste que deveria sobreviver quebrou, a interface nova vazou detalhe de implementação que o deepening deveria ter escondido. Corrigir a interface (não o teste) e rodar de novo antes de considerar o deepening concluído.
| Sintoma | Suspeita | Acao |
|---|---|---|
| Modulo so re-exporta de outro | shallow / pass-through | deletion test |
| Interface tem 10 metodos, cada um faz so 1 thing | shallow | mover comportamento para dentro, expor menos |
| Bugs sempre em "como X e usado", nunca em X | falta locality | unificar X com chamadores |
| Multiplos modulos sabem como chamar Y na ordem certa | seam errado / shallow | esconder ordem dentro de modulo deep |
| Refactor pequeno quebra muitos testes | testes acoplados a implementacao | reescrever testes pela interface; modulo provavelmente shallow |
| God file (>1000 linhas, >20 callers) | falta de seam | identificar sub-responsabilidades, criar seams |
| Detalhe de impl (conexao, driver, ordem de chamada) aparece na assinatura | coupling leak / shallow | esconder atras do seam; expor Interface menor |
| Adicionar campo a mensagem/schema quebra consumidores que nao usam o campo | Contract rigido demais / acoplamento desnecessario | aplicar Must-Ignore; validar so o que se usa |
| Layer/tier so repassa chamadas sem encapsular decisao | shallow / pass-through distribuido | deletion test; mover complexidade real para dentro ou eliminar o tier |
Coordenar com graphify quando disponivel:
graphify-out/GRAPH_REPORT.md = candidatos prioritariosInspirado em Silveira et al., Introducao a Arquitetura e Design de Software (Casa do Codigo), cap. 4, 6.1, 6.5, 7. Principios atemporais cross-linguagem — a parte JVM-especifica do livro (GC, classloaders, JIT) e ignorada de proposito; nao e o dominio desta skill.
Tres reformulacoes do mesmo nucleo (depth, deletion test, leverage, locality) aplicadas a contextos que a Fase 1 ja varre, mas que ganham vocabulario aqui. Nao sao novos passos do processo — sao lentes para nomear friccao durante a exploracao.
Coesao e acoplamento nao sao metas em si nesta skill — sao sinais que apontam para candidatos:
Cuidado simetrico: baixo acoplamento != zero acoplamento. Sempre havera uma ligacao entre dois Modules que cooperam; a meta e que ela seja a menor e mais simples possivel (a Interface), nao que desapareca. Extrair um Module so para "desacoplar" sem deletion test e mover complexidade, nao remover.
A fronteira entre dois sistemas e um seam como qualquer outro; o estilo de integracao e a escolha de que tipo de seam:
Em todos os casos, o Contract e a Interface no sentido estrito da 38: nao so o shape do payload, mas modos de erro, ordering e compatibilidade. Validar o schema inteiro quando voce usa so parte dele e auto-imposicao de acoplamento — o equivalente distribuido de um caller que importa detalhes internos.
HATEOAS como Interface profunda. Hipermidia (links com rel, media types, content negotiation) e exemplo limpo de deep interface: o caller acopla ao significado do link (rel="pagamentos"), nao a URI. O servidor pode trocar a URI, a maquina, ate o fornecedor por tras — a Implementation muda, a Interface (o significado) nao. Versionamento e re-roteamento ficam escondidos atras do seam.
Uma camada se avalia pela leverage que oferece, igual a qualquer Module:
Distinguir layer (separacao logica — reduz acoplamento no codigo) de tier (separacao fisica — roda em maquina separada). Adicionar layer/tier so porque "fica organizado", sem encapsular complexidade, e o mesmo anti-padrao de extrair Module sem deletion test.
# Architecture Deepening Candidates — <YYYY-MM-DD>
**Scope:** src/...
**Source:** <CONTEXT.md / ADRs / graphify / Detective Spec>
## Candidates (priorizados)
### 1. <nome usando vocabulario do dominio>
**Files:** src/foo.ts, src/bar.ts, src/baz/index.ts
**Problem:** entender Order intake exige pular entre FooBarHandler, OrderService, OrderValidator e OrderRepository. Validacao acontece em 3 lugares com regras ligeiramente diferentes (RN-005 vs RN-012).
**Solution:** consolidar Order intake atras de modulo unico `OrderIntake` com interface `intake(rawOrder): Order | OrderError`. Esconder validacao + persistencia + emit-event atras desse seam.
**Benefits:**
- **Leverage:** callers param de saber sobre os 4 modulos
- **Locality:** validacao em 1 lugar, RN-005 vs RN-012 conflito vira impossivel
- **Testabilidade:** 1 interface a testar, vs 4 hoje. Testes ficam integration-style por default.
### 2. ...
## Recomendacao
Pegue 1 candidato por vez. Comecar pelo numero 1 (highest leverage).
## Para discutir
Qual candidato voce quer explorar? (responda com numero)Mexer porque "ficou feio" sem deletion test = mover complexidade, nao remover. Sempre rodar deletion test primeiro.
Inventar "OrderProcessor" quando glossario diz "Order intake" = drift terminologico. Sempre usar termos do CONTEXT.md.
ADR-0007 proibe X. Refactor sugere X. Solucao: re-abrir ADR primeiro, justificar mudanca, depois refactorar. Nao silenciosamente contradizer.
Usuario nao consegue priorizar lista de 20. Maximo 5-7 candidatos, ordenados por impacto.
"Aqui esta a interface nova" antes de "voce concorda que e shallow?" = perde feedback do usuario sobre a fricao real.
Apos usuario escolher candidato e fase de grilling concluir:
CLAUDE.md se vocabulario novo emergiu## Diagramas em Docs e ADRs na skill 10current.md atualizadodocs/skill-guides/architecture-language.md (a criar conforme demanda) — glossario completo equivalente a LANGUAGE.mddocs/skill-guides/architecture-deepening.md — exemplos de antes/depois, padroes comunsdocs/skill-guides/architecture-interface-design.md — design de interface boafelvieira/claude-skills-fv
90329e3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.