dd-harness 0.36.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -80,382 +80,382 @@ Critérios fortes deixam você iterar sozinho. Critérios fracos ("faça funcion
80
80
  slug: "gravar-com-ancora",
81
81
  descricao: `Grava uma memória no Brain amarrada ao ponto do código de que ela fala. Invoque quando for gravar memória que descreve um arquivo, função, chave de config ou trecho específico — a âncora é o que faz a memória ser entregue a quem mexer ali depois. Não use para memória que fala do projeto como um todo.`,
82
82
  ferramentas: ["mcp__dd-harness__sugerir_ancoras", "mcp__dd-harness__gravar_memoria", "mcp__dd-harness__buscar_memoria", "Read", "Grep"],
83
- conteudo: `# Gravar memória com âncora
84
-
85
- Memória sem âncora só aparece se alguém lembrar de buscar — e é justamente quando o
86
- agente *acha que sabe* que ele não busca. A âncora inverte isso: ela faz a memória chegar
87
- antes da edição, sem ninguém pedir.
88
-
89
- Este procedimento é sobre **escolher o alvo certo**. Gravar é uma chamada; escolher a
90
- âncora é a decisão que faz a memória proteger algo ou nascer inerte.
91
-
92
- ## 1. Confira que ela não existe
93
-
94
- Chame \`buscar_memoria\` com a pergunta que a memória responderia. Se já houver uma que diz
95
- a mesma coisa, **edite aquela** em vez de criar uma segunda — duas memórias dizendo o
96
- mesmo se contradizem no dia em que uma for corrigida.
97
-
98
- ## 2. Descubra o que a sessão tocou
99
-
100
- \`sugerir_ancoras\` devolve os arquivos modificados. Isso é **matéria-prima, não escolha**:
101
- a lista mostra onde o trabalho aconteceu, e a âncora certa é o ponto de que a *memória*
102
- fala — que pode ser um arquivo que você só leu.
103
-
104
- Lista vazia (projeto sem git) não é impedimento: pergunte ao usuário qual ponto a memória
105
- guarda.
106
-
107
- ## 3. Escolha o alvo — a decisão que importa
108
-
109
- **Prefira sempre \`arquivo#trecho\` a \`arquivo\` inteiro.**
110
-
111
- Medido neste projeto: duas memórias ancoradas no mesmo \`config/limites.json\` eram **as
112
- duas** sinalizadas quando só uma das chaves mudava. Alerta que dispara no lugar errado
113
- ensina a ignorar o mecanismo — e aí ele deixa de proteger.
114
-
115
- O trecho precisa ser **estável e específico**:
116
-
117
- | Bom alvo | Por quê |
118
- |---|---|
119
- | \`SECURITY DEFINER\` | é a decisão em si; some só se a decisão mudar |
120
- | \`poolConexoesPostgres\` | nome de chave, sobrevive a reformatação |
121
- | \`processarPagamento\` | nome de função, muda só em rename deliberado |
122
-
123
- | Alvo ruim | Por quê |
124
- |---|---|
125
- | \`const x = 3\` | a próxima refatoração reescreve |
126
- | \`// TODO\` | aparece em toda parte do arquivo |
127
- | uma linha inteira de código | qualquer espaço a mais quebra o casamento |
128
-
129
- **Confirme antes de gravar:** abra o arquivo e veja quantas linhas contêm o texto do alvo.
130
- Se aparecer em dez lugares, o alvo é largo demais. Se não aparecer em nenhum, a âncora
131
- nasce quebrada — e ninguém descobre, porque alvo ausente parece deriva legítima.
132
-
133
- ## 4. Âncora de diretório: quando cabe
134
-
135
- \`supabase/migrations\` faz sentido para memória que fala da pasta inteira ("toda migration
136
- precisa de X"). Não use diretório quando a memória fala de um arquivo dentro dele.
137
-
138
- ## 5. Proponha ao humano, com o alvo explícito
139
-
140
- Diga qual âncora você escolheu **e por quê aquele trecho**. Se você não consegue explicar
141
- por que o alvo é estável, provavelmente ele não é.
142
-
143
- Só então chame \`gravar_memoria\`.
144
-
145
- ## Se a memória não tem ponto no código
146
-
147
- Grave sem âncora, e **diga isso ao usuário**: ela só será encontrada por busca, e ninguém
148
- será avisado ao mexer em nada. Para memória sobre um acordo com cliente ou uma regra da
83
+ conteudo: `# Gravar memória com âncora
84
+
85
+ Memória sem âncora só aparece se alguém lembrar de buscar — e é justamente quando o
86
+ agente *acha que sabe* que ele não busca. A âncora inverte isso: ela faz a memória chegar
87
+ antes da edição, sem ninguém pedir.
88
+
89
+ Este procedimento é sobre **escolher o alvo certo**. Gravar é uma chamada; escolher a
90
+ âncora é a decisão que faz a memória proteger algo ou nascer inerte.
91
+
92
+ ## 1. Confira que ela não existe
93
+
94
+ Chame \`buscar_memoria\` com a pergunta que a memória responderia. Se já houver uma que diz
95
+ a mesma coisa, **edite aquela** em vez de criar uma segunda — duas memórias dizendo o
96
+ mesmo se contradizem no dia em que uma for corrigida.
97
+
98
+ ## 2. Descubra o que a sessão tocou
99
+
100
+ \`sugerir_ancoras\` devolve os arquivos modificados. Isso é **matéria-prima, não escolha**:
101
+ a lista mostra onde o trabalho aconteceu, e a âncora certa é o ponto de que a *memória*
102
+ fala — que pode ser um arquivo que você só leu.
103
+
104
+ Lista vazia (projeto sem git) não é impedimento: pergunte ao usuário qual ponto a memória
105
+ guarda.
106
+
107
+ ## 3. Escolha o alvo — a decisão que importa
108
+
109
+ **Prefira sempre \`arquivo#trecho\` a \`arquivo\` inteiro.**
110
+
111
+ Medido neste projeto: duas memórias ancoradas no mesmo \`config/limites.json\` eram **as
112
+ duas** sinalizadas quando só uma das chaves mudava. Alerta que dispara no lugar errado
113
+ ensina a ignorar o mecanismo — e aí ele deixa de proteger.
114
+
115
+ O trecho precisa ser **estável e específico**:
116
+
117
+ | Bom alvo | Por quê |
118
+ |---|---|
119
+ | \`SECURITY DEFINER\` | é a decisão em si; some só se a decisão mudar |
120
+ | \`poolConexoesPostgres\` | nome de chave, sobrevive a reformatação |
121
+ | \`processarPagamento\` | nome de função, muda só em rename deliberado |
122
+
123
+ | Alvo ruim | Por quê |
124
+ |---|---|
125
+ | \`const x = 3\` | a próxima refatoração reescreve |
126
+ | \`// TODO\` | aparece em toda parte do arquivo |
127
+ | uma linha inteira de código | qualquer espaço a mais quebra o casamento |
128
+
129
+ **Confirme antes de gravar:** abra o arquivo e veja quantas linhas contêm o texto do alvo.
130
+ Se aparecer em dez lugares, o alvo é largo demais. Se não aparecer em nenhum, a âncora
131
+ nasce quebrada — e ninguém descobre, porque alvo ausente parece deriva legítima.
132
+
133
+ ## 4. Âncora de diretório: quando cabe
134
+
135
+ \`supabase/migrations\` faz sentido para memória que fala da pasta inteira ("toda migration
136
+ precisa de X"). Não use diretório quando a memória fala de um arquivo dentro dele.
137
+
138
+ ## 5. Proponha ao humano, com o alvo explícito
139
+
140
+ Diga qual âncora você escolheu **e por quê aquele trecho**. Se você não consegue explicar
141
+ por que o alvo é estável, provavelmente ele não é.
142
+
143
+ Só então chame \`gravar_memoria\`.
144
+
145
+ ## Se a memória não tem ponto no código
146
+
147
+ Grave sem âncora, e **diga isso ao usuário**: ela só será encontrada por busca, e ninguém
148
+ será avisado ao mexer em nada. Para memória sobre um acordo com cliente ou uma regra da
149
149
  organização, isso é o correto — não force uma âncora que não existe só para ter uma.`,
150
150
  },
