From dev-team-kit-fv
Finds deepening opportunities — refactors that transform shallow modules (complex interface, simple implementation) into deep modules (simple interface, rich implementation). Focuses on testability and AI-navigability.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dev-team-kit-fv:38-architecture-deepener [--scope=src/foo] [--max-candidates=N][--scope=src/foo] [--max-candidates=N]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
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).
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: high
Quando 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.
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.| 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 emergiucurrent.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 boanpx claudepluginhub felvieira/claude-skills-fv --plugin dev-team-kit-fvIdentifies and suggests codebase refactors that turn shallow, high-friction modules into deeper ones using deletion tests and seam analysis. Best for architecture improvement, testability, and agent navigation.
Analyzes codebase architecture to identify shallow modules and propose refactoring opportunities that increase depth, testability, and AI-navigability. Use when improving architecture, finding refactoring candidates, or consolidating tightly-coupled code.
Analyzes codebase architecture, identifies shallow modules, and proposes deepening refactors to improve testability and AI-navigability using precise vocabulary (Module, Interface, Depth, Seam, Adapter).