dd-harness 0.37.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.
- package/README.md +103 -103
- package/dist/diagnostico.js +13 -3
- package/dist/escreve-config.js +24 -24
- package/dist/hosts.js +80 -4
- package/dist/index.js +169 -107
- package/dist/init.js +45 -45
- package/dist/materializa.js +0 -5
- package/dist/moldes-historicos.js +70 -70
- package/dist/pergunta.d.ts +9 -2
- package/dist/pergunta.js +71 -2
- package/dist/regras-de-commit.js +8 -8
- package/dist/skills-iniciais.js +606 -606
- package/dist/sync.js +1 -2
- package/package.json +44 -44
- package/dist/materializa.d.ts +0 -70
- package/dist/sync.d.ts +0 -59
package/dist/skills-iniciais.js
CHANGED
|
@@ -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,143 +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
|
-
## 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 é
|
|
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 é
|
|
604
604
|
do usuário e as regras de commit dele são dele.`,
|
|
605
605
|
},
|
|
606
606
|
{
|
|
@@ -609,123 +609,123 @@ do usuário e as regras de commit dele são dele.`,
|
|
|
609
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:*)"],
|
|
610
610
|
so_por_comando: true,
|
|
611
611
|
dica_de_argumento: "[pasta/slug para revisar uma só, ou vazio para varrer o acervo]",
|
|
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.
|
|
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.
|
|
729
729
|
Fila é para ser processada aos poucos, e ela não vai a lugar nenhum.`,
|
|
730
730
|
},
|
|
731
731
|
];
|