151
151
  {
152
152
  slug: "resolver-deriva",
153
153
  descricao: `Decide o que fazer quando o check acusa deriva numa memória — se ela ainda vale, se a âncora mudou de lugar, ou se o mundo mudou e ela morreu. Invoque ao ver ALVO AUSENTE ou alvo alterado no resultado de dd-harness check, ou quando o status mostrar observações esperando julgamento.`,
154
154
  ferramentas: ["mcp__dd-harness__ler_memoria", "mcp__dd-harness__editar_memoria", "mcp__dd-harness__arquivar_memoria", "Read", "Grep", "Bash(dd-harness check:*)", "Bash(dd-harness status:*)", "Bash(dd-harness reancorar:*)", "Bash(git log:*)", "Bash(git diff:*)"],
155
- conteudo: `# Resolver deriva
156
-
157
- Deriva é a memória avisando que o mundo que ela descreve mudou. Há **três** respostas
158
- possíveis, e o atalho tentador é sempre o mesmo — marcar "ainda vale" e fechar o alarme.
159
-
160
- É assim que um Brain apodrece parecendo saudável: nenhuma observação aberta, e metade das
161
- memórias descrevendo um código que não existe mais.
162
-
163
- ## Primeiro: qual é o tipo?
164
-
165
- \`dd-harness check\` distingue dois, e eles pedem coisas diferentes.
166
-
167
- **ALVO AUSENTE** — o arquivo ou trecho não existe mais no caminho ancorado.
168
- **Alterado** — o alvo existe e o conteúdo mudou desde a linha de base.
169
-
170
- ## ALVO AUSENTE: quase sempre é reancorar
171
-
172
- O arquivo mudou de lugar. Se houve rename no commit, o \`check --commit\` já imprime o
173
- comando \`dd-harness reancorar\` pronto — **confira o destino antes de rodar**: rename por
174
- similaridade é heurística do git, e reancorar para o lugar errado move a memória em
175
- silêncio, o que é pior que o alvo ausente.
176
-
177
- Se não houve rename, procure o conteúdo (\`Grep\` pelo trecho ancorado). Três desfechos:
178
-
179
- - **achou noutro lugar** → reancore para lá
180
- - **o trecho foi renomeado** (a função virou outra coisa) → reancore para o nome novo, e
181
- confira se a memória ainda descreve o que aquele código faz
182
- - **sumiu de vez** → o mundo mudou; siga para "a memória morreu"
183
-
184
- ## Alterado: leia a memória ANTES de decidir
185
-
186
- Isto é o passo que o atalho pula. Abra a memória com \`ler_memoria\` e leia o **porquê** —
187
- não o título. A pergunta é:
188
-
189
- > A razão que fez esta memória existir continua verdadeira?
190
-
191
- Compare com o que mudou (\`git diff\` no alvo). Três desfechos, e cada um tem uma ação
192
- diferente:
193
-
194
- **1. A memória ainda vale** — o código mudou por perto, mas a razão externa continua de
195
- pé (o fornecedor continua limitando, o compliance continua exigindo). Resolva como "ainda
196
- vale": a linha de base passa a ser o estado atual.
197
-
198
- **2. A memória vale, mas o texto envelheceu** — a razão é a mesma, a descrição não bate
199
- mais com o código. **Edite a memória** e depois resolva. Resolver sem editar guarda uma
200
- memória que vai confundir quem a ler.
201
-
202
- **3. A razão deixou de existir** — o fornecedor mudou o limite, a lib foi trocada, a
203
- decisão foi revertida. Aí não é "ainda vale": é \`arquivar_memoria\` com motivo
204
- \`obsoleta\`. Se outra memória tomou o lugar, use \`--substituida-por\`.
205
-
206
- ## Nunca faça
207
-
208
- **Não resolva em lote.** Cinco observações abertas são cinco perguntas diferentes; marcar
209
- todas como "ainda vale" é o mesmo que não ter medido nada.
210
-
211
- **Não decida sozinho pelo arquivamento.** Resolver "ainda vale" é reversível — a próxima
212
- deriva reabre. Arquivar tira a memória de circulação, e quem vier depois não saberá que
213
- ela existiu se você errar. Proponha ao humano.
214
-
215
- **Não edite o código para fechar a deriva.** Se o alvo mudou porque alguém corrigiu um
216
- bug, o código está certo e a memória é que precisa acompanhar.
217
-
218
- ## O caso que parece deriva e não é
219
-
220
- Se o primeiro \`check\` de um projeto acusa tudo, isso não é deriva: é a **linha de base
221
- sendo adotada**. Medido numa rodada de teste — rodar o primeiro \`check\` com o código já
222
- alterado fixa o estado errado como base, e reverter para o valor correto passa a ser "a
155
+ conteudo: `# Resolver deriva
156
+
157
+ Deriva é a memória avisando que o mundo que ela descreve mudou. Há **três** respostas
158
+ possíveis, e o atalho tentador é sempre o mesmo — marcar "ainda vale" e fechar o alarme.
159
+
160
+ É assim que um Brain apodrece parecendo saudável: nenhuma observação aberta, e metade das
161
+ memórias descrevendo um código que não existe mais.
162
+
163
+ ## Primeiro: qual é o tipo?
164
+
165
+ \`dd-harness check\` distingue dois, e eles pedem coisas diferentes.
166
+
167
+ **ALVO AUSENTE** — o arquivo ou trecho não existe mais no caminho ancorado.
168
+ **Alterado** — o alvo existe e o conteúdo mudou desde a linha de base.
169
+
170
+ ## ALVO AUSENTE: quase sempre é reancorar
171
+
172
+ O arquivo mudou de lugar. Se houve rename no commit, o \`check --commit\` já imprime o
173
+ comando \`dd-harness reancorar\` pronto — **confira o destino antes de rodar**: rename por
174
+ similaridade é heurística do git, e reancorar para o lugar errado move a memória em
175
+ silêncio, o que é pior que o alvo ausente.
176
+
177
+ Se não houve rename, procure o conteúdo (\`Grep\` pelo trecho ancorado). Três desfechos:
178
+
179
+ - **achou noutro lugar** → reancore para lá
180
+ - **o trecho foi renomeado** (a função virou outra coisa) → reancore para o nome novo, e
181
+ confira se a memória ainda descreve o que aquele código faz
182
+ - **sumiu de vez** → o mundo mudou; siga para "a memória morreu"
183
+
184
+ ## Alterado: leia a memória ANTES de decidir
185
+
186
+ Isto é o passo que o atalho pula. Abra a memória com \`ler_memoria\` e leia o **porquê** —
187
+ não o título. A pergunta é:
188
+
189
+ > A razão que fez esta memória existir continua verdadeira?
190
+
191
+ Compare com o que mudou (\`git diff\` no alvo). Três desfechos, e cada um tem uma ação
192
+ diferente:
193
+
194
+ **1. A memória ainda vale** — o código mudou por perto, mas a razão externa continua de
195
+ pé (o fornecedor continua limitando, o compliance continua exigindo). Resolva como "ainda
196
+ vale": a linha de base passa a ser o estado atual.
197
+
198
+ **2. A memória vale, mas o texto envelheceu** — a razão é a mesma, a descrição não bate
199
+ mais com o código. **Edite a memória** e depois resolva. Resolver sem editar guarda uma
200
+ memória que vai confundir quem a ler.
201
+
202
+ **3. A razão deixou de existir** — o fornecedor mudou o limite, a lib foi trocada, a
203
+ decisão foi revertida. Aí não é "ainda vale": é \`arquivar_memoria\` com motivo
204
+ \`obsoleta\`. Se outra memória tomou o lugar, use \`--substituida-por\`.
205
+
206
+ ## Nunca faça
207
+
208
+ **Não resolva em lote.** Cinco observações abertas são cinco perguntas diferentes; marcar
209
+ todas como "ainda vale" é o mesmo que não ter medido nada.
210
+
211
+ **Não decida sozinho pelo arquivamento.** Resolver "ainda vale" é reversível — a próxima
212
+ deriva reabre. Arquivar tira a memória de circulação, e quem vier depois não saberá que
213
+ ela existiu se você errar. Proponha ao humano.
214
+
215
+ **Não edite o código para fechar a deriva.** Se o alvo mudou porque alguém corrigiu um
216
+ bug, o código está certo e a memória é que precisa acompanhar.
217
+
218
+ ## O caso que parece deriva e não é
219
+
220
+ Se o primeiro \`check\` de um projeto acusa tudo, isso não é deriva: é a **linha de base
221
+ sendo adotada**. Medido numa rodada de teste — rodar o primeiro \`check\` com o código já
222
+ alterado fixa o estado errado como base, e reverter para o valor correto passa a ser "a
223
223
  mudança". Rode \`check\` antes de editar, não depois.`,
224
224
  },
