@dewtech/dare-cli 2.15.0 → 2.17.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 +659 -561
- package/dist/__tests__/refine.test.d.ts +2 -0
- package/dist/__tests__/refine.test.d.ts.map +1 -0
- package/dist/__tests__/refine.test.js +186 -0
- package/dist/__tests__/refine.test.js.map +1 -0
- package/dist/__tests__/review.test.d.ts +2 -0
- package/dist/__tests__/review.test.d.ts.map +1 -0
- package/dist/__tests__/review.test.js +242 -0
- package/dist/__tests__/review.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +150 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/bin/dare.js +6 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +27 -9
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +76 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/refine.d.ts +16 -0
- package/dist/commands/refine.d.ts.map +1 -0
- package/dist/commands/refine.js +167 -0
- package/dist/commands/refine.js.map +1 -0
- package/dist/commands/review.d.ts +16 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +106 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +149 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/types/Refine.types.d.ts +96 -0
- package/dist/types/Refine.types.d.ts.map +1 -0
- package/dist/types/Refine.types.js +19 -0
- package/dist/types/Refine.types.js.map +1 -0
- package/dist/types/Review.types.d.ts +86 -0
- package/dist/types/Review.types.d.ts.map +1 -0
- package/dist/types/Review.types.js +15 -0
- package/dist/types/Review.types.js.map +1 -0
- package/dist/types/UpdateManifest.types.d.ts +91 -0
- package/dist/types/UpdateManifest.types.d.ts.map +1 -0
- package/dist/types/UpdateManifest.types.js +13 -0
- package/dist/types/UpdateManifest.types.js.map +1 -0
- package/dist/utils/ReviewRunner.d.ts +42 -0
- package/dist/utils/ReviewRunner.d.ts.map +1 -0
- package/dist/utils/ReviewRunner.js +175 -0
- package/dist/utils/ReviewRunner.js.map +1 -0
- package/dist/utils/UpdateApplier.d.ts +42 -0
- package/dist/utils/UpdateApplier.d.ts.map +1 -0
- package/dist/utils/UpdateApplier.js +207 -0
- package/dist/utils/UpdateApplier.js.map +1 -0
- package/dist/utils/UpdateDetector.d.ts +56 -0
- package/dist/utils/UpdateDetector.d.ts.map +1 -0
- package/dist/utils/UpdateDetector.js +164 -0
- package/dist/utils/UpdateDetector.js.map +1 -0
- package/dist/utils/complexity-analyzer.d.ts +60 -0
- package/dist/utils/complexity-analyzer.d.ts.map +1 -0
- package/dist/utils/complexity-analyzer.js +292 -0
- package/dist/utils/complexity-analyzer.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +79 -0
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -0
- package/dist/utils/excalidraw-renderer.js +188 -0
- package/dist/utils/excalidraw-renderer.js.map +1 -0
- package/dist/utils/excalidraw-renderer.test.d.ts +2 -0
- package/dist/utils/excalidraw-renderer.test.d.ts.map +1 -0
- package/dist/utils/excalidraw-renderer.test.js +135 -0
- package/dist/utils/excalidraw-renderer.test.js.map +1 -0
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +21 -2
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/stack-bootstrap.js +3 -1
- package/dist/utils/stack-bootstrap.js.map +1 -1
- package/dist/utils/static-analyzer.d.ts +29 -0
- package/dist/utils/static-analyzer.d.ts.map +1 -0
- package/dist/utils/static-analyzer.js +390 -0
- package/dist/utils/static-analyzer.js.map +1 -0
- package/dist/utils/version-compare.d.ts +27 -0
- package/dist/utils/version-compare.d.ts.map +1 -0
- package/dist/utils/version-compare.js +47 -0
- package/dist/utils/version-compare.js.map +1 -0
- package/package.json +1 -1
- package/templates/DARE-dag-example.yaml +280 -0
- package/templates/UPDATE-MANIFEST.json +48 -0
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +180 -36
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +41 -0
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +45 -4
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +56 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +41 -0
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -0
- package/templates/ide/claude/templates/TASK-SPEC-template.md +45 -4
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +45 -0
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +42 -0
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -0
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -0
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +45 -4
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dare-review
|
|
3
|
+
description: Audita uma task DARE implementada — cruza a spec com o código real para detectar stubs, mocks fora de testes, funções vazias, TODOs e validar critério-a-critério se a implementação satisfaz o que a spec prometeu. Use antes de marcar uma task como DONE, ou quando o dev pedir revisão manual. Combina análise estática (via CLI) com verdito semântico (você).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DARE Review Skill
|
|
7
|
+
|
|
8
|
+
Você é o auditor de qualidade do método DARE. Seu papel é verificar se uma task implementada **realmente** entrega o que a spec promete — sem stubs, sem mocks em produção, sem funções vazias, sem TODOs pendentes.
|
|
9
|
+
|
|
10
|
+
## Quando usar esta skill
|
|
11
|
+
|
|
12
|
+
- Antes de marcar uma task como DONE (gate obrigatório no Definition of Done)
|
|
13
|
+
- Quando `dare review <id>` estático passa mas precisa validação semântica
|
|
14
|
+
- Quando o dev pede revisão manual: "revise a task-034"
|
|
15
|
+
|
|
16
|
+
## Camada estática vs semântica
|
|
17
|
+
|
|
18
|
+
O CLI `dare review <id>` já faz a camada **estática**: regex sobre os arquivos detecta TODO/FIXME/stubs/mocks/funções vazias. Esta skill faz a camada **semântica**: critério-a-critério da spec contra a implementação real.
|
|
19
|
+
|
|
20
|
+
## Como executar
|
|
21
|
+
|
|
22
|
+
### Passo 1: Rodar a camada estática
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
dare review <task-id> --format json > .dare/review-static-<task-id>.json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Leia o JSON. Se houver erros estáticos, reporte-os primeiro. Geralmente não vale prosseguir com semântica se a estática falhou.
|
|
29
|
+
|
|
30
|
+
### Passo 2: Carregar contexto
|
|
31
|
+
|
|
32
|
+
- `DARE/EXECUTION/<task-id>.md` — spec da task
|
|
33
|
+
- Cada arquivo listado na seção 3 ("ARQUIVOS A CRIAR / MODIFICAR")
|
|
34
|
+
- `DARE/BLUEPRINT.md` — contratos de API / modelos
|
|
35
|
+
|
|
36
|
+
### Passo 3: Auditoria critério-a-critério
|
|
37
|
+
|
|
38
|
+
Para **cada** item das seções abaixo, marque ✅ / ❌ com evidência (arquivo + linha):
|
|
39
|
+
|
|
40
|
+
#### 3.1 Objetivo (seção 1 da spec)
|
|
41
|
+
A implementação atinge o estado observável prometido? Encontre evidência concreta.
|
|
42
|
+
|
|
43
|
+
#### 3.2 Arquivos (seção 3)
|
|
44
|
+
- Todos existem com conteúdo descrito?
|
|
45
|
+
- Arquivos extras suspeitos?
|
|
46
|
+
|
|
47
|
+
#### 3.3 Implementação (seção 4)
|
|
48
|
+
- Cada passo numerado foi executado?
|
|
49
|
+
- Assinaturas exatas correspondem?
|
|
50
|
+
- Validações têm regras concretas (não "valida email" — a regex específica)?
|
|
51
|
+
|
|
52
|
+
#### 3.4 Testes (seção 4 — subitem testes)
|
|
53
|
+
- Cada teste listado existe?
|
|
54
|
+
- Tem assertions reais (não `assertTrue(true)`)?
|
|
55
|
+
- Edge cases enumerados cobertos?
|
|
56
|
+
|
|
57
|
+
#### 3.5 Segurança (seção 5)
|
|
58
|
+
- Input validation conforme spec?
|
|
59
|
+
- Não há secrets/tokens hardcoded?
|
|
60
|
+
- SQL/Command injection mitigado?
|
|
61
|
+
|
|
62
|
+
#### 3.6 Anti-Stub (seção 7)
|
|
63
|
+
A camada estática já checou. Só anote se encontrar algo que regex não pegaria (ex.: dados hardcoded disfarçados).
|
|
64
|
+
|
|
65
|
+
### Passo 4: Emitir verdito semântico
|
|
66
|
+
|
|
67
|
+
Salve em `.dare/review-semantic-<task-id>.json`:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"passed": true,
|
|
72
|
+
"unmetCriteria": [],
|
|
73
|
+
"notes": "Resumo de 1-3 frases"
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Falha:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"passed": false,
|
|
82
|
+
"unmetCriteria": [
|
|
83
|
+
"Seção 4.3: validação de senha sem regex de força",
|
|
84
|
+
"Seção 4.4: teste de 'email duplicado' não existe"
|
|
85
|
+
],
|
|
86
|
+
"notes": "2 critérios não atendidos em src/auth/register.ts"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Passo 5: Rodar o review fundido
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
dare review <task-id> --from-agent .dare/review-semantic-<task-id>.json
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Exit code 0 = pode ir para DONE; 1 = não pode.
|
|
97
|
+
|
|
98
|
+
### Passo 6: Mensagem final
|
|
99
|
+
|
|
100
|
+
Se passou:
|
|
101
|
+
> ✅ Task aprovada. Marque DONE: `dare execute --complete <task-id>`
|
|
102
|
+
|
|
103
|
+
Se falhou:
|
|
104
|
+
> ❌ Task não passou. Itens a corrigir: [lista]. Re-rode após corrigir.
|
|
105
|
+
|
|
106
|
+
## Regras inegociáveis
|
|
107
|
+
|
|
108
|
+
- **Não invente** que algo está implementado se não viu o código no disco
|
|
109
|
+
- **Não aceite** mocks/stubs em código de produção mesmo que façam testes passar
|
|
110
|
+
- **Mocks são OK** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`
|
|
111
|
+
- **Evidência concreta:** sempre cite arquivo + linha para suas conclusões
|
|
@@ -172,6 +172,47 @@ npm run build # ou cargo build, composer install, etc.
|
|
|
172
172
|
Task 002: DB migrations
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
+
### Passo 5.1: ANTI-STUB CONTRACT (inegociável)
|
|
176
|
+
|
|
177
|
+
> Tasks geradas com `subtask_prompt` ou spec genéricos forçam o agente a inventar — e ele vai produzir mock, stub ou esqueleto. **Não é negociável**. O comando `dare review <task-id>` (v2.17+) detecta isso e marca a task como FAILED.
|
|
178
|
+
|
|
179
|
+
Cada `subtask_prompt` e `EXECUTION/task-<id>.md` deve atender este contrato:
|
|
180
|
+
|
|
181
|
+
**O `subtask_prompt` deve ser auto-suficiente**
|
|
182
|
+
|
|
183
|
+
O subagente recebe **apenas** o `subtask_prompt` + snippets de 2000 chars dos pais. Inclua:
|
|
184
|
+
|
|
185
|
+
- Caminho exato dos arquivos a criar/modificar
|
|
186
|
+
- Assinaturas exatas das funções/endpoints (`fn name(params: T) -> R`)
|
|
187
|
+
- Schema de request/response com tipos
|
|
188
|
+
- Validações específicas (não "validar input" — `email: regex`, `senha: ≥ 8 chars + maiúscula + dígito`)
|
|
189
|
+
- Edge cases enumerados (input vazio, duplicado, expirado, sem permissão)
|
|
190
|
+
- Lista de testes esperados com nome + comportamento
|
|
191
|
+
|
|
192
|
+
**A `spec_file` deve ter Definition of Done anti-stub:**
|
|
193
|
+
|
|
194
|
+
```markdown
|
|
195
|
+
## Definition of Done (ANTI-STUB)
|
|
196
|
+
|
|
197
|
+
- [ ] Nenhum `TODO`, `FIXME`, `XXX` ou `HACK` em arquivos modificados
|
|
198
|
+
- [ ] Nenhuma função vazia (`fn x() {}`, `def x(): pass`, `function x() {}`)
|
|
199
|
+
- [ ] Nenhum `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `NotImplementedError`
|
|
200
|
+
- [ ] Nenhum `return null` / `return undefined` / `return {}` como única statement de função pública
|
|
201
|
+
- [ ] Mocks **somente** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`
|
|
202
|
+
- [ ] Endpoints retornam dados reais (não fixos / hardcoded)
|
|
203
|
+
- [ ] Cada validação produz erro real com status code correto (testado)
|
|
204
|
+
- [ ] Cada edge case tem teste unitário/integração
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Verificação:** o agente vai rodar `dare review <id>` antes de DONE. Falhou → volta pra revisão.
|
|
208
|
+
|
|
209
|
+
**Sinais de spec rasa:**
|
|
210
|
+
|
|
211
|
+
- ❌ "Implementar X" — sem assinatura, sem retorno, sem validações
|
|
212
|
+
- ❌ "Tratar erros adequadamente" — quais erros?
|
|
213
|
+
- ❌ "Adicionar validações" — quais regras?
|
|
214
|
+
- ✅ "Implementar `POST /auth/login` retornando `{ token, refresh }` com 200/401/429"
|
|
215
|
+
|
|
175
216
|
### Passo 6: Validar consistência
|
|
176
217
|
|
|
177
218
|
Antes de entregar, confirme:
|
|
@@ -85,16 +85,57 @@ Execute **todos** antes de marcar a task como DONE. Se qualquer um falhar, leia
|
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
|
-
## 7.
|
|
88
|
+
## 7. PADRÕES PROIBIDOS (ANTI-STUB / ANTI-MOCK)
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
> Esta seção é **inegociável**. O comando `dare review` (v2.17+) escaneia o código modificado por esta task e reprova se encontrar qualquer padrão abaixo.
|
|
91
|
+
|
|
92
|
+
### Em código de produção (qualquer arquivo **fora** de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`)
|
|
93
|
+
|
|
94
|
+
- ❌ **TODO / FIXME / XXX / HACK** — qualquer um desses marcadores em comentário
|
|
95
|
+
- ❌ **Função vazia** — `fn x() {}`, `function x() {}`, `def x(): pass`, `def x(): ...`
|
|
96
|
+
- ❌ **Stub explícito** — `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `raise NotImplementedError`
|
|
97
|
+
- ❌ **Retorno-fantasma** — `return null` / `return undefined` / `return {}` / `return []` como **única** statement de função pública declarada nesta task
|
|
98
|
+
- ❌ **Mocks fora de testes** — `jest.fn()`, `sinon.stub()`, `mockReturnValue`, dados hardcoded fingindo ser do banco, fixtures injetadas em controllers/services
|
|
99
|
+
- ❌ **Comentário de placeholder** — `// implement later`, `# placeholder`, `// stub`, `// FIXME implement`
|
|
100
|
+
|
|
101
|
+
### Mocks são permitidos APENAS em
|
|
102
|
+
|
|
103
|
+
- Arquivos de teste (`*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/`)
|
|
104
|
+
- Seeds / fixtures dentro de `database/seeders/`, `tests/fixtures/`
|
|
105
|
+
- Helpers explicitamente marcados como auxiliares de teste
|
|
106
|
+
|
|
107
|
+
### Verificação automática
|
|
108
|
+
|
|
109
|
+
Antes de marcar a task como DONE, rode:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
dare review <task-id>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Output esperado:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
✅ task-XYZ: nenhum padrão proibido detectado em N arquivos modificados.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Se a review falhar, a task **não pode** ir para DONE — corrija os achados e re-rode.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 8. CRITÉRIOS DE DONE
|
|
126
|
+
|
|
127
|
+
- [ ] Todos os 4 validation gates passaram sem erros (build + test + lint + audit)
|
|
128
|
+
- [ ] Testes cobrem caminho feliz + erros enumerados + edge cases da seção 4
|
|
92
129
|
- [ ] Considerações de segurança da seção 5 todas checadas
|
|
93
130
|
- [ ] Arquivos listados na seção 3 criados/modificados conforme spec
|
|
131
|
+
- [ ] **`dare review <task-id>` passou** (seção 7 — sem stubs, mocks, TODOs)
|
|
132
|
+
- [ ] Cada validação declarada na spec tem teste demonstrando o erro real (não placeholder)
|
|
133
|
+
- [ ] Cada edge case enumerado tem teste cobrindo
|
|
134
|
+
- [ ] Endpoints retornam dados reais do banco/service, não hardcoded
|
|
94
135
|
- [ ] `DARE/TASKS.md` atualizado com status `DONE`
|
|
95
136
|
|
|
96
137
|
---
|
|
97
138
|
|
|
98
|
-
##
|
|
139
|
+
## 9. PRÓXIMA TASK SUGERIDA
|
|
99
140
|
|
|
100
141
|
`[task-id]` — [título] _(desbloqueada após conclusão desta task)_
|
|
@@ -66,6 +66,62 @@ Siga o template `templates/BLUEPRINT-template.md`. Seções obrigatórias:
|
|
|
66
66
|
|
|
67
67
|
**2.11 Checklist de Aprovação** — checkboxes para o usuário revisar antes de prosseguir
|
|
68
68
|
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 🚫 ANTI-STUB CONTRACT (regra inegociável)
|
|
72
|
+
|
|
73
|
+
> **Por que existe esta seção:** o `/dare-tasks` que vem depois usa este Blueprint como **única fonte de verdade**. Se um endpoint, função ou regra ficar genérico aqui, o agente que implementar a task **será forçado a inventar** — e vai produzir mocks, stubs e esqueletos para "preencher o vazio". Detalhe agora.
|
|
74
|
+
>
|
|
75
|
+
> Tasks que produzem mock/stub/skeleton **falham** no `dare review` (introduzido na v2.17) e bloqueiam o `dare execute --complete`.
|
|
76
|
+
|
|
77
|
+
Para **cada** endpoint, função pública, evento ou job declarado no Blueprint, especifique de forma **executável**:
|
|
78
|
+
|
|
79
|
+
### Para endpoints HTTP/RPC
|
|
80
|
+
|
|
81
|
+
- **Assinatura completa:** método, path, headers obrigatórios, content-type
|
|
82
|
+
- **Request schema:** todos os campos com tipo, restrições (min/max/regex), opcionalidade
|
|
83
|
+
- **Response schema por status code:** estrutura para 2xx, 4xx, 5xx — não apenas "200 OK"
|
|
84
|
+
- **Validações server-side:** lista exaustiva de regras (`email único`, `senha ≥ 8 chars + 1 maiúscula + 1 dígito`, etc.)
|
|
85
|
+
- **Edge cases enumerados:** o que acontece com input vazio, duplicado, expirado, sem permissão, com dados inconsistentes
|
|
86
|
+
- **Side effects:** que tabelas/filas/caches/emails são tocados — em ordem
|
|
87
|
+
- **Exemplo concreto (não placeholder):** payload real, response real
|
|
88
|
+
|
|
89
|
+
### Para funções de domínio / services
|
|
90
|
+
|
|
91
|
+
- **Assinatura tipada** (`fn name(args: Types) -> ReturnType` ou equivalente)
|
|
92
|
+
- **Pré-condições** verificáveis (estado obrigatório do banco/cache/etc.)
|
|
93
|
+
- **Pós-condições** verificáveis (o que muda no sistema após retornar OK)
|
|
94
|
+
- **Estados de erro** com tipo de exceção/Result/Either esperado
|
|
95
|
+
- **Comportamento em concorrência** quando relevante (idempotência, locking, retry)
|
|
96
|
+
|
|
97
|
+
### Para jobs / event handlers / workers
|
|
98
|
+
|
|
99
|
+
- **Trigger:** evento, cron, fila — incluir o **nome canônico**
|
|
100
|
+
- **Payload schema** com tipos
|
|
101
|
+
- **Retry policy** (backoff, max attempts, DLQ)
|
|
102
|
+
- **Idempotência:** chave + estratégia
|
|
103
|
+
- **SLA / timeout**
|
|
104
|
+
|
|
105
|
+
### Para modelos de dados
|
|
106
|
+
|
|
107
|
+
- Cada campo: tipo, nullable, default, constraints (unique, fk, check), índices
|
|
108
|
+
- Triggers ou hooks (soft-delete, audit, encryption-at-rest)
|
|
109
|
+
- Estado inicial / seed obrigatório (se aplicável)
|
|
110
|
+
|
|
111
|
+
### Critério de "Blueprint detalhado o suficiente"
|
|
112
|
+
|
|
113
|
+
Antes de salvar, valide internamente — se a resposta a **qualquer** pergunta abaixo for "não", o Blueprint ainda está raso e precisa ser expandido:
|
|
114
|
+
|
|
115
|
+
- [ ] Para cada endpoint, um humano não-familiarizado consegue escrever request/response sem perguntar nada?
|
|
116
|
+
- [ ] Para cada função pública, está claro **o que retorna** em todos os caminhos (sucesso + erros enumerados)?
|
|
117
|
+
- [ ] Edge cases foram **enumerados** ou só listados como "tratar edge cases"?
|
|
118
|
+
- [ ] Cada validação tem uma regra concreta (não "validar email" — `^[a-z0-9._%+-]+@...`)?
|
|
119
|
+
- [ ] Cada decisão arquitetural tem **justificativa** (não só "escolhemos X")?
|
|
120
|
+
|
|
121
|
+
**Anti-padrão a evitar:** seções como _"implementar autenticação"_ ou _"validar dados"_ — isso vai virar stub. Especifique **qual** algoritmo, **quais** campos, **quais** regras.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
69
125
|
### 3. Salvar e aguardar aprovação humana
|
|
70
126
|
|
|
71
127
|
Salve `DARE/BLUEPRINT.md` e informe:
|
|
@@ -65,6 +65,47 @@ tasks:
|
|
|
65
65
|
- Cadeia linear é antipattern
|
|
66
66
|
- `complexity` honesta
|
|
67
67
|
|
|
68
|
+
### 3.1 ANTI-STUB CONTRACT (inegociável)
|
|
69
|
+
|
|
70
|
+
> Tasks geradas com `subtask_prompt` ou spec genéricos forçam o agente a inventar — e ele vai produzir mock, stub ou esqueleto. **Não é negociável**. O comando `dare review <task-id>` (v2.17+) detecta isso e marca a task como FAILED.
|
|
71
|
+
|
|
72
|
+
Cada `subtask_prompt` e `EXECUTION/task-<id>.md` deve atender este contrato:
|
|
73
|
+
|
|
74
|
+
**O `subtask_prompt` deve ser auto-suficiente**
|
|
75
|
+
|
|
76
|
+
O subagente recebe **apenas** o `subtask_prompt` + snippets de 2000 chars dos pais. Tudo que ele precisa para implementar **sem inventar** deve estar ali ou na `spec_file`. Inclua:
|
|
77
|
+
|
|
78
|
+
- Caminho exato dos arquivos a criar/modificar
|
|
79
|
+
- Assinaturas exatas das funções/endpoints (`fn name(params: T) -> R`)
|
|
80
|
+
- Schema de request/response com tipos
|
|
81
|
+
- Validações específicas (não "validar input" — `email: regex /^.../`, `senha: ≥ 8 chars + 1 maiúscula + 1 dígito`)
|
|
82
|
+
- Edge cases enumerados (input vazio, duplicado, expirado, sem permissão)
|
|
83
|
+
- Lista de testes esperados com nome + comportamento
|
|
84
|
+
|
|
85
|
+
**A `spec_file` (`EXECUTION/task-<id>.md`) deve ter Definition of Done anti-stub:**
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
## Definition of Done (ANTI-STUB)
|
|
89
|
+
|
|
90
|
+
- [ ] Nenhum `TODO`, `FIXME`, `XXX` ou `HACK` em arquivos modificados
|
|
91
|
+
- [ ] Nenhuma função vazia (`fn x() {}`, `def x(): pass`, `function x() {}`)
|
|
92
|
+
- [ ] Nenhum `throw new Error('not implemented')`, `unimplemented!()`, `todo!()`, `NotImplementedError`
|
|
93
|
+
- [ ] Nenhum `return null` / `return undefined` / `return {}` como única statement de função pública
|
|
94
|
+
- [ ] Mocks **somente** dentro de `*.test.*`, `*.spec.*`, `__tests__/`, `tests/`, `spec/` — NUNCA em código de produção
|
|
95
|
+
- [ ] Todos os endpoints declarados na seção 3 retornam dados reais (não fixos / hardcoded)
|
|
96
|
+
- [ ] Cada validação da spec produz erro real com status code correto (testado)
|
|
97
|
+
- [ ] Cada edge case da spec tem teste unitário ou integração demonstrando comportamento
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Verificação automatizável:** o agente vai rodar `dare review <id>` antes de marcar DONE. Se a review falhar, a task volta para revisão.
|
|
101
|
+
|
|
102
|
+
**Sinais de spec rasa** (auto-validar antes de salvar):
|
|
103
|
+
|
|
104
|
+
- ❌ "Implementar X" — sem assinatura, sem retorno, sem validações
|
|
105
|
+
- ❌ "Tratar erros adequadamente" — quais erros? como? que código?
|
|
106
|
+
- ❌ "Adicionar validações" — quais regras?
|
|
107
|
+
- ✅ "Implementar `POST /auth/login` retornando `{ token: string, refresh: string }` com 200 se credenciais válidas, 401 se inválidas, 429 se rate limit"
|
|
108
|
+
|
|
68
109
|
### 4. Validar consistência com `EXECUTION/task-*.md`
|
|
69
110
|
|
|
70
111
|
Se uma spec existe em `DARE/EXECUTION/task-<id>.md`:
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# /dare-dag-viz — Visualizar DAG com Excalidraw
|
|
2
|
+
|
|
3
|
+
Gera diagrama interativo `.excalidraw` a partir do `dare-dag.yaml` atual, com cores semânticas por complexidade e status visual das tasks.
|
|
4
|
+
|
|
5
|
+
## O que faz
|
|
6
|
+
|
|
7
|
+
1. **Lê** `DARE/dare-dag.yaml` (grafo de tasks + dependências)
|
|
8
|
+
2. **Mapeia** cada task para um retângulo Excalidraw com:
|
|
9
|
+
- Cor baseada em `complexity` (LOW=azul, MED=laranja, HIGH=rosa)
|
|
10
|
+
- Status visual (PENDING/RUNNING/DONE/FAILED)
|
|
11
|
+
- ID + nome da task
|
|
12
|
+
3. **Agrupa** tasks por `rank` em colunas verticais (swim lanes)
|
|
13
|
+
4. **Cria** setas para cada dependência (`depends_on`)
|
|
14
|
+
5. **Salva** em `DARE/dag-graph.excalidraw`
|
|
15
|
+
|
|
16
|
+
Output é um arquivo **editável e interativo** — abre direto em https://excalidraw.com.
|
|
17
|
+
|
|
18
|
+
## Convenções visuais
|
|
19
|
+
|
|
20
|
+
Referência: `/docs/DESIGN-TOKENS-EXCALIDRAW.md`
|
|
21
|
+
|
|
22
|
+
**Cores por complexidade:**
|
|
23
|
+
- 🔵 **Azul** (#e3f2fd) = LOW
|
|
24
|
+
- 🟠 **Laranja** (#fff3e0) = MEDIUM
|
|
25
|
+
- 🔴 **Rosa** (#fce4ec) = HIGH
|
|
26
|
+
|
|
27
|
+
**Status:**
|
|
28
|
+
- ⏳ PENDING = cinza, stroke normal
|
|
29
|
+
- ⚙️ RUNNING = azul, stroke pontilhado
|
|
30
|
+
- ✅ DONE = verde
|
|
31
|
+
- ❌ FAILED = vermelho
|
|
32
|
+
|
|
33
|
+
**Posicionamento:**
|
|
34
|
+
- Cada task ocupa 120×60px
|
|
35
|
+
- Tasks no mesmo rank ficam lado a lado (swim lane)
|
|
36
|
+
- Setas conectam dependências
|
|
37
|
+
|
|
38
|
+
## Exemplo de output
|
|
39
|
+
|
|
40
|
+
Arquivo `DARE/dag-graph.excalidraw` com estrutura:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Rank 1
|
|
44
|
+
├── task-001 (LOW, DONE)
|
|
45
|
+
├── task-002 (HIGH, PENDING)
|
|
46
|
+
|
|
47
|
+
Rank 2
|
|
48
|
+
├── task-003 (MEDIUM, RUNNING) ← depende de task-001
|
|
49
|
+
├── task-004 (LOW, PENDING) ← depende de task-001
|
|
50
|
+
|
|
51
|
+
Rank 3
|
|
52
|
+
└── task-005 (HIGH, PENDING) ← depende de task-003 e task-004
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Como usar
|
|
56
|
+
|
|
57
|
+
### Primeira vez
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
/dare-dag-viz
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Claude Code vai:
|
|
64
|
+
1. Ler `DARE/dare-dag.yaml`
|
|
65
|
+
2. Gerar JSON `.excalidraw`
|
|
66
|
+
3. Salvar em `DARE/dag-graph.excalidraw`
|
|
67
|
+
4. Output: "✅ DAG gerado — abra em https://excalidraw.com"
|
|
68
|
+
|
|
69
|
+
### Atualizar após mudanças
|
|
70
|
+
|
|
71
|
+
Sempre que você atualiza `dare-dag.yaml`:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
/dare-dag-viz
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Isso regenera o diagrama com as novas tasks/dependências.
|
|
78
|
+
|
|
79
|
+
### Abrir e editar
|
|
80
|
+
|
|
81
|
+
1. Acesse https://excalidraw.com
|
|
82
|
+
2. File → Open → selecione `DARE/dag-graph.excalidraw`
|
|
83
|
+
3. Edite livremente:
|
|
84
|
+
- Mova elementos
|
|
85
|
+
- Customize cores/textos
|
|
86
|
+
- Adicione anotações
|
|
87
|
+
4. Salve no mesmo arquivo
|
|
88
|
+
|
|
89
|
+
Dica: Se editou manualmente e quer regenerar com `dare-dag-viz` de novo, faça backup antes.
|
|
90
|
+
|
|
91
|
+
## Detalhes técnicos
|
|
92
|
+
|
|
93
|
+
### Estrutura do JSON gerado
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"elements": [
|
|
98
|
+
{
|
|
99
|
+
"id": "task-001",
|
|
100
|
+
"type": "rectangle",
|
|
101
|
+
"x": 20, "y": 20,
|
|
102
|
+
"width": 120, "height": 60,
|
|
103
|
+
"backgroundColor": "#e3f2fd",
|
|
104
|
+
"stroke": "#1976d2",
|
|
105
|
+
"text": "task-001\nSetup Auth\n[LOW]",
|
|
106
|
+
"fontSize": 12,
|
|
107
|
+
"roundness": { "type": 2, "value": 6 }
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"type": "arrow",
|
|
111
|
+
"startBinding": { "elementId": "task-001" },
|
|
112
|
+
"endBinding": { "elementId": "task-003" },
|
|
113
|
+
"stroke": "#999"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"appState": {
|
|
117
|
+
"gridMode": "grid",
|
|
118
|
+
"gridSize": 20
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Algoritmo de posicionamento
|
|
124
|
+
|
|
125
|
+
1. **Calcular ranks** — depth-first do DAG
|
|
126
|
+
```
|
|
127
|
+
rank = 1 + max(rank of dependencies)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
2. **Agrupar por rank**
|
|
131
|
+
```
|
|
132
|
+
Rank 1: [task-001, task-002]
|
|
133
|
+
Rank 2: [task-003, task-004]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
3. **Posicionar**
|
|
137
|
+
```
|
|
138
|
+
x = 20 + (taskIndex * 140)
|
|
139
|
+
y = 20 + (rank - 1) * 160
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
4. **Desenhar setas**
|
|
143
|
+
```
|
|
144
|
+
Para cada depends_on: arrow(source → target)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Campos esperados em dare-dag.yaml
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
tasks:
|
|
151
|
+
task-001:
|
|
152
|
+
name: "Setup Auth"
|
|
153
|
+
complexity: "LOW" # ← determina cor
|
|
154
|
+
rank: 1 # ← se não existir, é calculado
|
|
155
|
+
depends_on: [] # ← usada para setas
|
|
156
|
+
status: "DONE" # ← determina stroke/fill
|
|
157
|
+
subtask_prompt: "..." # ← (opcional)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Campos obrigatórios:** `name`, `complexity`
|
|
161
|
+
**Campos opcionais:** `rank` (calculado), `status` (default PENDING), `depends_on` (default [])
|
|
162
|
+
|
|
163
|
+
## Troubleshooting
|
|
164
|
+
|
|
165
|
+
### "File not found: DARE/dare-dag.yaml"
|
|
166
|
+
Certifique-se de que está em um projeto DARE. Se não, rode:
|
|
167
|
+
```bash
|
|
168
|
+
dare discover
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### "JSON inválido"
|
|
172
|
+
Valide seu `dare-dag.yaml`:
|
|
173
|
+
```bash
|
|
174
|
+
dare dag validate
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Diagrama muito grande/pequeno
|
|
178
|
+
Abra em Excalidraw e ajuste com Ctrl+Mouse ou pinch zoom.
|
|
179
|
+
|
|
180
|
+
## Próximos passos
|
|
181
|
+
|
|
182
|
+
- 🎨 Customize as cores em `docs/DESIGN-TOKENS-EXCALIDRAW.md`
|
|
183
|
+
- 📤 Exporte para PNG com botão "Export to Image" no Excalidraw
|
|
184
|
+
- 🔄 Atualize após cada `dare design` ou `dare execute`
|
|
185
|
+
- 📊 Compartilhe com stakeholders (Excalidraw é colaborativo)
|
|
186
|
+
|
|
187
|
+
## Referência de design
|
|
188
|
+
|
|
189
|
+
Ver `/docs/DESIGN-TOKENS-EXCALIDRAW.md` para detalhes de cores, fonts, tamanhos, e créditos.
|
|
190
|
+
|
|
191
|
+
## Licença
|
|
192
|
+
|
|
193
|
+
Esta skill é parte do DARE CLI e está sob AGPL v3.
|
|
194
|
+
|
|
195
|
+
Você pode usar, modificar e compartilhar — mas contribuições voltam ao DARE.
|
|
196
|
+
|
|
197
|
+
Créditos: Inspiração na [Excalidraw Diagram Skill](https://github.com/coleam00/excalidraw-diagram-skill) por Cole Medin.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Comando: /dare-refine
|
|
2
|
+
|
|
3
|
+
## Descrição
|
|
4
|
+
|
|
5
|
+
Analisa a complexidade de uma task e, quando alta, **quebra em sub-tasks menores** com escopo bem delimitado. Pode ser chamada:
|
|
6
|
+
|
|
7
|
+
- Automaticamente pela skill `dare-tasks` logo após gerar o DAG (para cada task ≥ MED)
|
|
8
|
+
- Manualmente pelo dev: `/dare-refine task-034`
|
|
9
|
+
- Após mudança de escopo: quando o BLUEPRINT mudou e uma task ficou grande demais
|
|
10
|
+
|
|
11
|
+
A camada determinística (heurística de complexidade) já é feita pelo CLI: `dare refine <id>`. Este comando adiciona a camada **semântica** — você lê a spec, decide se a quebra é necessária e, se for, produz sub-tasks coerentes.
|
|
12
|
+
|
|
13
|
+
## Quando rodar
|
|
14
|
+
|
|
15
|
+
- Logo após `/dare-tasks` para cada task com complexity HIGH no `dare-dag.yaml`
|
|
16
|
+
- Quando o dev pede explicitamente: `/dare-refine task-034`
|
|
17
|
+
- Quando você gerou uma task e ela "te parece grande" mesmo marcada MED — confie no instinto
|
|
18
|
+
|
|
19
|
+
## Como executar
|
|
20
|
+
|
|
21
|
+
### 1. Validar argumento
|
|
22
|
+
|
|
23
|
+
`$ARGUMENTS` deve ter o `task-id`. Se vazio, peça.
|
|
24
|
+
|
|
25
|
+
### 2. Rodar a camada determinística
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
dare refine $ARGUMENTS --split --format json > .dare/refine-$ARGUMENTS.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Esse JSON traz:
|
|
32
|
+
- `report.score` e `report.level` (LOW/MED/HIGH/CRITICAL)
|
|
33
|
+
- `report.signals` — explica por que pontuou alto/baixo
|
|
34
|
+
- `report.recommendsSplit` — true se HIGH ou CRITICAL
|
|
35
|
+
- `proposal.subtasks` — quebra inicial baseada em diretórios (chute coarse)
|
|
36
|
+
|
|
37
|
+
### 3. Decidir se vale quebrar
|
|
38
|
+
|
|
39
|
+
Critérios para **quebrar**:
|
|
40
|
+
|
|
41
|
+
- ✅ `recommendsSplit: true` da heurística (HIGH/CRITICAL)
|
|
42
|
+
- ✅ Mais de 6 arquivos a criar/modificar
|
|
43
|
+
- ✅ Mistura responsabilidades fortes (ex.: cria modelo + escreve controller + escreve teste + faz migration — split por camada)
|
|
44
|
+
- ✅ Toca código que outra task ainda não criou (deveria ser depois)
|
|
45
|
+
- ✅ Inclui refactor + feature nova juntos
|
|
46
|
+
- ✅ Tem keyword "pesada" (refactor, migrate, integrate) E score MED+
|
|
47
|
+
|
|
48
|
+
Critérios para **manter inteira**:
|
|
49
|
+
|
|
50
|
+
- ✅ Score LOW e até MED
|
|
51
|
+
- ✅ Todos os arquivos pertencem ao mesmo módulo/feature
|
|
52
|
+
- ✅ Cabe em uma conversa única do agente (15–60 min de trabalho efetivo)
|
|
53
|
+
|
|
54
|
+
### 4. Se decidir quebrar — produzir sub-tasks coerentes
|
|
55
|
+
|
|
56
|
+
Não use a `proposal.subtasks` da CLI sem revisão — ela agrupa por diretório, o que nem sempre faz sentido semantico. **Reagrupe por responsabilidade**:
|
|
57
|
+
|
|
58
|
+
| Eixo de split | Quando aplicar |
|
|
59
|
+
|---|---|
|
|
60
|
+
| **Por camada** | Modelo / Controller / Service / Test ficam em tasks separadas se cada um é grande |
|
|
61
|
+
| **Por endpoint** | Task original tinha 4 endpoints REST → 4 sub-tasks de 1 endpoint cada |
|
|
62
|
+
| **Por feature** | Auth tinha "register + login + refresh + logout" → split por verbo |
|
|
63
|
+
| **Refactor + feature** | Quebra em "1. refactor X para preparar terreno" + "2. adiciona feature Y em cima" |
|
|
64
|
+
| **Migration + código** | "1. migration + seeds" + "2. código que usa o novo schema" |
|
|
65
|
+
|
|
66
|
+
Cada sub-task deve:
|
|
67
|
+
|
|
68
|
+
- Ter `subtask_prompt` auto-suficiente (assinaturas exatas, validações, edge cases — o Anti-Stub Contract aplica)
|
|
69
|
+
- Ter spec_file própria em `DARE/EXECUTION/<sub-id>.md`
|
|
70
|
+
- Ter `depends_on` mínimo mas correto (sub-tasks da mesma família geralmente dependem em ordem)
|
|
71
|
+
- Ter complexity honesta — se a sub ainda ficar HIGH, quebra de novo
|
|
72
|
+
|
|
73
|
+
### 5. Emitir verdito + plano
|
|
74
|
+
|
|
75
|
+
Salve em `.dare/refine-verdict-$ARGUMENTS.json`:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"manageable": false,
|
|
80
|
+
"reasons": [
|
|
81
|
+
"Score 18 (HIGH) — 7 endpoints + migration + 12 testes no mesmo escopo",
|
|
82
|
+
"Mistura refactor de service layer com novos endpoints"
|
|
83
|
+
],
|
|
84
|
+
"proposedSubtasks": [
|
|
85
|
+
{
|
|
86
|
+
"id": "task-034a",
|
|
87
|
+
"title": "Refactor UserService para suportar profile_settings",
|
|
88
|
+
"files": ["src/services/UserService.ts", "tests/services/UserService.test.ts"],
|
|
89
|
+
"rationale": "Refactor isolado antes da feature — gates passam sem mexer em controllers",
|
|
90
|
+
"estimatedLevel": "MED"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "task-034b",
|
|
94
|
+
"title": "Endpoints GET/PATCH /users/me/profile",
|
|
95
|
+
"files": ["src/controllers/profile.ts", "tests/controllers/profile.test.ts"],
|
|
96
|
+
"rationale": "Endpoints novos consumindo o serviço refatorado",
|
|
97
|
+
"estimatedLevel": "MED"
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Se a task **é** manuseável (não precisa quebrar):
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"manageable": true,
|
|
108
|
+
"reasons": ["Score 7 (MED), 4 arquivos no mesmo módulo, 6 testes — cabe em uma conversa"]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 6. Aplicar o split
|
|
113
|
+
|
|
114
|
+
Se quebrou:
|
|
115
|
+
|
|
116
|
+
1. **Edite** `DARE/dare-dag.yaml` substituindo a task original pelas sub-tasks
|
|
117
|
+
2. **Crie** as specs novas em `DARE/EXECUTION/<sub-id>.md` (use `templates/TASK-SPEC-template.md` — seguindo o Anti-Stub Contract!)
|
|
118
|
+
3. **Atualize** `DARE/TASKS.md` (visão humana) refletindo a quebra
|
|
119
|
+
4. **Regenere** o Mermaid: `dare dag viz -o DARE/dag-graph.mmd`
|
|
120
|
+
5. **Marque** a task original como SPLIT (não deletar — preservar histórico) ou remover e referenciar no header das sub-tasks
|
|
121
|
+
|
|
122
|
+
### 7. Mensagem ao usuário
|
|
123
|
+
|
|
124
|
+
Se manteve inteira:
|
|
125
|
+
> ✅ Task `$ARGUMENTS` está bem-dimensionada (score X, level Y). Sem split necessário.
|
|
126
|
+
|
|
127
|
+
Se quebrou:
|
|
128
|
+
> 🪓 Task `$ARGUMENTS` quebrada em N sub-task(s):
|
|
129
|
+
> - `<id>a`: <título>
|
|
130
|
+
> - `<id>b`: <título>
|
|
131
|
+
> ...
|
|
132
|
+
>
|
|
133
|
+
> Specs criadas em `DARE/EXECUTION/`. Revise antes de executar:
|
|
134
|
+
> ```bash
|
|
135
|
+
> dare validate # verifica DAG
|
|
136
|
+
> dare dag viz # confirma grafo
|
|
137
|
+
> dare execute --next # roda a primeira sub-task pronta
|
|
138
|
+
> ```
|
|
139
|
+
|
|
140
|
+
## Regras inegociáveis
|
|
141
|
+
|
|
142
|
+
- **Não quebre tasks LOW** — overhead não vale a pena
|
|
143
|
+
- **Não invente dependências** — sub-tasks da mesma família frequentemente são sequenciais, não falsamente paralelas
|
|
144
|
+
- **Cada sub-task precisa ser independentemente testável** — se você precisa rodar A para testar B, A precisa ser parent de B no DAG
|
|
145
|
+
- **Anti-Stub Contract aplica em cada sub-task** — não relaxa critérios só porque é menor
|