About escrever-trd
A skill for creating and maintaining a project-wide Technical Requirements Document (TRD), intended for teams using an SDD workflow. It inspects project files, enriches findings with external research, and interviews only about unresolved gaps; it can also record ADRs.
Key features
- 01Detect creation or editing mode
- 02Analyze project structure and stack
- 03Research public constraints of external dependencies
- 04Interview only to resolve information gaps
- 05Create or update TRDs and ADRs
Use cases
- 01Generate docs/trd.md for a new project
- 02Compare an existing TRD with project state
- 03Record global technical decisions
- 04Build a TRD from source documents before coding
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ fabricioveronez/ harness-publico --skill escrever-trdAfter installing, type/escrever-trdin Claude Code to confirm it loaded.
Bundled filesreferences/template-adr.mdreferences/template-trd.md
Details
From the project READMEEscrever TRD
Cria e mantém o TRD (Technical Requirements Document) em docs/trd.md. O TRD é o documento
técnico global do projeto: único, mantido, consultado pelas skills do fluxo sdd. Cobre o que é global e estável — stack, arquitetura, requisitos
não-funcionais, dependências externas, padrões e decisões. Requisitos de uma feature
específica ficam no PRD; detalhes de uma decisão pontual ficam em ADRs.
A skill analisa o projeto automaticamente, enriquece com busca externa e só entrevista o usuário para o que ainda ficou em aberto — o objetivo é minimizar atrito e maximizar o que se pode deduzir sem perguntar.
Entrada
O usuário pode invocar esta skill:
- Sem argumentos: a skill detecta o modo automaticamente pela presença de
docs/trd.md - "atualizar", "editar", "o TRD mudou", "stack mudou": confirma modo edição
- "criar", "novo TRD": confirma modo criação
Modos
A detecção de Criação vs Edição é automática pela presença de docs/trd.md — o usuário
não precisa especificar. O Modo Decision é acionado por intenção explícita (registrar
decisão / criar ADR) e sobrepõe a detecção automática.
- Criação —
docs/trd.mdnão existe: analisa o projeto, enriquece com busca externa, conduz mini-entrevista apenas para lacunas, gera o TRD com 6 seções a partir doreferences/template-trd.md. - Edição —
docs/trd.mdexiste: re-analisa o projeto, compara com o TRD atual, conduz entrevista focada apenas no que divergiu, e atualiza preservando o que está correto. - Decision — registra uma decisão técnica como ADR em
docs/adrs/NNN-slug.md(imutável apósaceito) e atualiza a seção "Decisões Globais" do TRD. Acionado por pedido explícito ("registra a decisão de…", "cria um ADR"); independe de o TRD já existir.
Fluxo de Execução
Modo Criação
Roda quando docs/trd.md não existe. O objetivo é gerar um TRD completo com o mínimo
de fricção: a maior parte do conteúdo deve vir da análise automática e do enriquecimento;
a entrevista cobre apenas as lacunas reais.
Passo 0 — Projeto sem código (a partir de documento de origem)
Quando o projeto ainda não tem código — tipicamente logo depois de um brainstorm de sistema
(brainstorm-for-systems) — não há arquivo para analisar. A fonte é o documento de origem
(a consolidação do brainstorm ou outro documento que o usuário indicar): extraia dele Stack,
Arquitetura, Requisitos Não-Funcionais e Dependências Externas, pule o Passo 1, aplique o
enriquecimento externo (Passo 2) às dependências citadas e entreviste só as lacunas. Itens que o
documento marca como Verificados entram com a fonte e a data da consulta.
Passo 1 — Análise automática do projeto
Antes de fazer qualquer pergunta, inspecione estes arquivos e padrões. Quanto mais for inferido aqui, menor será a entrevista — e uma entrevista curta é o sinal de que a skill está funcionando bem.
Stack:
package.json/ lockfiles → linguagem, runtime, dependências principais, framework, ferramentas de testetsconfig.json→ configuração TypeScript, sistema de módulos, targetpyproject.toml/requirements.txt/setup.py→ stack Pythongo.mod→ stack GoCargo.toml→ stack RustMakefile,justfile→ comandos de build e teste
Padrões:
.eslintrc*,.prettierrc*,ruff.toml,clippy.toml→ linting e formataçãojest.config.*,vitest.config.*,pytest.ini→ framework e config de testes- Scripts de teste em
package.json→ comando de teste
Arquitetura:
- Estrutura de pastas (2 níveis) → padrão arquitetural e organização
- 1-2 arquivos-fonte representativos → convenções de nomenclatura e error handling
Dependências Externas (inferência parcial):
package.json/ lockfiles → SDKs de terceiros conhecidos (ex.:stripe,@sendgrid/mail,firebase-admin) que indicam integrações externas; não liste todas as libs — só as que impõem contrato, rate limit ou comportamento arquitetural relevante.env.example/.env.sample→ variáveis que referenciam URLs ou chaves de APIs externas (ex.:STRIPE_SECRET_KEY,REDIS_URL,AUTH0_DOMAIN) revelam dependências não óbviasdocker-compose.yml/docker-compose.yaml→ serviços declarados (ex.: Redis, Postgres, RabbitMQ) que o projeto depende em desenvolvimentoterraform/,infra/,k8s/→ recursos de infraestrutura que revelam dependências de cloud
Requisitos Não-Funcionais (inferência limitada):
- Arquivos de configuração de infraestrutura podem revelar constraints (ex.: limites de memória
no
docker-compose, timeouts em configs de proxy/gateway) - Em geral, NFRs raramente ficam em arquivos — são candidatos prioritários para a entrevista
Após a análise, mapeie internamente o que foi inferido com confiança vs. o que ficou incerto. As incertezas alimentam os passos 2 e 3.
Passo 2 — Enriquecimento por busca externa
Para cada dependência externa identificada no Passo 1, busque ativamente os constraints públicos relevantes antes de perguntar ao usuário — perguntar sobre algo que a documentação já responde é desperdício de fricção.
Como buscar:
Use qualquer MCP ou ferramenta disponível que permita acessar documentação ou fazer consultas
relevantes — WebSearch, MCPs de documentação de linguagens/frameworks, MCPs de serviços
específicos (ex.: context7 para libs), ou qualquer outro disponível na sessão. O critério
é: a ferramenta consegue retornar informação técnica confiável sobre o serviço?
- Priorize serviços com documentação pública e estável: rate limits, SLAs, comportamentos padrão, timeouts, limites de conexão, quotas
- Para sistemas internos do projeto, não busque — essas informações vêm exclusivamente da entrevista com o usuário
- Se múltiplas ferramentas estão disponíveis para o mesmo serviço, prefira a mais especializada (ex.: MCP do serviço > WebSearch genérica)
Como registrar:
- Anote o resultado internamente com a fonte (ex.:
[WebSearch],[context7],[MCP stripe]) - Trate o resultado como sugestão pré-preenchida, nunca como fato confirmado — o usuário valida no preview antes de gravar
- Se a busca não retornar resultado confiável ou a documentação for ambígua, classifique como lacuna e inclua na entrevista normalmente
Exemplos de constraints a buscar:
| Serviço detectado | O que buscar |
|---|---|
Stripe / @stripe/stripe-js | Rate limit por endpoint, comportamento de idempotência |
Redis / ioredis | Max connections padrão, TTL máximo, comportamento em memória cheia |
SendGrid / @sendgrid/mail | Rate limit de envio, limites de bounce |
Auth0 / auth0 | Rate limit de autenticação, expiração padrão de tokens |
AWS S3 / @aws-sdk/client-s3 | Limites de tamanho de objeto, rate limit de requests |
Firebase / firebase-admin | Limites de leitura/escrita no Firestore, quotas |
Passo 3 — Mini-entrevista para lacunas
Entreviste apenas o que não foi possível inferir nem enriquecer pela busca externa. O limite é ≤5 perguntas (target do PRD; máximo aceitável: 8). Por quê esse limite? Se precisar de mais perguntas, o problema está na análise e no enriquecimento, não no usuário — a entrevista deve ser o complemento, não o caminho principal.
Dependências já enriquecidas no Passo 2 não geram pergunta — apenas aparecem no preview como sugestão para confirmação. Só pergunte sobre uma dependência externa se a busca não retornou resultado confiável.
Agrupe até 2 perguntas relacionadas por mensagem para reduzir o vai-e-vem. Prioridade:
- Lacunas de stack (se linguagem ou runtime não ficou claro)
- Padrão arquitetural (se a estrutura de pastas não revelou)
- Comando de teste (se não encontrou em scripts ou config)
- Convenções (se não há config de linting/formatação)
- Requisitos não-funcionais principais (se nenhum indício nos arquivos de infra): perguntar por performance esperada, SLA e restrições de segurança em uma única pergunta agrupada — NFRs raramente são inferíveis e têm alto impacto em planos
- Dependências externas não óbvias (se
.env.exampleou lockfile não revelaram, e busca externa não cobriu): perguntar quais APIs de terceiros ou serviços internos o projeto consome e se há rate limits ou contratos a respeitar - Localização de ADRs (se
docs/adrs/não existe e o usuário pode ter outro path)
As prioridades 5 e 6 podem ser agrupadas numa única mensagem quando ambas faltam, mantendo o limite de ≤5 trocas de mensagem.
Passo 4 — Varredura de ADRs (US03)
Escaneie docs/adrs/ em busca de ADRs existentes. Para cada arquivo encontrado, extraia:
- Título: do H1 ou do nome do arquivo
- Data: do frontmatter ou do prefixo do nome do arquivo
- Status: campo
statusdo frontmatter ou palavra-chave no corpo (aceito/obsoleto) - Link: caminho relativo a partir de
docs/trd.md
ADRs com status obsoleto são listados com marcação visual ~~título~~ — nunca removidos.
Não inlinar o conteúdo dos ADRs: eles podem ser extensos e mudam independentemente do TRD.
Se docs/adrs/ não existir, use *(nenhuma decisão registrada ainda)* na seção. Se o
usuário informou outro path, escaneie esse path.
Passo 5 — Preview e gravação
Gere as 6 seções usando references/template-trd.md como estrutura canônica. Antes de
gravar, mostre um preview de cada seção ao usuário e peça confirmação. Sugestões vindas do
Passo 2 devem aparecer marcadas com a fonte para que o usuário saiba o que foi inferido vs.
buscado vs. informado manualmente.
Se docs/ não existir, crie o diretório antes de gravar. Se o usuário cancelar, não
grave o arquivo — cancelamento não tem efeito colateral.
Modo Edição
Roda quando docs/trd.md já existe. A detecção é automática — o usuário não precisa
especificar o modo. O objetivo é manter o TRD sincronizado sem jogar fora o que já está
correto: a entrevista é focada apenas no que divergiu, poupando o usuário de revalidar
o que não mudou.
Passo 1 — Leitura do TRD atual
Leia docs/trd.md integralmente. Se o arquivo existir mas estiver vazio ou corrompido
(sem seções reconhecíveis), trate como modo criação e avise o usuário.
Passo 2 — Re-análise e enriquecimento
Repita a análise automática com os mesmos critérios do Modo Criação (Passo 1). O resultado é um "estado atual inferido" que será comparado com o TRD existente.
Para dependências externas novas detectadas nesta re-análise (presentes no projeto mas ausentes do TRD atual), aplique o enriquecimento por busca externa (Passo 2 do Modo Criação) antes de apresentá-las ao usuário. Dependências já documentadas no TRD não precisam ser rebuscadas.
Passo 3 — Detecção de divergências
Compare o TRD com o estado inferido e classifique as divergências em todas as 6 seções (Stack, Arquitetura, Requisitos Não-Funcionais, Dependências Externas, Padrões, Decisões Globais):
- (a) Mudança no projeto não refletida no TRD — ex.: framework mudou, nova dependência
externa adicionada, novo serviço no
docker-compose, variável de ambiente nova no.env.example - (b) Entrada no TRD que não se verifica mais no projeto — ex.: dependência removida, padrão abandonado, serviço externo descontinuado
- (c) Área ambígua — algo diferente identificado, mas sem certeza se é mudança real ou variação de interpretação
- (d) Seção ausente no TRD — ex.: TRD criado antes de ter as seções de Requisitos Não-Funcionais ou Dependências Externas; nesse caso oferecer preenchê-la via entrevista focada
Se nenhuma divergência for encontrada, informe que o TRD está sincronizado e encerre sem edições.
Passo 4 — Entrevista focada
Apresente as divergências e, para cada uma, ofereça a decisão: atualizar, manter ou ignorar. Não recolha informações que já estão corretas no TRD — o foco é no delta, não numa reentrevista completa. Isso preserva o trabalho que o usuário já aprovou.
Tratamento de ADRs: Referências a ADRs no TRD são preservadas por padrão — nunca
removidas sem confirmação explícita. Se um ADR referenciado não for encontrado no
repositório, marque como *(arquivo não encontrado)* e pergunte se deve remover a
referência. ADRs com status obsoleto permanecem listados com ~~título~~.
Passo 5 — Preview e gravação
Mostre um resumo das alterações aprovadas (seções que mudaram vs. preservadas) antes de gravar. O TRD é sobrescrito apenas ao final, com todas as alterações aprovadas.
Se o usuário cancelar em qualquer ponto, não grave — o arquivo original permanece intacto. Cancelamento não tem efeito colateral: perder o TRD anterior seria pior do que refazer a entrevista depois.
Modo Decision
Roda quando o usuário pede para registrar uma decisão técnica ("registra a decisão de…",
"cria um ADR", "decidimos trocar X por Y"). Independe de o TRD existir — ADRs vivem em
docs/adrs/ por conta própria. Cria um ADR a partir de references/template-adr.md.
Quando é ADR (e quando não é)
Registrar como ADR só decisão durável, de blast radius amplo e cara de reverter — escolha
de banco, estratégia de auth, padrão arquitetural, biblioteca estruturante, convenção de API.
Decisão local a uma feature não é ADR: se for difícil de reverter (nova dependência, modelo de
dados, interface entre fatias), mora no PLAN da fatia, gerado pelo sdd-especificar; se for
reversível (qual util reusar, como fiar um endpoint), nem precisa de registro. Se o pedido for de
decisão local, avisar e sugerir o caminho certo em vez de criar ADR.
Passo 1 — Numeração
Listar docs/adrs/ (criar o diretório se não existir). O próximo ADR recebe o maior número
existente + 1, no formato NNN de 3 dígitos. Se não houver nenhum, começar em 001.
Passo 2 — Geração draft-first
Gerar o ADR completo a partir do que o usuário descreveu, sem entrevista longa. Inferir
Contexto, Alternativas Consideradas e Consequências faltantes e marcar cada inferência com
*(premissa — confirme ou corrija)*. O status inicial é aceito quando o usuário já
decidiu, ou proposto quando a decisão ainda está em aberto.
Passo 3 — Supersedência
Se a decisão substitui uma anterior, identificar o ADR antigo:
- No ADR novo, preencher
supersedes: "NNN". - No ADR antigo, preencher
superseded_by: "NNN"e mudarstatusparaobsoleto— única alteração permitida num ADRaceito. Não editar mais nada do ADR antigo.
Passo 4 — Gravação e referência no TRD
- Gravar
docs/adrs/NNN-slug.md. - Se
docs/trd.mdexiste, atualizar a tabela "Decisões Globais" com a nova linha (#, título, data, status, link). ADRobsoletoé renderizado como~~título~~, nunca removido. - Se
docs/trd.mdnão existe, informar que o ADR será indexado automaticamente na próxima Criação do TRD (a Varredura de ADRs do Modo Criação cobre isso). - Sugerir commit:
docs(adr): adiciona ADR-NNN <slug>.
Imutabilidade
ADR aceito é imutável, exceto o status quando outro ADR o supersede. Revisar uma decisão
nunca é editar o ADR — é criar um novo com supersedes apontando para o antigo. Mesma
disciplina da imutabilidade do PRD concluido.
Templates de referência
references/template-trd.md— estrutura canônica do TRD gerado com as 6 seções obrigatórias. Consultar sempre ao gerar ou editar seções do TRD.references/template-adr.md— estrutura canônica do ADR gerado no Modo Decision. Consultar sempre ao criar um ADR.
Fora do escopo
Esta skill não:
- Cria PRDs (papel de
escrever-prd) - Gera SPEC, PLAN ou TASKS (papel do
sdd-especificar) - Cria ADRs fora do Modo Decision — nos modos Criação e Edição apenas referencia os ADRs já existentes em
docs/adrs/; a criação de ADR é exclusiva do Modo Decision - Toma decisões de negócio — lacunas são devolvidas ao usuário
- Edita
docs/trd.mdse o usuário cancelar o preview antes de gravar