225
225
  {
226
226
  slug: "promover-ou-nao",
227
227
  descricao: `Decide se uma memória deve valer para todo projeto do espaço, ou continuar só neste. Invoque ao gravar ou revisar uma memória que parece falar de algo maior que o projeto — um limite de fornecedor, uma regra da organização, uma armadilha da linguagem. Também ao revisar as globais existentes.`,
228
228
  ferramentas: ["mcp__dd-harness__ler_memoria", "mcp__dd-harness__buscar_memoria", "mcp__dd-harness__promover_memoria"],
229
- conteudo: `# Promover, ou não
230
-
231
- Memória global vale para **todo projeto do espaço, inclusive os que ainda não existem**.
232
- Ela chega ao contexto de qualquer sessão e dispara o alerta antes da edição, como as do
233
- próprio projeto.
234
-
235
- Isso é força e é risco: memória global errada **erra em escala**.
236
-
237
- ## O teste, em uma pergunta
238
-
239
- > Se o próximo projeto repetir este erro, esta memória o teria evitado?
240
-
241
- Se a resposta for sim, é global. Se você precisa construir um cenário para chegar ao sim,
242
- não é.
243
-
244
- ## O que passa
245
-
246
- A razão vem de **fora deste projeto** e continuaria valendo se o projeto não existisse:
247
-
248
- - **limite de fornecedor** — "o gateway recusa mais de N tentativas por contrato"
249
- - **regra da organização** — "todo repositório aqui exige revisão de dois"
250
- - **armadilha da linguagem ou da ferramenta** — "\`REVOKE\` por coluna não tem efeito
251
- quando existe \`GRANT\` na tabela inteira"
252
- - **bug de terceiro com workaround** — "a versão X da lib quebra em Y; não subir"
253
-
254
- Repare no padrão: nenhuma delas menciona um arquivo deste repositório.
255
-
256
- ## O que NÃO passa
257
-
258
- - **decisão deste projeto** — "aqui usamos Drizzle em vez de Prisma". Vale para um
259
- projeto; noutro a escolha pode ser outra, e a memória global mentiria.
260
- - **acordo com um cliente específico** — é do projeto daquele cliente.
261
- - **algo ancorado num arquivo deste repositório** — se a âncora aponta para
262
- \`src/pagamento.js\`, a memória fala deste código. Para alcançar alguns projetos
263
- nomeados, existe \`projetos:\` no frontmatter, que é uma **lista** — diferente de global,
264
- que é uma propriedade.
265
- - **"é interessante para todos saberem"** — interessante não é o critério. O critério é
266
- o erro que ela evita.
267
-
268
- ## A ordem importa
269
-
270
- **Grave no projeto primeiro. Promova depois.**
271
-
272
- A memória nasce onde a lição apareceu, e continua morando lá mesmo depois de promovida —
273
- a origem é metade do porquê. *"Descobrimos isto no projeto de pagamentos"* explica a
274
- lição de um jeito que uma origem apagada não explicaria.
275
-
276
- ## Proponha, não promova
277
-
278
- Promover multiplica o alcance. Leve ao humano com:
279
-
280
- 1. **o teste respondido** — qual erro futuro ela evita, em que projeto plausível
281
- 2. **por que não é deste projeto** — a razão externa, nomeada
282
- 3. **o que acontece se estiver errada** — ela vai chegar a todo projeto do espaço
283
-
284
- Só então \`promover_memoria\`.
285
-
286
- ## Revisar as globais
287
-
288
- É reversível: \`promover_memoria\` com \`global: false\` traz de volta. Ao revisar o acervo
289
- global, reaplique o teste em cada uma — uma memória que era global e virou específica
290
- (porque o fornecedor mudou, porque a regra caiu) deve voltar ao projeto, não ficar.
291
-
292
- **Uma trava a conhecer:** uma global sem vínculo com projeto algum **não pode ser
229
+ conteudo: `# Promover, ou não
230
+
231
+ Memória global vale para **todo projeto do espaço, inclusive os que ainda não existem**.
232
+ Ela chega ao contexto de qualquer sessão e dispara o alerta antes da edição, como as do
233
+ próprio projeto.
234
+
235
+ Isso é força e é risco: memória global errada **erra em escala**.
236
+
237
+ ## O teste, em uma pergunta
238
+
239
+ > Se o próximo projeto repetir este erro, esta memória o teria evitado?
240
+
241
+ Se a resposta for sim, é global. Se você precisa construir um cenário para chegar ao sim,
242
+ não é.
243
+
244
+ ## O que passa
245
+
246
+ A razão vem de **fora deste projeto** e continuaria valendo se o projeto não existisse:
247
+
248
+ - **limite de fornecedor** — "o gateway recusa mais de N tentativas por contrato"
249
+ - **regra da organização** — "todo repositório aqui exige revisão de dois"
250
+ - **armadilha da linguagem ou da ferramenta** — "\`REVOKE\` por coluna não tem efeito
251
+ quando existe \`GRANT\` na tabela inteira"
252
+ - **bug de terceiro com workaround** — "a versão X da lib quebra em Y; não subir"
253
+
254
+ Repare no padrão: nenhuma delas menciona um arquivo deste repositório.
255
+
256
+ ## O que NÃO passa
257
+
258
+ - **decisão deste projeto** — "aqui usamos Drizzle em vez de Prisma". Vale para um
259
+ projeto; noutro a escolha pode ser outra, e a memória global mentiria.
260
+ - **acordo com um cliente específico** — é do projeto daquele cliente.
261
+ - **algo ancorado num arquivo deste repositório** — se a âncora aponta para
262
+ \`src/pagamento.js\`, a memória fala deste código. Para alcançar alguns projetos
263
+ nomeados, existe \`projetos:\` no frontmatter, que é uma **lista** — diferente de global,
264
+ que é uma propriedade.
265
+ - **"é interessante para todos saberem"** — interessante não é o critério. O critério é
266
+ o erro que ela evita.
267
+
268
+ ## A ordem importa
269
+
270
+ **Grave no projeto primeiro. Promova depois.**
271
+
272
+ A memória nasce onde a lição apareceu, e continua morando lá mesmo depois de promovida —
273
+ a origem é metade do porquê. *"Descobrimos isto no projeto de pagamentos"* explica a
274
+ lição de um jeito que uma origem apagada não explicaria.
275
+
276
+ ## Proponha, não promova
277
+
278
+ Promover multiplica o alcance. Leve ao humano com:
279
+
280
+ 1. **o teste respondido** — qual erro futuro ela evita, em que projeto plausível
281
+ 2. **por que não é deste projeto** — a razão externa, nomeada
282
+ 3. **o que acontece se estiver errada** — ela vai chegar a todo projeto do espaço
283
+
284
+ Só então \`promover_memoria\`.
285
+
286
+ ## Revisar as globais
287
+
288
+ É reversível: \`promover_memoria\` com \`global: false\` traz de volta. Ao revisar o acervo
289
+ global, reaplique o teste em cada uma — uma memória que era global e virou específica
290
+ (porque o fornecedor mudou, porque a regra caiu) deve voltar ao projeto, não ficar.
291
+
292
+ **Uma trava a conhecer:** uma global sem vínculo com projeto algum **não pode ser
293
293
  despromovida** — isso a deixaria invisível. Vincule-a a um projeto antes, ou apague.`,
294
294
  },
