product-runner 0.5.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 +165 -0
- package/common/agents/README.md +68 -0
- package/common/agents/agente-conceituacao.md +141 -0
- package/common/agents/agente-documentacao-funcional.md +107 -0
- package/common/agents/agente-gerador-spec.md +106 -0
- package/common/agents/agente-kickoff.md +121 -0
- package/common/agents/agente-prod-runner.md +107 -0
- package/common/agents/agente-review-code.md +97 -0
- package/common/agents/agente-review-llm.md +94 -0
- package/common/agents/agente-review-product.md +98 -0
- package/common/agents/agente-user-review.md +99 -0
- package/common/agents/protocolo-de-gates.md +51 -0
- package/common/claude-md.template.md +210 -0
- package/common/design-principles.md +229 -0
- package/common/lessons-learned.md +440 -0
- package/common/pipeline.md +143 -0
- package/common/spec-guide.md +327 -0
- package/common/specs/_open-issues.md +46 -0
- package/common/specs/_overview.md +75 -0
- package/dist/cli.js +187 -0
- package/dist/migrations.js +147 -0
- package/dist/scaffold.js +276 -0
- package/dist/update.js +400 -0
- package/migrations/0.3.0.md +54 -0
- package/migrations/0.4.0.md +76 -0
- package/migrations/0.5.0.md +55 -0
- package/migrations/README.md +68 -0
- package/package.json +41 -0
- package/profile-cli/README.md +54 -0
- package/profile-cli/claude-md.extension.md +102 -0
- package/profile-cli/code-patterns.md +363 -0
- package/profile-ssr/DESIGN-SYSTEM.md +795 -0
- package/profile-ssr/README.md +51 -0
- package/profile-ssr/api-patterns.md +70 -0
- package/profile-ssr/claude-md.extension.md +113 -0
- package/profile-ssr/code-patterns.md +175 -0
- package/profile-ssr/ui-patterns.md +97 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
# Lições aprendidas — Projeto DocManager
|
|
2
|
+
|
|
3
|
+
Compilado de lições extraídas do desenvolvimento do DocManager,
|
|
4
|
+
organizadas por etapa. Cada lição inclui o contexto em que se aplica
|
|
5
|
+
e por que importa.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Etapa 1 — Levantamento de requisitos
|
|
10
|
+
|
|
11
|
+
### Pesquisar soluções prontas antes de decidir por custom
|
|
12
|
+
**Quando se aplica:** sempre que o problema parecer comum (gestão documental, CRM, e-commerce).
|
|
13
|
+
**Por que importa:** evita reinventar a roda. Mas também evita forçar uma ferramenta que não cabe — no nosso caso, Paperless-ngx cobria 60% mas os 40% restantes exigiriam mais customização do que construir do zero.
|
|
14
|
+
|
|
15
|
+
### Entender orçamento de serviços externos cedo
|
|
16
|
+
**Quando se aplica:** projetos que dependem de APIs pagas (OCR, AI, cloud).
|
|
17
|
+
**Por que importa:** não é só o orçamento geral do projeto — são custos recorrentes mensais que impactam a viabilidade técnica. Google Vision a $1.50/1000 páginas cabe no budget; AWS Textract a $15/1000 não caberia.
|
|
18
|
+
|
|
19
|
+
### Perguntas fechadas aceleram o levantamento
|
|
20
|
+
**Quando se aplica:** sempre que estiver levantando requisitos com o usuário.
|
|
21
|
+
**Por que importa:** múltipla escolha força decisão imediata em vez de discussão aberta. O levantamento do DocManager levou 3 rodadas de perguntas em vez de uma conversa livre de 2 horas.
|
|
22
|
+
|
|
23
|
+
### Ordem importa: problema/contexto → viabilidade → arquitetura
|
|
24
|
+
**Quando se aplica:** início de qualquer projeto.
|
|
25
|
+
**Por que importa:** decidir stack antes de entender o problema leva a decisões enviesadas. Primeiro entender o que precisa ser resolvido, depois avaliar o que é viável, depois como construir.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Etapa 2 — Escolha de stack e arquitetura
|
|
30
|
+
|
|
31
|
+
### Mapear o que o framework NÃO faz
|
|
32
|
+
**Quando se aplica:** ao escolher plataforma de deploy ou framework.
|
|
33
|
+
**Por que importa:** as limitações definem a arquitetura tanto quanto as features. Next.js não suporta storage persistente + background jobs na Vercel → descartou Vercel, definiu Docker + VPS. Essa decisão cascateia pra toda a infra.
|
|
34
|
+
|
|
35
|
+
### Arquitetura iterativa, não solução fechada
|
|
36
|
+
**Quando se aplica:** ao definir arquitetura com o time/usuário.
|
|
37
|
+
**Por que importa:** apresentar proposta inicial, ouvir contra-propostas, refinar. As melhores decisões do DocManager (services desacoplados, Zod entity como raiz) vieram de sugestões do usuário, não do planejamento inicial.
|
|
38
|
+
|
|
39
|
+
### Documentar o "porquê" de cada decisão
|
|
40
|
+
**Quando se aplica:** qualquer decisão de arquitetura, stack ou design.
|
|
41
|
+
**Por que importa:** sem o "porquê", as decisões são revisitadas toda vez que alguém novo chega ou que surge uma dúvida. "Usamos registros no banco pra campos de padrão PORQUE precisamos de consultas transversais" fecha a discussão.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Etapa 3 — Modelo de dados
|
|
46
|
+
|
|
47
|
+
### Modelar junto com o usuário
|
|
48
|
+
**Quando se aplica:** definição de entities e relações.
|
|
49
|
+
**Por que importa:** gaps conceituais que o técnico não vê. No DocManager, o usuário identificou que faltava DocumentLink (relação doc↔doc) e campos repetíveis (itens de NF) — dois conceitos que o técnico não teria percebido sozinho.
|
|
50
|
+
|
|
51
|
+
### Decisões conceituais antes do schema
|
|
52
|
+
**Quando se aplica:** antes de escrever qualquer modelo Prisma/SQL.
|
|
53
|
+
**Por que importa:** "um documento pertence a uma ou muitas categorias?", "campos como registros ou JSON?", "enum ou booleanos?" — essas decisões definem TUDO. Errar aqui propaga pra todas as camadas.
|
|
54
|
+
|
|
55
|
+
### ERD visual pra alinhar entendimento
|
|
56
|
+
**Quando se aplica:** sempre que o modelo tiver mais de 5 entities.
|
|
57
|
+
**Por que importa:** texto descreve relações sequencialmente. Diagrama mostra todas as relações de uma vez. O momento "ah, falta uma seta aqui" só acontece quando você vê o diagrama.
|
|
58
|
+
|
|
59
|
+
### Validar modelo completo antes de implementar
|
|
60
|
+
**Quando se aplica:** antes de criar a primeira migration.
|
|
61
|
+
**Por que importa:** é a fundação. Erro no modelo propaga pra services, API, UI. Adicionar uma entity depois é fácil; mudar uma relação fundamental depois é caro.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Etapa 4 — Dev workflow e spec-first
|
|
66
|
+
|
|
67
|
+
### Spec-first economiza mais tempo do que parece
|
|
68
|
+
**Quando se aplica:** qualquer projeto com implementação assistida por AI.
|
|
69
|
+
**Por que importa:** o Claude Code com spec clara implementa em minutos o que levaria horas sem contexto. A spec é o "prompt" perfeito porque tem tudo: contexto, entities, funções, API, UI, critérios de aceite.
|
|
70
|
+
|
|
71
|
+
### Granularidade certa é crucial
|
|
72
|
+
**Quando se aplica:** ao escrever specs.
|
|
73
|
+
**Por que importa:** spec grande demais → Claude Code perde foco e gera código inconsistente. Spec pequena demais → overhead de gestão, muitas sessões. Regra: uma spec = uma sessão de Claude Code.
|
|
74
|
+
|
|
75
|
+
### Fases com corte vertical, não horizontal
|
|
76
|
+
**Quando se aplica:** ao planejar fases de entrega.
|
|
77
|
+
**Por que importa:** "modelo → services → API → UI" (horizontal) entrega valor só no final. "Upload + OCR + visualização de ponta a ponta" (vertical) entrega valor visível na Fase 1. O usuário vê resultado e valida cedo.
|
|
78
|
+
|
|
79
|
+
### Overview com grafo de dependências
|
|
80
|
+
**Quando se aplica:** projetos com mais de 5 specs.
|
|
81
|
+
**Por que importa:** evita implementar specs fora de ordem. "Org/03 depende de org/01" — sem o grafo, alguém pode tentar implementar referências antes de categorias existirem.
|
|
82
|
+
|
|
83
|
+
### Critérios de aceite binários
|
|
84
|
+
**Quando se aplica:** toda spec.
|
|
85
|
+
**Por que importa:** eliminam ambiguidade do "pronto". "Consigo arrastar 10 fotos e todas são salvas" — ou passa ou não passa. Sem "parcialmente implementado".
|
|
86
|
+
|
|
87
|
+
### Documentar o princípio de entrega vertical
|
|
88
|
+
**Quando se aplica:** ao criar o overview de fases.
|
|
89
|
+
**Por que importa:** a lista de fases mostra a ordem, mas não o porquê. Sem documentar o princípio, alguém replicando pode organizar horizontalmente sem perceber que foi uma escolha deliberada.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Etapa 5 — Skills e documentação
|
|
94
|
+
|
|
95
|
+
### Menos skills melhores > muitas skills rasos
|
|
96
|
+
**Quando se aplica:** ao montar estratégia de skills/docs.
|
|
97
|
+
**Por que importa:** 1 CLAUDE.md completo + docs de referência supera 9 CLAUDE.md espalhados. Manutenção de 9 arquivos sincronizados é overhead que não compensa.
|
|
98
|
+
|
|
99
|
+
### Conhecer o formato de cada ferramenta antes de gerar artefatos
|
|
100
|
+
**Quando se aplica:** ao criar skills, configs, templates pra ferramentas.
|
|
101
|
+
**Por que importa:** o Cowork exige YAML frontmatter nas skills. Gerar sem e descobrir pelo erro custou retrabalho. Verificar o formato esperado antes de gerar evita isso.
|
|
102
|
+
|
|
103
|
+
### Divisão de responsabilidade entre ferramentas deve ser explícita
|
|
104
|
+
**Quando se aplica:** projetos que usam múltiplas ferramentas AI.
|
|
105
|
+
**Por que importa:** sem definição clara, você mistura — pede pro chat o que o Cowork faz melhor, ou pro Claude Code o que é um fix do Cowork. Definir no kickoff: chat = pensar, Cowork = agir nos arquivos, Code = implementar.
|
|
106
|
+
|
|
107
|
+
### Padrão de comunicação entre ferramentas
|
|
108
|
+
**Quando se aplica:** workflow multi-ferramenta.
|
|
109
|
+
**Por que importa:** "discutir aqui → instrução copiável → cola lá" surgiu organicamente mas deveria ser definido no kickoff. Sem esse padrão, cada handoff é improvisado.
|
|
110
|
+
|
|
111
|
+
### Regras operacionais no CLAUDE.md fazem diferença real
|
|
112
|
+
**Quando se aplica:** qualquer projeto com Claude Code.
|
|
113
|
+
**Por que importa:** "3 strikes", "spec vs realidade técnica", "fixes não precisam de spec" — todas surgiram de problemas reais. Sem elas, loops e decisões subótimas repetem.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Etapa 6 — Ciclo de implementação
|
|
118
|
+
|
|
119
|
+
### Claude Code precisa de guardrails comportamentais
|
|
120
|
+
**Quando se aplica:** qualquer projeto com Claude Code.
|
|
121
|
+
**Por que importa:** ele é excelente executor mas sem guardrails entra em loops (searchVector), segue spec literalmente quando há alternativa melhor (rowIndex null), e não para pra perguntar quando deveria.
|
|
122
|
+
|
|
123
|
+
### O report final do Claude Code é o artefato mais valioso
|
|
124
|
+
**Quando se aplica:** após cada sessão de implementação.
|
|
125
|
+
**Por que importa:** critérios ✅/❌ + decisões de implementação + notas do que não testou = tudo que precisa pra review e documentação retroativa. Sem ele, você não sabe o que mudou.
|
|
126
|
+
|
|
127
|
+
### Divergências spec↔código devem ser documentadas
|
|
128
|
+
**Quando se aplica:** após cada implementação.
|
|
129
|
+
**Por que importa:** se a spec diz X e o código faz Y (por bom motivo), documentar na seção "Decisões de implementação" da spec. Senão a spec vira mentira e perde valor como referência.
|
|
130
|
+
|
|
131
|
+
### Validação visual no browser é insubstituível
|
|
132
|
+
**Quando se aplica:** qualquer feature com UI.
|
|
133
|
+
**Por que importa:** tsc --noEmit pega erros de tipo mas não de comportamento. Um filtro que não aplica, um botão que não navega, um layout quebrado — só vê testando no browser.
|
|
134
|
+
|
|
135
|
+
### Fixes pequenos vão direto, sem spec
|
|
136
|
+
**Quando se aplica:** bugs, ajustes visuais, links faltando.
|
|
137
|
+
**Por que importa:** criar spec pra corrigir um link é overhead. Regra: se altera entity, cria service, adiciona endpoint ou cria tela → spec. Se é correção do que já deveria funcionar → fix direto.
|
|
138
|
+
|
|
139
|
+
### Port fixo + report do port real
|
|
140
|
+
**Quando se aplica:** projetos com dev server local.
|
|
141
|
+
**Por que importa:** port mudando entre sessões (3000 vs 3001) causa confusão. Fixar no package.json e documentar que o Claude Code deve reportar o port real no output.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Etapa 7 — Evolução durante o projeto
|
|
146
|
+
|
|
147
|
+
### O processo deve suportar evolução aditiva
|
|
148
|
+
**Quando se aplica:** qualquer projeto que vai durar mais de uma semana.
|
|
149
|
+
**Por que importa:** specs novas, alterações em existentes, regras novas no CLAUDE.md — tudo deve ser aditivo, nunca destrutivo. A arquitetura "nullable pra evolução" se provou: nenhuma mudança exigiu migração destrutiva.
|
|
150
|
+
|
|
151
|
+
### Usar o sistema real expõe gaps
|
|
152
|
+
**Quando se aplica:** sempre.
|
|
153
|
+
**Por que importa:** as melhores melhorias do DocManager vieram de testar com dados reais: campos repetíveis surgiram ao configurar padrões, DATETIME ao pensar em tipos de data. Nenhum planejamento abstrato teria pego isso.
|
|
154
|
+
|
|
155
|
+
### Formatter desde o dia zero, linting customizado depois
|
|
156
|
+
**Quando se aplica:** setup de qualquer projeto.
|
|
157
|
+
**Por que importa:** Prettier + lint-staged + husky no setup/01 — custo mínimo, evita reformatação retroativa. Regras de linting customizadas (services não importam de Next, etc) entram quando as convenções se consolidam.
|
|
158
|
+
|
|
159
|
+
### CLAUDE.md é documento vivo
|
|
160
|
+
**Quando se aplica:** durante todo o projeto.
|
|
161
|
+
**Por que importa:** regras operacionais surgem de problemas reais durante o desenvolvimento. Adicionar conforme aparecem, não tentar prever tudo no início.
|
|
162
|
+
|
|
163
|
+
### Modelar pra evolução > modelar "completo"
|
|
164
|
+
**Quando se aplica:** design de modelo de dados.
|
|
165
|
+
**Por que importa:** campos nullable, enums extensíveis, constraints aditivos. Mais importante que acertar tudo de primeira é garantir que mudanças futuras não quebrem o existente.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Etapa 8 — Retrospectiva
|
|
170
|
+
|
|
171
|
+
### Retrospectiva é etapa formal, não opcional
|
|
172
|
+
**Quando se aplica:** ao final de cada fase ou do projeto.
|
|
173
|
+
**Por que importa:** se não parar pra fazer, as lições ficam na conversa e se perdem. A retrospectiva deve gerar artefatos concretos (este documento, templates, regras novas).
|
|
174
|
+
|
|
175
|
+
### Fazer retro com a mesma ferramenta preserva contexto
|
|
176
|
+
**Quando se aplica:** ao planejar a retrospectiva.
|
|
177
|
+
**Por que importa:** reconstruir de memória perde nuances. Fazer na mesma conversa que conduziu o projeto permite referenciar decisões com contexto real.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Notas exploratórias
|
|
182
|
+
|
|
183
|
+
### Arquivo compartilhado como barramento entre agentes
|
|
184
|
+
Explorar uso de `inbox/instructions.md` como meio de comunicação
|
|
185
|
+
entre Claude.ai e Cowork — tanto pra instruções quanto pra outputs.
|
|
186
|
+
Evita copy-paste manual. Não validado ainda.
|
|
187
|
+
|
|
188
|
+
### Estrutura multi-agente de referência
|
|
189
|
+
Setup mais poderoso possível com ferramentas atuais:
|
|
190
|
+
- Cowork = orquestrador (arquivos + Chrome connector)
|
|
191
|
+
- Claude Code = implementador (Agent Teams + Chrome)
|
|
192
|
+
- Claude.ai = arquiteto (sem conexão direta — humano é ponte)
|
|
193
|
+
|
|
194
|
+
### Chrome como ponte automática
|
|
195
|
+
Testar Claude in Chrome lendo a aba do Claude.ai como ponte.
|
|
196
|
+
Promissor mas frágil — não recomendar como prática padrão
|
|
197
|
+
até validar em projetos reais.
|
|
198
|
+
|
|
199
|
+
### Regras de lint customizadas pro DocManager
|
|
200
|
+
Avaliar adicionar: services não importam de `next`,
|
|
201
|
+
API routes não importam do Prisma direto,
|
|
202
|
+
schemas derivam da entity base.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
*Documento gerado ao final do projeto DocManager como parte
|
|
207
|
+
da retrospectiva. Cada lição tem contexto real — não são
|
|
208
|
+
"boas práticas genéricas" mas aprendizados de problemas
|
|
209
|
+
que aconteceram.*
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
# Lições adicionais — projeto tradeBot (2026-05)
|
|
214
|
+
|
|
215
|
+
Aprendizados extraídos do refactor incremental do tradeBot.
|
|
216
|
+
Complementam ou refinam as lições do DocManager.
|
|
217
|
+
|
|
218
|
+
## Etapa 9 — LLM como executor
|
|
219
|
+
|
|
220
|
+
### Princípios técnicos vs princípios LLM-first vs valores
|
|
221
|
+
**Quando se aplica:** ao escrever [design-principles](./design-principles.md).
|
|
222
|
+
**Por que importa:** tratar tudo como "princípios" mistura regras
|
|
223
|
+
acionáveis com filosofia. Separação em 3 categorias:
|
|
224
|
+
- **Técnicos** (4): regras universais de arquitetura.
|
|
225
|
+
- **LLM-first** (5): regras específicas pra trabalho com LLM como executor.
|
|
226
|
+
- **Valores não-acionáveis** (2): cultura, sem critério binário.
|
|
227
|
+
LLM lê critério binário > regra textual.
|
|
228
|
+
|
|
229
|
+
### Critérios meta padrão (M1, M2, M3)
|
|
230
|
+
**Quando se aplica:** toda spec.
|
|
231
|
+
**Por que importa:** regras textuais em CLAUDE.md são esquecidas
|
|
232
|
+
durante a sessão. Critério em checklist é checkpoint binário.
|
|
233
|
+
- **M1**: Decisões de implementação preenchidas com substância.
|
|
234
|
+
- **M2**: Decisões técnicas explicitadas em thinking.
|
|
235
|
+
- **M3**: Release checklist com símbolos ✅/❌/⚠️ por item.
|
|
236
|
+
|
|
237
|
+
### Template literal > exemplo aspiracional
|
|
238
|
+
**Quando se aplica:** instruir formato de output do Code (ex: M3).
|
|
239
|
+
**Por que importa:** "o output deve seguir esse formato:" + bloco
|
|
240
|
+
de código fixo é copiado e preenchido. Exemplo aspiracional sem
|
|
241
|
+
"Code DEVE reportar usando este formato" é ignorado.
|
|
242
|
+
|
|
243
|
+
### Mudanças adjacentes vão pra outra spec
|
|
244
|
+
**Quando se aplica:** durante implementação de qualquer spec.
|
|
245
|
+
**Por que importa:** preserva o binário "passou/falhou", esconde
|
|
246
|
+
menos escopo, mantém rastreabilidade. Bug ou refactor tentador
|
|
247
|
+
visto durante implementação NÃO entra na spec atual — anota em
|
|
248
|
+
"Decisões de implementação" e abre spec separada se relevante.
|
|
249
|
+
|
|
250
|
+
### `_open-issues.md` como ponte entre regra e esquecimento
|
|
251
|
+
**Quando se aplica:** projeto com mais de 3-4 specs.
|
|
252
|
+
**Por que importa:** "anotar e adiar" precisa de lugar central,
|
|
253
|
+
não enterrado em decisões de spec. Cada item exige "Candidato a
|
|
254
|
+
endereçamento" explícito — sem isso, vira lixo.
|
|
255
|
+
|
|
256
|
+
### Smoke check em código > pendente humano
|
|
257
|
+
**Quando se aplica:** quando bug é detectável programaticamente.
|
|
258
|
+
**Por que importa:** "pendente humano" significa "ninguém vai
|
|
259
|
+
rodar". Bug pode passar silencioso. Quando possível (round-trip,
|
|
260
|
+
fixture conhecida), critério vira teste programático.
|
|
261
|
+
|
|
262
|
+
### Pragmatismo controlado: escape hatch tem destino
|
|
263
|
+
**Quando se aplica:** ao aceitar `as any`, `// @ts-ignore`, etc.
|
|
264
|
+
**Por que importa:** LLM aceita escape hatches com facilidade.
|
|
265
|
+
Aviso explícito: qualquer escape hatch DEVE ser documentado em
|
|
266
|
+
"Decisões de implementação" + ter candidato a endereçamento futuro.
|
|
267
|
+
Sem destino, vira dívida invisível.
|
|
268
|
+
|
|
269
|
+
### Limite numérico funciona como guardrail
|
|
270
|
+
**Quando se aplica:** ao prescrever ajustes em código existente.
|
|
271
|
+
**Por que importa:** "se ajuste exigir mexer em mais de 5 lugares,
|
|
272
|
+
parar" é mais efetivo que "menor superfície" abstrato. LLM consegue
|
|
273
|
+
contar. Dá um número.
|
|
274
|
+
|
|
275
|
+
### Mock pesado pra contornar acoplamento estrutural é anti-padrão
|
|
276
|
+
**Quando se aplica:** ao testar função que importa módulo com
|
|
277
|
+
side-effects.
|
|
278
|
+
**Por que importa:** quando o teste precisa de >2 mocks pra carregar
|
|
279
|
+
o módulo, o problema é a estrutura, não o teste. Solução é refactor
|
|
280
|
+
estrutural, não mais mocks. Caso clássico: side-effects no top-level
|
|
281
|
+
do entrypoint.
|
|
282
|
+
|
|
283
|
+
### Verificar side-effects no top-level antes de prescrever import em teste
|
|
284
|
+
**Quando se aplica:** ao escrever spec que prescreve `export` de
|
|
285
|
+
função existente pra testar.
|
|
286
|
+
**Por que importa:** se o módulo de origem tem `process.exit`,
|
|
287
|
+
`new Client(...)`, `run().catch(...)` no top-level, importar em teste
|
|
288
|
+
vira rabbit hole. Opções: extrair função pra arquivo próprio, ou
|
|
289
|
+
adiar teste pra spec posterior.
|
|
290
|
+
|
|
291
|
+
## Etapa 10 — Trabalho com snapshots e templates vivos
|
|
292
|
+
|
|
293
|
+
### Templates vivos > snapshots zero
|
|
294
|
+
**Quando se aplica:** ao acumular padrões de múltiplos projetos.
|
|
295
|
+
**Por que importa:** snapshot por projeto preserva histórico.
|
|
296
|
+
Templates separados, versionados em git, mantêm o estado da arte
|
|
297
|
+
atualizável. Os dois são complementares — não substitutos.
|
|
298
|
+
|
|
299
|
+
### "Fix definitivo" prematuro pode ser falso
|
|
300
|
+
**Quando se aplica:** ao fechar issue assumindo que causa raiz
|
|
301
|
+
foi resolvida.
|
|
302
|
+
**Por que importa:** se o sintoma reaparece em outro contexto,
|
|
303
|
+
o fix não era definitivo. Marcar issue como FECHADA exige observar
|
|
304
|
+
em pelo menos 2 sessões sem retorno do sintoma.
|
|
305
|
+
|
|
306
|
+
### Padrão port/adapter cabe em projeto pequeno
|
|
307
|
+
**Quando se aplica:** projeto com lib externa cuja interface deve
|
|
308
|
+
ser isolada (broker, DB, AI APIs).
|
|
309
|
+
**Por que importa:** custo inicial baixo (~80 linhas) destrava
|
|
310
|
+
testabilidade, validação de respostas, e flexibilidade pra trocar
|
|
311
|
+
implementação. Não é overkill mesmo em projetos pequenos.
|
|
312
|
+
|
|
313
|
+
### `.passthrough()` em Zod resolve "campos extras pra log"
|
|
314
|
+
**Quando se aplica:** validação de respostas de APIs externas
|
|
315
|
+
onde a lógica usa só alguns campos mas log/observability quer todos.
|
|
316
|
+
**Por que importa:** schema valida campos críticos, runtime mantém
|
|
317
|
+
o resto. Tipo inferido fica estrito; cast pra index signature
|
|
318
|
+
quando necessário.
|
|
319
|
+
|
|
320
|
+
### `outDir` separado desde o início
|
|
321
|
+
**Quando se aplica:** projeto com `tsc` + Vitest (ou similar).
|
|
322
|
+
**Por que importa:** `tsc` gerando `.js` ao lado de `.ts` causa
|
|
323
|
+
conflito recorrente — Node prefere `.js` na resolução. Custo de fix
|
|
324
|
+
tardio: sessões bloqueadas por arquivos stale. Configurar
|
|
325
|
+
`outDir: ./dist/` desde a primeira sessão.
|
|
326
|
+
|
|
327
|
+
### Múltiplas leituras fragmentadas do mesmo arquivo
|
|
328
|
+
**Quando se aplica:** Code lendo arquivo grande com offsets
|
|
329
|
+
diferentes.
|
|
330
|
+
**Por que importa:** custo de round-trips agregado supera custo
|
|
331
|
+
de uma leitura única. Antes de múltiplos `Read` com offsets,
|
|
332
|
+
considerar `limit: 2000` em uma única chamada.
|
|
333
|
+
|
|
334
|
+
### Limite de "tudo numa spec" pode estourar mas vale aceitar
|
|
335
|
+
**Quando se aplica:** specs de refactor estrutural maior (mover
|
|
336
|
+
muitos arquivos).
|
|
337
|
+
**Por que importa:** spec-guide diz ~80-150 linhas. Refactor que
|
|
338
|
+
move 10+ funções com testes inevitavelmente passa de 200. Aceitar
|
|
339
|
+
quando o escopo é coeso é melhor que dividir em sub-specs que
|
|
340
|
+
violam "fases verticais entregam valor".
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
*Lições adicionais extraídas do tradeBot. Padrão: cada lição tem
|
|
345
|
+
contexto, "quando se aplica", "por que importa" — não é máxima
|
|
346
|
+
abstrata.*
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
# Lições adicionais — projeto painel (2026-06)
|
|
351
|
+
|
|
352
|
+
Aprendizados do **trade-bot-painel**, o 3º projeto. Aqui o **pipeline de
|
|
353
|
+
agentes** ([pipeline](./pipeline.md)) rodou de ponta a ponta pela 1ª vez (conceituação →
|
|
354
|
+
documentação funcional → geração de spec → implementação) no Incremento 1.
|
|
355
|
+
|
|
356
|
+
## Etapa 11 — Pipeline de agentes (conceituação → spec)
|
|
357
|
+
|
|
358
|
+
### Separar conceituação de geração de spec paga
|
|
359
|
+
**Quando se aplica:** projeto novo de produto, não mudança pequena.
|
|
360
|
+
**Por que importa:** a conceituação (`agente-conceituacao`) produz um LDoc
|
|
361
|
+
estável (dor, casos de uso, roadmap de incrementos, DER amplo) que vira
|
|
362
|
+
fonte de verdade; o gerador (`agente-gerador-spec`) só **recorta e
|
|
363
|
+
redistribui** isso em specs verticais. Não inventar na geração — se está
|
|
364
|
+
escrevendo do zero algo que já está no LDoc, o corte está errado.
|
|
365
|
+
|
|
366
|
+
### LDoc é fonte da verdade; HDoc deriva estrito
|
|
367
|
+
**Quando se aplica:** qualquer artefato de documentação do pipeline.
|
|
368
|
+
**Por que importa:** o `.md` para LLM (LDoc) é editado; o doc humano (HDoc)
|
|
369
|
+
é sempre regerado dele, nunca editado à mão. Tutorial e exemplos moram no
|
|
370
|
+
LDoc (não só no HDoc) — servem ao gerador de spec como referência de
|
|
371
|
+
comportamento. Evita duas fontes divergindo.
|
|
372
|
+
|
|
373
|
+
### Protocolo de gates > regra de gate em prosa
|
|
374
|
+
**Quando se aplica:** qualquer ponto de confirmação humana num agente.
|
|
375
|
+
**Por que importa:** os agentes "declaravam rigor e cediam a um ok genérico"
|
|
376
|
+
em ponto de alto risco. Externalizar para [protocolo-de-gates](./agents/protocolo-de-gates.md) (alto
|
|
377
|
+
risco = lista numerada, "ok" genérico não fecha, valores verificáveis =
|
|
378
|
+
alto risco automático) é o mesmo aprendizado dos critérios meta — checklist
|
|
379
|
+
binário vence atenção. Limite honesto: mais forte que prosa, não à prova
|
|
380
|
+
de falha.
|
|
381
|
+
|
|
382
|
+
### Roadmap por incremento, estável mas não congelado
|
|
383
|
+
**Quando se aplica:** projeto que entrega em fatias de produto.
|
|
384
|
+
**Por que importa:** detalhar só o Incremento 1 em alta resolução e manter
|
|
385
|
+
os demais em baixa (nome + valor + UCs) evita compromisso prematuro. O
|
|
386
|
+
re-entry (detalhar o próximo incremento) inclui um checkpoint "o macro
|
|
387
|
+
ainda vale?" — captura aprendizado sem repetir o diálogo macro.
|
|
388
|
+
|
|
389
|
+
### Schema frouxo ≠ dado ausente
|
|
390
|
+
**Quando se aplica:** ao cortar/justificar spec a partir de schemas.
|
|
391
|
+
**Por que importa:** `z.array(z.unknown())` significa "forma ainda não
|
|
392
|
+
tipada", não "o dado é vazio". No painel, `buyStack`/`sellStack` estavam
|
|
393
|
+
`z.unknown()` (vazios na amostra) — quando o dado real apareceu, o shape
|
|
394
|
+
foi determinado e as specs `monitor/01` e `03` tiparam. Tratar forma do
|
|
395
|
+
schema como forma, nunca como evidência sobre presença/conteúdo do dado.
|
|
396
|
+
|
|
397
|
+
### Confronto com dado real reconcilia o DER amplo
|
|
398
|
+
**Quando se aplica:** geração de spec quando há exemplo real do dado.
|
|
399
|
+
**Por que importa:** o DER amplo (raso, por decisão) supôs `orderId` como
|
|
400
|
+
`string`; o JSON real tinha `number`. As specs corrigiram (fonte de verdade
|
|
401
|
+
= dado real) e registraram a divergência pra reconciliação a jusante. Não
|
|
402
|
+
infira a forma do dado da conceituação quando há o dado na mão.
|
|
403
|
+
|
|
404
|
+
### Docs de orientação descasam do roadmap real — reconciliar cedo
|
|
405
|
+
**Quando se aplica:** quando o pipeline reorganiza o trabalho (ex.: de
|
|
406
|
+
domínio `tradebot/` para incremento `monitor/`).
|
|
407
|
+
**Por que importa:** `_overview`, `CLAUDE.md` (tabela de estado) e o doc de
|
|
408
|
+
entrada passam a mentir sobre "qual a próxima spec". A spec em si é
|
|
409
|
+
autocontida (não bloqueia), mas o roadmap desatualizado confunde. Issue de
|
|
410
|
+
roadmap precisa de candidato e fechamento, igual bug.
|
|
411
|
+
|
|
412
|
+
### Status se lê do conteúdo, não do índice
|
|
413
|
+
**Quando se aplica:** ao responder "em que etapa estamos / qual a próxima"
|
|
414
|
+
ou "X está pronto?", tipicamente ao orientar no início de uma sessão.
|
|
415
|
+
**Por que importa:** numa sessão de orientação o agente respondeu a partir
|
|
416
|
+
das tabelas de status (`_overview`, tabela de estado do `CLAUDE.md`) — lidas
|
|
417
|
+
ainda por cima **truncadas** (`head -N`) — sem abrir nenhuma spec. Dois
|
|
418
|
+
estragos: (1) quase repassou a divergência do índice (que driftou, ver lição
|
|
419
|
+
acima) como verdade; (2) confundiu "Decisões de implementação preenchidas"
|
|
420
|
+
(rastro do **estágio 4**, por M1) com "review feito" (**estágio 5**, que tem
|
|
421
|
+
rastro próprio — o veredito do Review.Code), e por isso não viu que o próximo
|
|
422
|
+
passo era **rodar os fluxos de review**. O índice é HDoc do status: derivado
|
|
423
|
+
e sujeito a drift; a fonte é o **conteúdo da spec**. Regra: status se
|
|
424
|
+
descobre pelo **rastro nos artefatos** (tabela em [pipeline](./pipeline.md), "Em que
|
|
425
|
+
estágio estou?"), nunca da tabela de status, nunca de leitura truncada.
|
|
426
|
+
Mesma raiz da lição anterior, agora no ato de **orientar**, não de
|
|
427
|
+
implementar — e por isso a correção foi tornar o procedimento explícito no
|
|
428
|
+
`CLAUDE.md`/`pipeline`, não só descrever a falha.
|
|
429
|
+
|
|
430
|
+
### Briefing congelado precisa de nota, não de reescrita
|
|
431
|
+
**Quando se aplica:** quando um snapshot canônico (ex.: `Kickoff.md`) fica
|
|
432
|
+
obsoleto.
|
|
433
|
+
**Por que importa:** reescrever um doc deliberadamente congelado apaga
|
|
434
|
+
história e contradiz a decisão de congelá-lo. Uma nota no topo apontando o
|
|
435
|
+
roadmap vigente resolve a confusão sem perder o snapshot.
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
*Lições do painel. O pipeline de agentes teve aqui sua 1ª validação real —
|
|
440
|
+
tratar como método vivo, não consolidado, até acumular mais runs.*
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Pipeline de desenvolvimento
|
|
2
|
+
|
|
3
|
+
Como uma ideia vira código neste método. É a **espinha** que conecta o
|
|
4
|
+
discovery, os agentes de conceituação/documentação/spec ([agents/](./agents/README.md)),
|
|
5
|
+
o protocolo de gates e o ciclo Cowork↔Claude Code do [spec-guide](./spec-guide.md).
|
|
6
|
+
|
|
7
|
+
## Visão geral
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
0 discovery → 1 conceituação → 2 doc-funcional → 3 gerador-spec → 4 Claude Code → 5 review
|
|
11
|
+
(kickoff) (reqs/ldoc+hdoc) (como-funciona) (specs/) (código+report) │
|
|
12
|
+
└────────────── protocolo-de-gates governa os gates ───────────┘ │
|
|
13
|
+
↓
|
|
14
|
+
5 · review (sub-cadeia): Review.Code → User Review → Review.Product → Review.LLM
|
|
15
|
+
(veredito) (uso humano) (roteia) (corrige pipeline)
|
|
16
|
+
└─ Impeditivo escala: User Review → Review.Product → Conceituação
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Os estágios
|
|
20
|
+
|
|
21
|
+
**0 · Discovery / kickoff** — [agente-kickoff](./agents/agente-kickoff.md). Entender o problema antes da
|
|
22
|
+
solução: build-vs-buy, orçamento de serviços externos, o que o framework
|
|
23
|
+
NÃO faz, volume, decisões de stack e **esboço** de modelo de dados. A porta
|
|
24
|
+
de entrada humana é a skill `project-kickoff` (quando instalada) ou `npx
|
|
25
|
+
product-runner init`; o [agente-kickoff](./agents/agente-kickoff.md) é a diretriz
|
|
26
|
+
versionada do estágio, copiada para `docs/agents/` no scaffold. Saída:
|
|
27
|
+
decisões consolidadas num briefing (ex.: `Kickoff.md`) + perfil escolhido.
|
|
28
|
+
|
|
29
|
+
**1 · Conceituação** — [agente-conceituacao](./agents/agente-conceituacao.md). Dor→conceito: diagrama de
|
|
30
|
+
conceitos, casos de uso, roadmap de incrementos (baixa resolução), DER
|
|
31
|
+
amplo, e o **Incremento 1 detalhado** (estrutura de dados, sequências,
|
|
32
|
+
exemplo com critérios). Gates 1 · 1.5 · 2 · 3. Saída: `reqs/ldoc.md` +
|
|
33
|
+
`reqs/hdoc.md`.
|
|
34
|
+
|
|
35
|
+
**2 · Documentação funcional** — [agente-documentacao-funcional](./agents/agente-documentacao-funcional.md). Como a
|
|
36
|
+
aplicação funciona e como usar, em tom presente. Roda por incremento,
|
|
37
|
+
antes da spec. Saída: `funcional/como-funciona.ldoc.md` + `.hdoc.md`.
|
|
38
|
+
|
|
39
|
+
**3 · Geração de spec** — [agente-gerador-spec](./agents/agente-gerador-spec.md). Corta o incremento em N
|
|
40
|
+
specs verticais no template do [spec-guide](./spec-guide.md), redistribuindo os artefatos
|
|
41
|
+
a montante. Gate de corte (alto risco). Saída: `specs/{domínio}/NN.md` +
|
|
42
|
+
[_overview](../specs/_overview.md) + [_open-issues](../specs/_open-issues.md).
|
|
43
|
+
|
|
44
|
+
**4 · Implementação** — Claude Code, **uma spec por sessão**: lê
|
|
45
|
+
[CLAUDE.md](../CLAUDE.md) → a spec → os `docs/` referenciados →
|
|
46
|
+
implementa → reporta (critérios ✅/❌ + decisões). Detalhe do ciclo e das
|
|
47
|
+
regras operacionais no [spec-guide](./spec-guide.md).
|
|
48
|
+
|
|
49
|
+
**5 · Review** — sub-cadeia própria, rodada **por incremento entregue**,
|
|
50
|
+
um agente por papel ([agents/](./agents/README.md)):
|
|
51
|
+
|
|
52
|
+
1. **Review.Code** ([agente-review-code](./agents/agente-review-code.md)) — review técnico: cruza
|
|
53
|
+
cada critério de aceite com o **código real** (grep, testes, diff), não
|
|
54
|
+
com o report. Rastro: veredito ✅/❌/⚠️ por critério + classificação dos
|
|
55
|
+
achados (correção do ciclo / issue / Impeditivo). Divergências legítimas
|
|
56
|
+
são apontadas para as "Decisões de implementação" da spec — ele não
|
|
57
|
+
reescreve a spec.
|
|
58
|
+
2. **User Review** ([agente-user-review](./agents/agente-user-review.md)) — prepara o teste de
|
|
59
|
+
usabilidade (roteiro) e trata o feedback (corte binário ajuste /
|
|
60
|
+
mais-que-ajuste). O julgamento é humano e intransferível. Roda após o
|
|
61
|
+
Review.Code.
|
|
62
|
+
3. **Review.Product** ([agente-review-product](./agents/agente-review-product.md)) — hub: classifica
|
|
63
|
+
o feedback por **causa-raiz** e roteia ao destino (Conceituação,
|
|
64
|
+
Doc-funcional, Design System ou Review.LLM). Acumula a fila de produto.
|
|
65
|
+
4. **Review.LLM** ([agente-review-llm](./agents/agente-review-llm.md)) — meta: a partir de uma
|
|
66
|
+
falha **já diagnosticada com o humano**, corrige o **próprio pipeline**
|
|
67
|
+
(diretiva, skill, template) pra ela não repetir, e reconcilia a mesma
|
|
68
|
+
inconsistência se ela propagou.
|
|
69
|
+
|
|
70
|
+
**Impeditivo** (concepção profunda achada no Review.Code) bloqueia o avanço
|
|
71
|
+
e escala por User Review → Review.Product → Conceituação; só o humano
|
|
72
|
+
bypassa. A **volta de reconciliação** (corrigir conceituação/funcional
|
|
73
|
+
contra o que foi construído) é coberta por Review.Product → destino — antes
|
|
74
|
+
era fase futura, agora está especificada nos agentes. Tratar como
|
|
75
|
+
recém-especificado: método vivo até acumular runs.
|
|
76
|
+
|
|
77
|
+
## Em que estágio estou? (orientar pelo rastro)
|
|
78
|
+
|
|
79
|
+
"Qual a próxima etapa" / "X está pronto?" se descobre **lendo o conteúdo
|
|
80
|
+
dos artefatos**, não a tabela de status. Cada estágio deixa um **rastro**
|
|
81
|
+
detectável; o **primeiro estágio sem rastro é o próximo passo**:
|
|
82
|
+
|
|
83
|
+
| Estágio | Rastro de que rodou |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| 1 conceituação | `reqs/ldoc.md` existe e preenchido |
|
|
86
|
+
| 2 doc-funcional | `funcional/como-funciona.ldoc.md` existe |
|
|
87
|
+
| 3 gerador-spec | `specs/{domínio}/NN.md` existem + `_overview` populado |
|
|
88
|
+
| 4 implementação | report do Code (critérios ✅/❌/⚠️) + **"Decisões de implementação" preenchidas** (critério M1) |
|
|
89
|
+
| 5 review | **veredito do Review.Code** (cruzamento critério × código) + saídas de User/Product/LLM (filas de produto/meta) |
|
|
90
|
+
|
|
91
|
+
> **Cuidado — o erro clássico:** "Decisões de implementação" preenchidas
|
|
92
|
+
> são rastro do **estágio 4** (Code as preenche por M1), **não** do review.
|
|
93
|
+
> O estágio 5 tem rastro **próprio** (o veredito do Review.Code). Ver uma
|
|
94
|
+
> spec com Decisões preenchidas e concluir "review feito" é confundir os
|
|
95
|
+
> dois — aconteceu de verdade (ver [lessons-learned](./lessons-learned.md)). Se não há
|
|
96
|
+
> veredito de review, **o próximo passo é rodar os fluxos de review.**
|
|
97
|
+
|
|
98
|
+
**Regra de fonte:** a spec é a **fonte**; `_overview.md` e a tabela de
|
|
99
|
+
estado do `CLAUDE.md` são **índice derivado** (mesmo princípio LDoc→HDoc
|
|
100
|
+
abaixo). Confirme o status contra o **conteúdo da spec** antes de afirmar ou
|
|
101
|
+
sugerir o próximo passo. Se o índice diverge da spec, a **spec ganha** e o
|
|
102
|
+
índice é o que se corrige. Nunca responda status a partir de leitura
|
|
103
|
+
truncada (`head -N`) do índice.
|
|
104
|
+
|
|
105
|
+
## LDoc / HDoc
|
|
106
|
+
|
|
107
|
+
- **LDoc** (`.md`, feito para LLM ler) é a **fonte da verdade** de cada
|
|
108
|
+
estágio. O **HDoc** é sempre **derivado** do LDoc — nunca editado à mão.
|
|
109
|
+
Se o humano pede mudança no HDoc, a mudança entra no LDoc e o HDoc é
|
|
110
|
+
regenerado.
|
|
111
|
+
- **Não são templates de arquivo** — nascem da execução dos agentes no
|
|
112
|
+
projeto. Convenção de caminhos: `reqs/` (conceituação), `funcional/`
|
|
113
|
+
(documentação funcional).
|
|
114
|
+
|
|
115
|
+
## Gates (transversal)
|
|
116
|
+
|
|
117
|
+
[protocolo-de-gates](./agents/protocolo-de-gates.md) é a **fonte canônica** de gate e calibragem por
|
|
118
|
+
stakes: alto risco → lista numerada, "ok" genérico não fecha; valores
|
|
119
|
+
verificáveis (contas, critérios) = alto risco automático. Os critérios
|
|
120
|
+
meta **M1-M3** do [spec-guide](./spec-guide.md) são a **aplicação** desse princípio à
|
|
121
|
+
etapa de spec (checklist binário vence atenção textual — mesmo aprendizado).
|
|
122
|
+
|
|
123
|
+
## Pipeline inteiro vs trecho curto
|
|
124
|
+
|
|
125
|
+
- **Projeto novo de produto:** pipeline inteiro (0→5). O discovery e a
|
|
126
|
+
conceituação pagam o custo quando há produto a descobrir.
|
|
127
|
+
- **Mudança pequena / projeto pequeno:** entrar direto no trecho
|
|
128
|
+
spec→implementa→review (estágios 3-5), sem conceituação formal. O
|
|
129
|
+
[spec-guide](./spec-guide.md) cobre esse caminho (inclui "fixes vs specs").
|
|
130
|
+
|
|
131
|
+
## Onde mora cada coisa
|
|
132
|
+
|
|
133
|
+
| Estágio | Ferramenta |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| Discovery (0) | Skill `project-kickoff` + humano |
|
|
136
|
+
| Conceituação, doc-funcional, gerador-spec, review (1-3, 5) | Cowork (sessão com acesso aos arquivos) |
|
|
137
|
+
| Implementação (4) | Claude Code (sessão dedicada apontando pro repo) |
|
|
138
|
+
| Gates | Transversal — [protocolo-de-gates](./agents/protocolo-de-gates.md) |
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
_Método vivo. Validado pela 1ª vez ponta a ponta no **trade-bot-painel**
|
|
143
|
+
(2026-06), Incremento 1. Tratar como hipótese até acumular mais runs._
|