Mode d’emploi
- Copiez la commande et examinez le paquet avant de l’installer dans votre environnement agent.
- Consultez le document original pour les outils, identifiants et environnements requis.
- Décrivez les entrées et le livrable souhaité ; comparez la sortie aux sources.
npx skills add https://github.com/fabricioveronez/harness-publico --skill escrever-trdAvant de commencer
- L’installation n’inclut ni abonnement au modèle, ni quota API, ni accès aux fichiers.
- Étoiles et installations reflètent l’activité, pas un test indépendant de qualité ou de sécurité.
Rendu depuis le dépôt source en conservant titres, exemples, code, tableaux, liens et images.
Escrever 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 do references/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ós aceito) 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 óbvias
docker-compose.yml/docker-compose.yaml→ serviços declarados (ex.: Redis, Postgres,
RabbitMQ) que o projeto depende em desenvolvimento
terraform/,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 ADR aceito**. 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). ADR obsoleto é 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