295
295
  {
296
296
  slug: "escrever-skill",
297
297
  descricao: `Escreve uma skill que o modelo de fato invoca e segue, em vez de uma que existe e nunca dispara. Invoque ao criar ou revisar uma skill deste projeto — ou quando notar que um procedimento já foi explicado três vezes e devia estar escrito.`,
298
298
  ferramentas: ["mcp__dd-harness__listar_skills", "Read"],
299
- conteudo: `# Escrever uma skill que funciona
300
-
301
- A falha mais comum de skill não é estar errada — é **nunca disparar**. Ela existe, o
302
- procedimento está certo, e o modelo nunca a invoca. Não há erro, ninguém descobre, e o
303
- esforço de escrevê-la some.
304
-
305
- O segundo modo de falha é ser prosa: um texto que descreve o assunto em vez de dar os
306
- passos, e que o modelo lê sem mudar nada do que ia fazer.
307
-
308
- ## Antes: isto é mesmo uma skill?
309
-
310
- Três filtros, **conjuntivos**. Falhou um, não escreva.
311
-
312
- | # | Filtro | A pergunta | É skill se |
313
- |---|---|---|---|
314
- | 1 | **Repetição consumada** | Isto já foi executado três vezes, em sessões diferentes? | sim — a terceira, não a segunda |
315
- | 2 | **Passos, não conhecimento** | É uma sequência que se executa, ou um fato que se sabe? | passos — fato é memória |
316
- | 3 | **Estável** | Os passos seriam os mesmos daqui a três meses? | sim — o que muda a cada uso é prosa |
317
-
318
- "Seria conveniente ter" não é repetição. "Fiz duas vezes" não é três.
319
-
320
- Chame \`listar_skills\` antes: se já existe uma que cobre o assunto, **edite aquela**. Duas
321
- skills parecidas competem pela invocação, e o modelo escolhe mal entre elas.
322
-
323
- ## A descrição é metade do trabalho
324
-
325
- É o **único campo que o modelo lê antes de decidir** invocar, e ele fica no contexto de
326
- toda sessão — inclusive nas que não usam a skill.
327
-
328
- **Escreva o gatilho, não o resumo.** A pergunta que a descrição responde é *"quando eu
329
- deveria parar e usar isto?"*, não *"o que isto é?"*.
330
-
331
- | Descrição ruim | Por quê |
332
- |---|---|
333
- | "Ajuda com memórias" | não diz quando; nunca dispara |
334
- | "Procedimento de gravação" | descreve a skill, não a situação |
335
- | "Use esta skill para gravar" | circular |
336
-
337
- | Descrição boa | Por quê |
338
- |---|---|
339
- | "Invoque ao gravar memória que descreve um arquivo, função ou chave de config" | nomeia a situação |
340
- | "Invoque ao ver ALVO AUSENTE no resultado de \`dd-harness check\`" | nomeia o gatilho literal |
341
-
342
- **Diga também quando NÃO usar**, se houver confusão provável com outra skill. Uma linha de
343
- exclusão evita a skill errada disparar.
344
-
345
- ## O corpo: passos e decisões, não explicação
346
-
347
- O corpo só entra no contexto quando a skill é invocada — aqui cabe detalhe. Mas detalhe
348
- não é prosa.
349
-
350
- - **Numere o que tem ordem.** Se a ordem não importa, não numere.
351
- - **Escreva a decisão, não só a ação.** "Escolha o alvo" não ajuda; "prefira
352
- \`arquivo#trecho\` porque âncora de arquivo dispara para a memória errada" ajuda.
353
- - **Nomeie o caminho errado atraente.** Toda skill que vale existe porque há um atalho
354
- tentador — diga qual é e por que ele custa caro. Sem isso o modelo pega o atalho.
355
- - **Traga a medição, quando houver.** "Medido: duas memórias no mesmo arquivo eram as
356
- duas sinalizadas" vale mais que "pode gerar ruído".
357
- - **Tabelas para distinguir casos.** Bom/ruim lado a lado decide mais rápido que dois
358
- parágrafos.
359
-
360
- Se o corpo só repete o que a descrição de uma ferramenta MCP já diz, **não escreva a
361
- skill** — a ferramenta já ensina isso, e melhor.
362
-
363
- ## O frontmatter faz diferença
364
-
365
- - **\`allowed-tools\`** — as ferramentas que a skill usa. Sem isso ela para a cada passo
366
- pedindo permissão, e a pessoa aprende a desligar o mecanismo.
367
- - **\`paths\`** — globs que carregam a skill só quando o trabalho toca aqueles arquivos. É
368
- a mesma ideia da âncora, aplicada ao procedimento. Glob largo demais é uma skill sempre
369
- presente, que era o que o campo existia para evitar.
370
- - **\`disable-model-invocation: true\`** (na interface, "só por comando") — para skill com
371
- efeito colateral, onde o momento é de quem digita.
372
- - **\`argument-hint\`** — só quando a skill recebe argumento.
373
-
374
- ## Depois de escrever
375
-
376
- **Releia a descrição sozinha**, sem o corpo. Se você não souber dizer em que momento
377
- invocá-la, o modelo também não saberá.
378
-
379
- Skill deste projeto vive no serviço: o repositório guarda só o ponteiro, e o
380
- \`dd-harness start\` o reescreve. Se você mudou a descrição, rode-o — o frontmatter em
299
+ conteudo: `# Escrever uma skill que funciona
300
+
301
+ A falha mais comum de skill não é estar errada — é **nunca disparar**. Ela existe, o
302
+ procedimento está certo, e o modelo nunca a invoca. Não há erro, ninguém descobre, e o
303
+ esforço de escrevê-la some.
304
+
305
+ O segundo modo de falha é ser prosa: um texto que descreve o assunto em vez de dar os
306
+ passos, e que o modelo lê sem mudar nada do que ia fazer.
307
+
308
+ ## Antes: isto é mesmo uma skill?
309
+
310
+ Três filtros, **conjuntivos**. Falhou um, não escreva.
311
+
312
+ | # | Filtro | A pergunta | É skill se |
313
+ |---|---|---|---|
314
+ | 1 | **Repetição consumada** | Isto já foi executado três vezes, em sessões diferentes? | sim — a terceira, não a segunda |
315
+ | 2 | **Passos, não conhecimento** | É uma sequência que se executa, ou um fato que se sabe? | passos — fato é memória |
316
+ | 3 | **Estável** | Os passos seriam os mesmos daqui a três meses? | sim — o que muda a cada uso é prosa |
317
+
318
+ "Seria conveniente ter" não é repetição. "Fiz duas vezes" não é três.
319
+
320
+ Chame \`listar_skills\` antes: se já existe uma que cobre o assunto, **edite aquela**. Duas
321
+ skills parecidas competem pela invocação, e o modelo escolhe mal entre elas.
322
+
323
+ ## A descrição é metade do trabalho
324
+
325
+ É o **único campo que o modelo lê antes de decidir** invocar, e ele fica no contexto de
326
+ toda sessão — inclusive nas que não usam a skill.
327
+
328
+ **Escreva o gatilho, não o resumo.** A pergunta que a descrição responde é *"quando eu
329
+ deveria parar e usar isto?"*, não *"o que isto é?"*.
330
+
331
+ | Descrição ruim | Por quê |
332
+ |---|---|
333
+ | "Ajuda com memórias" | não diz quando; nunca dispara |
334
+ | "Procedimento de gravação" | descreve a skill, não a situação |
335
+ | "Use esta skill para gravar" | circular |
336
+
337
+ | Descrição boa | Por quê |
338
+ |---|---|
339
+ | "Invoque ao gravar memória que descreve um arquivo, função ou chave de config" | nomeia a situação |
340
+ | "Invoque ao ver ALVO AUSENTE no resultado de \`dd-harness check\`" | nomeia o gatilho literal |
341
+
342
+ **Diga também quando NÃO usar**, se houver confusão provável com outra skill. Uma linha de
343
+ exclusão evita a skill errada disparar.
344
+
345
+ ## O corpo: passos e decisões, não explicação
346
+
347
+ O corpo só entra no contexto quando a skill é invocada — aqui cabe detalhe. Mas detalhe
348
+ não é prosa.
349
+
350
+ - **Numere o que tem ordem.** Se a ordem não importa, não numere.
351
+ - **Escreva a decisão, não só a ação.** "Escolha o alvo" não ajuda; "prefira
352
+ \`arquivo#trecho\` porque âncora de arquivo dispara para a memória errada" ajuda.
353
+ - **Nomeie o caminho errado atraente.** Toda skill que vale existe porque há um atalho
354
+ tentador — diga qual é e por que ele custa caro. Sem isso o modelo pega o atalho.
355
+ - **Traga a medição, quando houver.** "Medido: duas memórias no mesmo arquivo eram as
356
+ duas sinalizadas" vale mais que "pode gerar ruído".
357
+ - **Tabelas para distinguir casos.** Bom/ruim lado a lado decide mais rápido que dois
358
+ parágrafos.
359
+
360
+ Se o corpo só repete o que a descrição de uma ferramenta MCP já diz, **não escreva a
361
+ skill** — a ferramenta já ensina isso, e melhor.
362
+
363
+ ## O frontmatter faz diferença
364
+
365
+ - **\`allowed-tools\`** — as ferramentas que a skill usa. Sem isso ela para a cada passo
366
+ pedindo permissão, e a pessoa aprende a desligar o mecanismo.
367
+ - **\`paths\`** — globs que carregam a skill só quando o trabalho toca aqueles arquivos. É
368
+ a mesma ideia da âncora, aplicada ao procedimento. Glob largo demais é uma skill sempre
369
+ presente, que era o que o campo existia para evitar.
370
+ - **\`disable-model-invocation: true\`** (na interface, "só por comando") — para skill com
371
+ efeito colateral, onde o momento é de quem digita.
372
+ - **\`argument-hint\`** — só quando a skill recebe argumento.
373
+
374
+ ## Depois de escrever
375
+
376
+ **Releia a descrição sozinha**, sem o corpo. Se você não souber dizer em que momento
377
+ invocá-la, o modelo também não saberá.
378
+
379
+ Skill deste projeto vive no serviço: o repositório guarda só o ponteiro, e o
380
+ \`dd-harness start\` o reescreve. Se você mudou a descrição, rode-o — o frontmatter em
381
381
  disco não muda sozinho.`,
382
382
  },
383
383
  {
384
384
  slug: "propor-ferramentas",
385
385
  descricao: `Pesquisa e propõe MCP servers, skills e bibliotecas que combinem com a stack deste projeto, validando cada candidato contra fonte antes de sugerir. Invoque logo após concluir o briefing — é quando a stack acabou de ser descrita — ou quando a stack mudar. Só propõe: nada é instalado sem OK, e recusar tudo é resposta válida.`,
386
386
  ferramentas: ["mcp__dd-harness__ler_artefato", "mcp__dd-harness__listar_skills", "mcp__dd-harness__buscar_memoria", "Read", "Glob", "Grep", "WebSearch", "WebFetch"],
387
- conteudo: `# Propor ferramentas para este projeto
388
-
389
- O briefing acabou de descrever a stack e as restrições. Este é o único momento em que
390
- esse contexto está fresco — depois dele, ninguém pergunta de novo, e uma ferramenta que
391
- faria diferença aqui nunca é considerada.
392
-
393
- Roda em subagente (\`context: fork\`): o conteúdo bruto das buscas fica lá, e só a proposta
394
- volta. Por isso leia tudo do serviço no passo 1 — não conte com o histórico da conversa.
395
-
396
- > **Só PROPÕE.** Não instala MCP, não cria skill, não adiciona dependência. Cada adoção é
397
- > uma tarefa nova, com plano e OK. **Recusar tudo é resposta válida e esperada** — se o
398
- > usuário não quiser nada, não insista.
399
-
400
- ## 1. O que já existe (antes de buscar qualquer coisa)
401
-
402
- Propor o que o projeto já tem gasta a confiança na proposta inteira.
403
-
404
- - **Stack, objetivo e restrições:** \`ler_artefato\` com \`tipo: "briefing"\`. As restrições
405
- são **filtro duro** — sugestão que as viola precisa ser marcada como tal, ou descartada.
406
- - **Skills já existentes:** \`listar_skills\`. Duas skills parecidas competem pela
407
- invocação, e o modelo escolhe mal entre elas.
408
- - **MCP e hooks já ligados:** leia \`.mcp.json\` e \`.claude/settings.json\` do repositório —
409
- esses continuam em disco, porque é deles que o host lê.
410
- - **O que já foi rejeitado:** \`buscar_memoria\` pelo nome de cada candidato antes de
411
- propô-lo. Pode haver memória dizendo "não usar X porque Y" — repropor o que foi
412
- descartado é o erro que mais rápido faz a proposta ser ignorada.
413
-
414
- Briefing vazio: **pare e avise**. Sem a stack, a busca não tem filtro e a proposta vira
415
- lista genérica — que é pior que nenhuma.
416
-
417
- ## 2. Pesquise com a stack no filtro
418
-
419
- Busque informação **atual** (\`WebSearch\`, \`WebFetch\`), não memória. Três categorias:
420
-
421
- - **MCP servers** — o que daria ao agente acesso a algo que hoje ele não alcança neste
422
- projeto (o banco, o deploy, o rastreador de issues).
423
- - **Skills** — procedimento repetido que já exista escrito e testado por outros.
424
- - **Libs e ferramentas** — do ecossistema da stack, para o problema que o projeto tem.
425
-
426
- Ancore cada busca na stack real. "Melhores ferramentas de 2026" devolve lista de blog;
427
- "MCP server para Postgres com RLS" devolve o que serve aqui.
428
-
429
- ## 3. Valide contra fonte — não contra memória
430
-
431
- Para todo candidato, responda com link:
432
-
433
- - **Existe de fato?** Repositório, doc ou pacote oficial.
434
- - **É mantido?** Último release ou commit. Abandonado → descarte ou marque o risco.
435
- - **Casa com a stack?** Versão da linguagem, do framework, do runtime.
436
- - **Respeita as restrições?** Confronte com o briefing. Conflito → **diga**, não esconda.
437
- - **Já não temos equivalente?** Confronte com o passo 1.
438
-
439
- Candidato que não passa: **descarte e diga por quê, em uma linha.** Não infle a lista —
440
- três propostas boas valem mais que dez, e uma lista longa faz o usuário recusar tudo sem
441
- ler.
442
-
443
- ## 4. Apresente
444
-
445
- Para cada proposta: **o que é**, **o problema deste projeto que ela resolve**, **o custo**
446
- (dependência nova, chave de API, processo a manter) e o **link**. Nessa ordem — o
447
- problema antes da solução, senão parece catálogo.
448
-
449
- Separe o que é **recomendação** do que é **possibilidade**. Se nada passou na validação,
450
- diga isso: "não achei nada que valha para esta stack agora" é uma resposta honesta e
451
- útil.
452
-
453
- ## 5. Se algo for adotado
454
-
455
- Adotar é tarefa nova: plano curto, OK do usuário, e o protocolo normal do projeto.
456
-
457
- Se a decisão vier com uma razão que sobrevive ao dia de hoje — "escolhemos X porque o
458
- fornecedor limita Y" —, isso pode ser memória. Passe pelos três filtros antes de gravar;
387
+ conteudo: `# Propor ferramentas para este projeto
388
+
389
+ O briefing acabou de descrever a stack e as restrições. Este é o único momento em que
390
+ esse contexto está fresco — depois dele, ninguém pergunta de novo, e uma ferramenta que
391
+ faria diferença aqui nunca é considerada.
392
+
393
+ Roda em subagente (\`context: fork\`): o conteúdo bruto das buscas fica lá, e só a proposta
394
+ volta. Por isso leia tudo do serviço no passo 1 — não conte com o histórico da conversa.
395
+
396
+ > **Só PROPÕE.** Não instala MCP, não cria skill, não adiciona dependência. Cada adoção é
397
+ > uma tarefa nova, com plano e OK. **Recusar tudo é resposta válida e esperada** — se o
398
+ > usuário não quiser nada, não insista.
399
+
400
+ ## 1. O que já existe (antes de buscar qualquer coisa)
401
+
402
+ Propor o que o projeto já tem gasta a confiança na proposta inteira.
403
+
404
+ - **Stack, objetivo e restrições:** \`ler_artefato\` com \`tipo: "briefing"\`. As restrições
405
+ são **filtro duro** — sugestão que as viola precisa ser marcada como tal, ou descartada.
406
+ - **Skills já existentes:** \`listar_skills\`. Duas skills parecidas competem pela
407
+ invocação, e o modelo escolhe mal entre elas.
408
+ - **MCP e hooks já ligados:** leia \`.mcp.json\` e \`.claude/settings.json\` do repositório —
409
+ esses continuam em disco, porque é deles que o host lê.
410
+ - **O que já foi rejeitado:** \`buscar_memoria\` pelo nome de cada candidato antes de
411
+ propô-lo. Pode haver memória dizendo "não usar X porque Y" — repropor o que foi
412
+ descartado é o erro que mais rápido faz a proposta ser ignorada.
413
+
414
+ Briefing vazio: **pare e avise**. Sem a stack, a busca não tem filtro e a proposta vira
415
+ lista genérica — que é pior que nenhuma.
416
+
417
+ ## 2. Pesquise com a stack no filtro
418
+
419
+ Busque informação **atual** (\`WebSearch\`, \`WebFetch\`), não memória. Três categorias:
420
+
421
+ - **MCP servers** — o que daria ao agente acesso a algo que hoje ele não alcança neste
422
+ projeto (o banco, o deploy, o rastreador de issues).
423
+ - **Skills** — procedimento repetido que já exista escrito e testado por outros.
424
+ - **Libs e ferramentas** — do ecossistema da stack, para o problema que o projeto tem.
425
+
426
+ Ancore cada busca na stack real. "Melhores ferramentas de 2026" devolve lista de blog;
427
+ "MCP server para Postgres com RLS" devolve o que serve aqui.
428
+
429
+ ## 3. Valide contra fonte — não contra memória
430
+
431
+ Para todo candidato, responda com link:
432
+
433
+ - **Existe de fato?** Repositório, doc ou pacote oficial.
434
+ - **É mantido?** Último release ou commit. Abandonado → descarte ou marque o risco.
435
+ - **Casa com a stack?** Versão da linguagem, do framework, do runtime.
436
+ - **Respeita as restrições?** Confronte com o briefing. Conflito → **diga**, não esconda.
437
+ - **Já não temos equivalente?** Confronte com o passo 1.
438
+
439
+ Candidato que não passa: **descarte e diga por quê, em uma linha.** Não infle a lista —
440
+ três propostas boas valem mais que dez, e uma lista longa faz o usuário recusar tudo sem
441
+ ler.
442
+
443
+ ## 4. Apresente
444
+
445
+ Para cada proposta: **o que é**, **o problema deste projeto que ela resolve**, **o custo**
446
+ (dependência nova, chave de API, processo a manter) e o **link**. Nessa ordem — o
447
+ problema antes da solução, senão parece catálogo.
448
+
449
+ Separe o que é **recomendação** do que é **possibilidade**. Se nada passou na validação,
450
+ diga isso: "não achei nada que valha para esta stack agora" é uma resposta honesta e
451
+ útil.
452
+
453
+ ## 5. Se algo for adotado
454
+
455
+ Adotar é tarefa nova: plano curto, OK do usuário, e o protocolo normal do projeto.
456
+
457
+ Se a decisão vier com uma razão que sobrevive ao dia de hoje — "escolhemos X porque o
458
+ fornecedor limita Y" —, isso pode ser memória. Passe pelos três filtros antes de gravar;
459
459
  "experimentamos e gostamos" não passa em nenhum deles.`,
460
460
  },
461
461
  {
@@ -464,115 +464,143 @@ fornecedor limita Y" —, isso pode ser memória. Passe pelos três filtros ante
464
464
  ferramentas: ["mcp__dd-harness__ler_changelog", "Read", "Glob", "Grep", "Edit", "Bash"],
465
465
  so_por_comando: true,
466
466
  dica_de_argumento: "<caminho da pasta do projeto>",
467
- conteudo: `# Atualizar o harness de um projeto
468
-
469
- Põe um projeto que consome o dd-harness na versão atual: CLI, hooks, e o bloco do
470
- protocolo nos pontos de entrada (\`CLAUDE.md\` e \`AGENTS.md\`).
471
-
472
- **Entrada esperada:** o caminho da pasta do projeto. Se o usuário não passou, pergunte —
473
- não presuma que é o diretório atual, porque esta skill quase sempre roda apontando para
474
- OUTRO projeto.
475
-
476
- ---
477
-
478
- ## 0. Antes de tudo: entenda o \`CLAUDE.md\` do alvo
479
-
480
- **Este é o passo mais importante da skill, e o único que não dá para automatizar.** Faça-o
481
- antes de rodar qualquer comando que escreva.
482
-
483
- O \`CLAUDE.md\` **é do projeto, não do dd-harness**. Cada um escreve o seu: regras de
484
- negócio, combinados da equipe, jeito de trabalhar daquele time. O harness ocupa ali um
485
- bloco delimitado — e **só esse bloco é nosso**.
486
-
487
- Leia o arquivo inteiro e responda, para você mesmo, três perguntas:
488
-
489
- 1. **O que ali é do harness?** O bloco entre \`<!-- dd-harness:inicio ... -->\` e
490
- \`<!-- dd-harness:fim -->\`. Se não houver marcas, o bloco é o trecho que fala de
491
- \`ler_artefato\`/\`ler_roadmap\`/\`listar_skills\` — o protocolo que o molde escreve.
492
-
493
- 2. **O que ali é do projeto?** Todo o resto. Regras próprias, seções inventadas pelo time,
494
- uma linha que alguém acrescentou numa sexta-feira e não explicou. **Nada disso se toca.**
495
-
496
- 3. **Alguém escreveu dentro do bloco?** É o caso que exige você. Uma regra do projeto pode
497
- ter sido acrescentada lá dentro por conveniência — e ela tem que sobreviver à
498
- atualização. Perceber isso é a diferença entre atualizar e destruir.
499
-
500
- > Já aconteceu: uma linha escrita à mão pelo dono do projeto foi tratada como texto do
501
- > molde e sobrescrita. Ele teve que dizer "é pq eu botei la". O arquivo é dele; a régua é
502
- > essa.
503
-
504
- **Regra que resume tudo:** na dúvida sobre se um trecho é nosso ou do projeto, **é do
505
- projeto**. Pergunte em vez de decidir.
506
-
507
- ---
508
-
509
- ## 1. Diagnostique
510
-
511
- \`\`\`
512
- cd <caminho-do-projeto>
513
- dd-harness atualizar
514
- \`\`\`
515
-
516
- Ele relata, sem escrever nada, quatro coisas: a versão do CLI, o estado do bloco em
517
- \`CLAUDE.md\` e \`AGENTS.md\`, e os hooks. Cada item vem com uma ação:
518
-
519
- | Marca | Significa |
520
- |---|---|
521
- | \`ok\` | em dia, nada a fazer |
522
- | \`->\` | pode ser aplicado com segurança |
523
- | \`??\` | **exige decisão sua** — arquivo editado a mão |
524
- | \`!\` | manual (o CLI global é por máquina, não por projeto) |
525
-
526
- ## 2. Descubra o que mudou
527
-
528
- O bloco carimba a versão do molde (ex: \`v1.2.0\`). Compare com a atual e leia, no
529
- \`CHANGELOG.md\` do dd-harness, o que mudou entre as duas. É isso que diz **o que** está
530
- chegando ao projeto — e permite explicar ao usuário, em vez de só dizer "atualizei".
531
-
532
- Se a diferença não mexe com o projeto, diga isso: atualização que não muda nada é
533
- informação útil, não fracasso.
534
-
535
- ## 3. Aplique o seguro
536
-
537
- \`\`\`
538
- dd-harness atualizar --aplicar
539
- \`\`\`
540
-
541
- Isto escreve **só** os itens \`->\`: troca o miolo do bloco, acrescenta hooks que faltam,
542
- cria o arquivo que não existe. O que está fora do bloco não é lido nem reescrito.
543
-
544
- Os itens \`??\` ficam intactos de propósito — o comando não os toca.
545
-
546
- ## 4. Conduza os casos que exigem decisão
547
-
548
- Para cada item \`??\`, faça o trabalho que o comando não pode fazer:
549
-
550
- 1. **Mostre ao usuário o que está lá** e o que o molde novo traz.
551
- 2. **Diga o que você acha que aconteceu** — "parece que você acrescentou esta linha
552
- sobre o Slack dentro do nosso bloco".
553
- 3. **Proponha o encaixe**, que quase sempre é: manter a linha dele, atualizar o resto, e
554
- sugerir mover a linha dele para FORA do bloco, para não conflitar de novo na próxima
555
- versão. Essa sugestão é o que impede o problema de se repetir.
556
- 4. **Aguarde o OK.** Nunca edite um bloco \`??\` sem resposta explícita.
557
-
558
- ## 5. O CLI global
559
-
560
- Se o diagnóstico marcou o CLI com \`!\`, o comando é:
561
-
562
- \`\`\`
563
- npm i -g dd-harness@latest
564
- \`\`\`
565
-
566
- Diga ao usuário que isso vale para **a máquina**, não para o projeto — rodar em cada pasta
567
- não muda nada, e ele só precisa fazer isso uma vez.
568
-
569
- ## 6. Feche
570
-
571
- Relate, em poucas linhas: o que foi atualizado, de que versão para qual, o que ficou
572
- pendente de decisão e por quê. Se você tocou em \`CLAUDE.md\`, **diga explicitamente que o
573
- que estava fora do bloco continua intacto** — é a garantia que o usuário quer ouvir.
574
-
575
- Se o projeto tem git, sugira conferir o diff antes de commitar. Não commite: o projeto é
467
+ conteudo: `# Atualizar o harness de um projeto
468
+
469
+ Põe um projeto que consome o dd-harness na versão atual: CLI, hooks, e o bloco do
470
+ protocolo nos pontos de entrada (\`CLAUDE.md\` e \`AGENTS.md\`).
471
+
472
+ **Entrada esperada:** o caminho da pasta do projeto. Se o usuário não passou, pergunte —
473
+ não presuma que é o diretório atual, porque esta skill quase sempre roda apontando para
474
+ OUTRO projeto.
475
+
476
+ ---
477
+
478
+ ## 0. Antes de tudo: entenda o \`CLAUDE.md\` do alvo
479
+
480
+ **Este é o passo mais importante da skill, e o único que não dá para automatizar.** Faça-o
481
+ antes de rodar qualquer comando que escreva.
482
+
483
+ O \`CLAUDE.md\` **é do projeto, não do dd-harness**. Cada um escreve o seu: regras de
484
+ negócio, combinados da equipe, jeito de trabalhar daquele time. O harness ocupa ali um
485
+ bloco delimitado — e **só esse bloco é nosso**.
486
+
487
+ Leia o arquivo inteiro e responda, para você mesmo, três perguntas:
488
+
489
+ 1. **O que ali é do harness?** O bloco entre \`<!-- dd-harness:inicio ... -->\` e
490
+ \`<!-- dd-harness:fim -->\`. Se não houver marcas, o bloco é o trecho que fala de
491
+ \`ler_artefato\`/\`ler_roadmap\`/\`listar_skills\` — o protocolo que o molde escreve.
492
+
493
+ 2. **O que ali é do projeto?** Todo o resto. Regras próprias, seções inventadas pelo time,
494
+ uma linha que alguém acrescentou numa sexta-feira e não explicou. **Nada disso se toca.**
495
+
496
+ 3. **Alguém escreveu dentro do bloco?** É o caso que exige você. Uma regra do projeto pode
497
+ ter sido acrescentada lá dentro por conveniência — e ela tem que sobreviver à
498
+ atualização. Perceber isso é a diferença entre atualizar e destruir.
499
+
500
+ > Já aconteceu: uma linha escrita à mão pelo dono do projeto foi tratada como texto do
501
+ > molde e sobrescrita. Ele teve que dizer "é pq eu botei la". O arquivo é dele; a régua é
502
+ > essa.
503
+
504
+ **Regra que resume tudo:** na dúvida sobre se um trecho é nosso ou do projeto, **é do
505
+ projeto**. Pergunte em vez de decidir.
506
+
507
+ ---
508
+
509
+ ## 1. Diagnostique
510
+
511
+ \`\`\`
512
+ cd <caminho-do-projeto>
513
+ dd-harness atualizar
514
+ \`\`\`
515
+
516
+ Ele relata, sem escrever nada, quatro coisas: a versão do CLI, o estado do bloco em
517
+ \`CLAUDE.md\` e \`AGENTS.md\`, e os hooks. Cada item vem com uma ação:
518
+
519
+ | Marca | Significa |
520
+ |---|---|
521
+ | \`ok\` | em dia, nada a fazer |
522
+ | \`->\` | pode ser aplicado com segurança |
523
+ | \`??\` | **exige decisão sua** — arquivo editado a mão |
524
+ | \`!\` | manual (o CLI global é por máquina, não por projeto) |
525
+
526
+ ## 2. Descubra o que mudou
527
+
528
+ O bloco carimba a versão do molde (ex: \`v1.2.0\`). Compare com a atual e leia, no
529
+ \`CHANGELOG.md\` do dd-harness, o que mudou entre as duas. É isso que diz **o que** está
530
+ chegando ao projeto — e permite explicar ao usuário, em vez de só dizer "atualizei".
531
+
532
+ Se a diferença não mexe com o projeto, diga isso: atualização que não muda nada é
533
+ informação útil, não fracasso.
534
+
535
+ ## 3. Aplique o seguro
536
+
537
+ \`\`\`
538
+ dd-harness atualizar --aplicar
539
+ \`\`\`
540
+
541
+ Isto escreve **só** os itens \`->\`: troca o miolo do bloco, acrescenta hooks que faltam,
542
+ cria o arquivo que não existe. O que está fora do bloco não é lido nem reescrito.
543
+
544
+ Os itens \`??\` ficam intactos de propósito — o comando não os toca.
545
+
546
+ ## 4a. Skills que faltam: apresente e pergunte, uma a uma
547
+
548
+ O item \`?? skills\` lista as skills iniciais que **não estão** neste projeto. Elas caem em
549
+ dois casos que, de fora, são **indistinguíveis**:
550
+
551
+ - **Nasceu depois deste projeto.** A semeadura só roda em projeto sem skill alguma, então
552
+ skill nova nunca chega sozinha a um projeto que já existe.
553
+ - **Foi apagada de propósito.** Skill é apagável, e quem apagou tomou uma decisão.
554
+
555
+ **Nunca recrie sem perguntar.** Incorporar a lista inteira desfaz a segunda decisão em
556
+ silêncio, e desfaz de novo a cada vez que alguém rodar o comando.
557
+
558
+ Para cada skill faltante, apresente ao usuário:
559
+
560
+ 1. **O nome e o que ela faz** — o diagnóstico já imprime a descrição completa; ela é o
561
+ campo que diz *quando* a skill serve
562
+ 2. **Por que ela pode importar aqui**, com base neste projeto: a stack, o que existe no
563
+ repositório, o que o BRIEFING diz. "Este projeto tem Brain com âncoras, então
564
+ \`resolver-deriva\` teria uso" vale mais que repetir a descrição
565
+ 3. **A pergunta**: incorporar esta?
566
+
567
+ Aceite "não" sem insistir. Uma skill recusada é uma decisão do dono, não um item pendente —
568
+ e se ele disser "não" para a mesma skill de novo no mês que vem, isso é sinal de que a
569
+ resposta já está dada.
570
+
571
+ Com a lista do que ele aceitou, incorpore só essas. Os ponteiros em disco são escritos
572
+ junto; sem eles a skill existe no serviço e host nenhum a descobre.
573
+
574
+ ## 4b. Conduza os outros casos que exigem decisão
575
+
576
+ Para cada item \`??\` restante, faça o trabalho que o comando não pode fazer:
577
+
578
+ 1. **Mostre ao usuário o que está lá** e o que o molde novo traz.
579
+ 2. **Diga o que você acha que aconteceu** — "parece que você acrescentou esta linha
580
+ sobre o Slack dentro do nosso bloco".
581
+ 3. **Proponha o encaixe**, que quase sempre é: manter a linha dele, atualizar o resto, e
582
+ sugerir mover a linha dele para FORA do bloco, para não conflitar de novo na próxima
583
+ versão. Essa sugestão é o que impede o problema de se repetir.
584
+ 4. **Aguarde o OK.** Nunca edite um bloco \`??\` sem resposta explícita.
585
+
586
+ ## 5. O CLI global
587
+
588
+ Se o diagnóstico marcou o CLI com \`!\`, o comando é:
589
+
590
+ \`\`\`
591
+ npm i -g dd-harness@latest
592
+ \`\`\`
593
+
594
+ Diga ao usuário que isso vale para **a máquina**, não para o projeto — rodar em cada pasta
595
+ não muda nada, e ele só precisa fazer isso uma vez.
596
+
597
+ ## 6. Feche
598
+
599
+ Relate, em poucas linhas: o que foi atualizado, de que versão para qual, o que ficou
600
+ pendente de decisão e por quê. Se você tocou em \`CLAUDE.md\`, **diga explicitamente que o
601
+ que estava fora do bloco continua intacto** — é a garantia que o usuário quer ouvir.
602
+
603
+ Se o projeto tem git, sugira conferir o diff antes de commitar. Não commite: o projeto é
576
604
  do usuário e as regras de commit dele são dele.`,
577
605
  },
578
606
  {
@@ -581,123 +609,123 @@ do usuário e as regras de commit dele são dele.`,
581
609
  ferramentas: ["mcp__dd-harness__ler_memoria", "mcp__dd-harness__buscar_memoria", "Read", "Grep", "Glob", "WebSearch", "WebFetch", "Bash(dd-harness status:*)", "Bash(dd-harness check:*)", "Bash(dd-harness ler:*)", "Bash(git log:*)", "Bash(git diff:*)"],
582
610
  so_por_comando: true,
583
611
  dica_de_argumento: "[pasta/slug para revisar uma só, ou vazio para varrer o acervo]",
584
- conteudo: `# Revisar memória
585
-
586
- A deriva pega a memória cujo **código** mudou. Esta skill existe para a outra — a que
587
- ninguém olha há muito tempo e cuja **razão** pode ter morrido sem deixar rastro no
588
- repositório: o fornecedor mudou o limite, o bug de terceiro foi corrigido, a exigência de
589
- compliance caiu, a lib passou a fazer nativamente o que a memória ensina a contornar.
590
-
591
- Nenhum \`check\` acusa isso. O alvo está intacto; é o mundo que mudou.
592
-
593
- ## A regra que não se quebra
594
-
595
- **Você não edita, não arquiva e não apaga. Nada.** Esta skill investiga e apresenta o
596
- caso; quem decide é o usuário, na conversa.
597
-
598
- Isso não é cautela decorativa: arquivar tira a memória de circulação, e quem vier depois
599
- não saberá que ela existiu se você errar. O custo dos dois erros é assimétrico — manter
600
- uma memória morta custa uma linha de índice; apagar uma viva custa o incidente que ela
601
- evitava, e ninguém vai ligar uma coisa à outra.
602
-
603
- ## Idade não é veredito
604
-
605
- O critério tentador é "ninguém revisitou há muito tempo, logo não serve". **Está errado, e
606
- o ROADMAP deste projeto já registra por quê:** contagem baixa correlaciona com *raridade*,
607
- não com inutilidade — a memória que protege contra o erro raro e catastrófico é a que tem
608
- a contagem mais baixa de todas.
609
-
610
- Então idade é **motivo para olhar**, nunca argumento no parecer. Se o único fundamento que
611
- você tiver para propor a saída de uma memória for "é antiga", **você não tem fundamento**:
612
- relate como "continua valendo" e siga.
613
-
614
- ## 1. Escolha as candidatas
615
-
616
- Com \`pasta/slug\` no argumento, é aquela — pule para o passo 2.
617
-
618
- Sem argumento, monte a lista nesta ordem:
619
-
620
- 1. \`dd-harness status\` — as que ele já aponta como **revisão vencida** entram primeiro
621
- 2. Memórias antigas que **nunca** tiveram deriva (código estável ao redor: é exatamente
622
- onde esta skill enxerga o que o \`check\` não vê)
623
- 3. As que citam **coisa de fora** — versão, fornecedor, limite, prazo, bug de terceiro:
624
- são as que envelhecem sem avisar
625
-
626
- **Teto de cinco por rodada.** Cada memória é uma investigação de verdade; trazer quinze
627
- pareceres rasos é pior que trazer três com evidência, e o usuário não consegue decidir
628
- sobre quinze de uma vez.
629
-
630
- ## 2. Leia a memória inteira — o porquê, não o título
631
-
632
- \`ler_memoria\`. A pergunta que governa tudo:
633
-
634
- > A razão que fez esta memória existir continua verdadeira **hoje**?
635
-
636
- Identifique de que tipo é a afirmação, porque cada uma se verifica num lugar diferente:
637
-
638
- | Tipo | Onde se confere |
639
- |---|---|
640
- | Sobre o código deste projeto | o próprio repositório |
641
- | Sobre lib, versão ou API | changelog, release notes, a doc atual |
642
- | Sobre fornecedor, limite ou contrato | a doc do fornecedor |
643
- | Sobre bug de terceiro | o issue: foi corrigido? |
644
- | Sobre decisão interna | o projeto ainda funciona assim? |
645
-
646
- ## 3. Vá conferir — não opine
647
-
648
- Este é o passo que separa esta skill de um chute fundamentado.
649
-
650
- - **No repositório:** a âncora existe? O código ainda faz o que a memória descreve?
651
- \`git log\` no alvo mostra que alguém mexeu naquilo?
652
- - **Fora:** quando a razão é externa, **procure a fonte**. Um \`WebSearch\` pela versão atual
653
- da lib, pelo limite atual da API, pelo issue citado. Se a memória diz "a v3 não suporta
654
- X" e a v5 suporta, isso é achado — e sem ir olhar você nunca saberia.
655
-
656
- Se não conseguir verificar, **diga que não conseguiu.** "Não achei fonte para confirmar o
657
- limite atual" é um parecer honesto e útil. Inventar uma conclusão para parecer produtivo é
658
- o pior resultado possível desta skill.
659
-
660
- ## 4. Traga o parecer
661
-
662
- Um bloco por memória, na conversa. Curto, com a evidência à mostra:
663
-
664
- \`\`\`
665
- pasta/slug — Título
666
-
667
- Diz: [a afirmação, em uma linha]
668
- Verifiquei: [o que você foi olhar, com link/caminho/commit]
669
- Achei: [o que encontrou de fato]
670
- Parecer: continua valendo | envelheceu no texto | a razão pode ter morrido
671
- Por quê: [o fundamento — nunca "é antiga"]
672
- \`\`\`
673
-
674
- Três pareceres possíveis, e nenhum é uma ação:
675
-
676
- **Continua valendo** — a razão está de pé. Diga isso e siga; não há trabalho a fazer.
677
-
678
- **Envelheceu no texto** — a razão continua, a descrição não bate mais. Mostre o trecho
679
- que está errado e o que seria o texto certo. O usuário decide se manda editar.
680
-
681
- **A razão pode ter morrido** — você encontrou evidência de que o motivo acabou. Mostre a
682
- evidência. Use "pode": você investigou, não sentenciou; pode haver contexto que a memória
683
- não registrou e o usuário conhece.
684
-
685
- Ao fim, uma linha só: quantas revisou, quantas continuam valendo, quantas merecem a
686
- atenção dele. Se nenhuma mereceu, **diga exatamente isso** — "revisei cinco, todas
687
- continuam valendo" é um resultado bom, não uma rodada perdida.
688
-
689
- ## Nunca faça
690
-
691
- **Não proponha saída em lote.** Cinco memórias são cinco perguntas; um "essas cinco podem
692
- sair" é o mesmo que não ter investigado nenhuma.
693
-
694
- **Não use a data de revisão como argumento.** Ela é agenda, não julgamento. Uma memória
695
- vencida que você verificou e continua verdadeira é "continua valendo" — não "vencida".
696
-
697
- **Não confunda com deriva.** Se o achado é "o arquivo ancorado sumiu", isso é trabalho da
698
- \`resolver-deriva\`; diga ao usuário e aponte para lá em vez de resolver aqui.
699
-
700
- **Não vá pelo acervo inteiro.** O teto de cinco é o que mantém cada parecer com evidência.
612
+ conteudo: `# Revisar memória
613
+
614
+ A deriva pega a memória cujo **código** mudou. Esta skill existe para a outra — a que
615
+ ninguém olha há muito tempo e cuja **razão** pode ter morrido sem deixar rastro no
616
+ repositório: o fornecedor mudou o limite, o bug de terceiro foi corrigido, a exigência de
617
+ compliance caiu, a lib passou a fazer nativamente o que a memória ensina a contornar.
618
+
619
+ Nenhum \`check\` acusa isso. O alvo está intacto; é o mundo que mudou.
620
+
621
+ ## A regra que não se quebra
622
+
623
+ **Você não edita, não arquiva e não apaga. Nada.** Esta skill investiga e apresenta o
624
+ caso; quem decide é o usuário, na conversa.
625
+
626
+ Isso não é cautela decorativa: arquivar tira a memória de circulação, e quem vier depois
627
+ não saberá que ela existiu se você errar. O custo dos dois erros é assimétrico — manter
628
+ uma memória morta custa uma linha de índice; apagar uma viva custa o incidente que ela
629
+ evitava, e ninguém vai ligar uma coisa à outra.
630
+
631
+ ## Idade não é veredito
632
+
633
+ O critério tentador é "ninguém revisitou há muito tempo, logo não serve". **Está errado, e
634
+ o ROADMAP deste projeto já registra por quê:** contagem baixa correlaciona com *raridade*,
635
+ não com inutilidade — a memória que protege contra o erro raro e catastrófico é a que tem
636
+ a contagem mais baixa de todas.
637
+
638
+ Então idade é **motivo para olhar**, nunca argumento no parecer. Se o único fundamento que
639
+ você tiver para propor a saída de uma memória for "é antiga", **você não tem fundamento**:
640
+ relate como "continua valendo" e siga.
641
+
642
+ ## 1. Escolha as candidatas
643
+
644
+ Com \`pasta/slug\` no argumento, é aquela — pule para o passo 2.
645
+
646
+ Sem argumento, monte a lista nesta ordem:
647
+
648
+ 1. \`dd-harness status\` — as que ele já aponta como **revisão vencida** entram primeiro
649
+ 2. Memórias antigas que **nunca** tiveram deriva (código estável ao redor: é exatamente
650
+ onde esta skill enxerga o que o \`check\` não vê)
651
+ 3. As que citam **coisa de fora** — versão, fornecedor, limite, prazo, bug de terceiro:
652
+ são as que envelhecem sem avisar
653
+
654
+ **Teto de cinco por rodada.** Cada memória é uma investigação de verdade; trazer quinze
655
+ pareceres rasos é pior que trazer três com evidência, e o usuário não consegue decidir
656
+ sobre quinze de uma vez.
657
+
658
+ ## 2. Leia a memória inteira — o porquê, não o título
659
+
660
+ \`ler_memoria\`. A pergunta que governa tudo:
661
+
662
+ > A razão que fez esta memória existir continua verdadeira **hoje**?
663
+
664
+ Identifique de que tipo é a afirmação, porque cada uma se verifica num lugar diferente:
665
+
666
+ | Tipo | Onde se confere |
667
+ |---|---|
668
+ | Sobre o código deste projeto | o próprio repositório |
669
+ | Sobre lib, versão ou API | changelog, release notes, a doc atual |
670
+ | Sobre fornecedor, limite ou contrato | a doc do fornecedor |
671
+ | Sobre bug de terceiro | o issue: foi corrigido? |
672
+ | Sobre decisão interna | o projeto ainda funciona assim? |
673
+
674
+ ## 3. Vá conferir — não opine
675
+
676
+ Este é o passo que separa esta skill de um chute fundamentado.
677
+
678
+ - **No repositório:** a âncora existe? O código ainda faz o que a memória descreve?
679
+ \`git log\` no alvo mostra que alguém mexeu naquilo?
680
+ - **Fora:** quando a razão é externa, **procure a fonte**. Um \`WebSearch\` pela versão atual
681
+ da lib, pelo limite atual da API, pelo issue citado. Se a memória diz "a v3 não suporta
682
+ X" e a v5 suporta, isso é achado — e sem ir olhar você nunca saberia.
683
+
684
+ Se não conseguir verificar, **diga que não conseguiu.** "Não achei fonte para confirmar o
685
+ limite atual" é um parecer honesto e útil. Inventar uma conclusão para parecer produtivo é
686
+ o pior resultado possível desta skill.
687
+
688
+ ## 4. Traga o parecer
689
+
690
+ Um bloco por memória, na conversa. Curto, com a evidência à mostra:
691
+
692
+ \`\`\`
693
+ pasta/slug — Título
694
+
695
+ Diz: [a afirmação, em uma linha]
696
+ Verifiquei: [o que você foi olhar, com link/caminho/commit]
697
+ Achei: [o que encontrou de fato]
698
+ Parecer: continua valendo | envelheceu no texto | a razão pode ter morrido
699
+ Por quê: [o fundamento — nunca "é antiga"]
700
+ \`\`\`
701
+
702
+ Três pareceres possíveis, e nenhum é uma ação:
703
+
704
+ **Continua valendo** — a razão está de pé. Diga isso e siga; não há trabalho a fazer.
705
+
706
+ **Envelheceu no texto** — a razão continua, a descrição não bate mais. Mostre o trecho
707
+ que está errado e o que seria o texto certo. O usuário decide se manda editar.
708
+
709
+ **A razão pode ter morrido** — você encontrou evidência de que o motivo acabou. Mostre a
710
+ evidência. Use "pode": você investigou, não sentenciou; pode haver contexto que a memória
711
+ não registrou e o usuário conhece.
712
+
713
+ Ao fim, uma linha só: quantas revisou, quantas continuam valendo, quantas merecem a
714
+ atenção dele. Se nenhuma mereceu, **diga exatamente isso** — "revisei cinco, todas
715
+ continuam valendo" é um resultado bom, não uma rodada perdida.
716
+
717
+ ## Nunca faça
718
+
719
+ **Não proponha saída em lote.** Cinco memórias são cinco perguntas; um "essas cinco podem
720
+ sair" é o mesmo que não ter investigado nenhuma.
721
+
722
+ **Não use a data de revisão como argumento.** Ela é agenda, não julgamento. Uma memória
723
+ vencida que você verificou e continua verdadeira é "continua valendo" — não "vencida".
724
+
725
+ **Não confunda com deriva.** Se o achado é "o arquivo ancorado sumiu", isso é trabalho da
726
+ \`resolver-deriva\`; diga ao usuário e aponte para lá em vez de resolver aqui.
727
+
728
+ **Não vá pelo acervo inteiro.** O teto de cinco é o que mantém cada parecer com evidência.
701
729
  Fila é para ser processada aos poucos, e ela não vai a lugar nenhum.`,
702
730
  },
703
731
  ];