@tavaressan/vetor 0.1.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 +42 -0
- package/bin/vetor.js +6 -0
- package/lib/banner.js +35 -0
- package/lib/commands/install.js +71 -0
- package/lib/commands/status.js +59 -0
- package/lib/commands/uninstall.js +119 -0
- package/lib/commands/update.js +63 -0
- package/lib/installer/command-exists.js +30 -0
- package/lib/installer/cursor-hooks.js +181 -0
- package/lib/installer/detector.js +79 -0
- package/lib/installer/manifest.js +76 -0
- package/lib/installer/prompts.js +97 -0
- package/lib/installer/writer.js +382 -0
- package/lib/router.js +50 -0
- package/package.json +39 -0
- package/templates/.gitkeep +0 -0
- package/templates/agents/code-review/agent.json +27 -0
- package/templates/agents/code-review/codex.toml +37 -0
- package/templates/agents/code-review.md +99 -0
- package/templates/agents/issue-worker/agent.json +33 -0
- package/templates/agents/issue-worker/codex.toml +57 -0
- package/templates/agents/issue-worker.md +112 -0
- package/templates/hooks/hooks-codex.json +48 -0
- package/templates/hooks/hooks.json +62 -0
- package/templates/opencode/agent/code-review.md +73 -0
- package/templates/opencode/agent/issue-coordinator.md +521 -0
- package/templates/opencode/agent/issue-worker.md +64 -0
- package/templates/opencode/mcp.jsonc +39 -0
- package/templates/opencode/plugin/vetor.ts +207 -0
- package/templates/opencode/scripts/agent-registration_test.ts +92 -0
- package/templates/opencode/scripts/check-edit.ts +147 -0
- package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
- package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
- package/templates/opencode/scripts/lib/guard.ts +45 -0
- package/templates/opencode/scripts/lib/model-health.ts +133 -0
- package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
- package/templates/opencode/scripts/lib/project.ts +240 -0
- package/templates/opencode/scripts/lib/project_test.ts +45 -0
- package/templates/opencode/scripts/lib/status.ts +69 -0
- package/templates/opencode/scripts/lib/worktree.ts +41 -0
- package/templates/opencode/scripts/model-health.ts +50 -0
- package/templates/opencode/scripts/model-health_test.ts +80 -0
- package/templates/opencode/scripts/resolve-model.ts +112 -0
- package/templates/opencode/scripts/resolve-model_test.ts +185 -0
- package/templates/opencode/scripts/safety-check.ts +203 -0
- package/templates/opencode/scripts/vetor-checks.sh +217 -0
- package/templates/opencode/scripts/vetor-status.sh +99 -0
- package/templates/skills/architecture-review/SKILL.md +187 -0
- package/templates/skills/backlog-ideator/SKILL.md +277 -0
- package/templates/skills/design/SKILL.md +468 -0
- package/templates/skills/design/examples/design-contract-example.md +46 -0
- package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
- package/templates/skills/fix-loop-agent/SKILL.md +255 -0
- package/templates/skills/guardian/SKILL.md +343 -0
- package/templates/skills/issue-coordinator/SKILL.md +596 -0
- package/templates/skills/retro/SKILL.md +156 -0
- package/templates/skills/shared/references/agent-status.template.md +68 -0
- package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
- package/templates/skills/shared/references/conflict-resolution.md +94 -0
- package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
- package/templates/skills/shared/references/design-vocabulary.md +508 -0
- package/templates/skills/shared/references/evidence-state.md +365 -0
- package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
- package/templates/skills/shared/references/grilling-conventions.md +64 -0
- package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
- package/templates/skills/shared/references/mcp-availability.md +104 -0
- package/templates/skills/shared/references/module-test-map.template.md +72 -0
- package/templates/skills/shared/references/planning-conventions.md +97 -0
- package/templates/skills/shared/references/project-conventions.md +63 -0
- package/templates/skills/shared/references/tdd-conventions.md +81 -0
- package/templates/skills/shared/references/touched-files-cache.md +30 -0
- package/templates/skills/spec/SKILL.md +524 -0
- package/templates/skills/spec-validate/SKILL.md +195 -0
- package/templates/skills/spec-validate/references/traceability.md +169 -0
- package/templates/skills/stack-practices/SKILL.md +151 -0
- package/templates/skills/vetor/SKILL.md +174 -0
- package/templates/skills/worktree-create/SKILL.md +142 -0
- package/templates/skills/worktree-ship/SKILL.md +394 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec
|
|
3
|
+
description: Gera uma Spec estruturada (RF/RNF, Acceptance Criteria, Edge Cases, Non-Goals) a partir de um tema, ancorada no contexto descoberto no próprio projeto (README, docs, ADRs, Specs existentes, código, configuração do Vetor).
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.4.0"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é a skill de geração de Specs do Vetor. Sua missão é descobrir o contexto já existente no
|
|
12
|
+
projeto, decompor requisitos grandes em componentes, esclarecer o que faltar com uma entrevista
|
|
13
|
+
focada e, a partir disso, redigir um rascunho de Spec estruturada — descrevendo comportamento, não
|
|
14
|
+
implementação — usando `$SKILL_DIR/../../templates/spec.md` como esqueleto.
|
|
15
|
+
|
|
16
|
+
Esta skill ainda não cobre todo o pipeline de #202: implementa a entrada, a descoberta de contexto
|
|
17
|
+
(via Knowledge Provider quando disponível, com fallback para filesystem direto), a decomposição em
|
|
18
|
+
componentes, a entrevista focada, o motor de geração de RF/RNF/Acceptance Criteria/Edge Cases/
|
|
19
|
+
Non-Goals, a montagem do rascunho a partir do template e a persistência (frontmatter válido,
|
|
20
|
+
identidade estável, path previsível em `docs/specs/<slug>.md` por padrão, overwrite nunca silencioso
|
|
21
|
+
— sempre `update`/`create-new`/`cancel`, ver passo 6). Validação de qualidade (Quality Gate,
|
|
22
|
+
rastreabilidade — Handoff #203) chega em outra issue; overwrite avançado (versionamento, merge de
|
|
23
|
+
rascunhos) chega em outra; Obsidian como Knowledge Provider chega em outra (issue #225); consumo
|
|
24
|
+
automático da Spec pelo `issue-coordinator` (geração de código) não é escopo desta skill — cada
|
|
25
|
+
estágio abaixo sinaliza explicitamente o que ainda não está implementado.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Sintaxe
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/vetor:spec
|
|
33
|
+
/vetor:spec <tema>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- `<tema>`: opcional — o assunto a especificar (ex.: "sistema de autenticação", "melhorar fluxo de
|
|
37
|
+
checkout", "API de notificações").
|
|
38
|
+
- Se omitido, rode o passo 1 **sem filtro de palavra-chave** (visão geral do projeto — categorias 1
|
|
39
|
+
a 5 e 7), proponha um tema a partir do que foi encontrado e confirme com o usuário antes de seguir
|
|
40
|
+
para o passo 2. Se nada relevante for encontrado, pergunte objetivamente ao usuário qual tema
|
|
41
|
+
especificar (uma pergunta direta, não uma entrevista). Só depois de o tema estar definido — por
|
|
42
|
+
argumento ou por confirmação — aplique o filtro por palavra-chave da categoria 6.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Referências
|
|
47
|
+
|
|
48
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
49
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
50
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
|
|
51
|
+
> ```bash
|
|
52
|
+
> SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
|
|
53
|
+
> ```
|
|
54
|
+
> e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
|
|
55
|
+
|
|
56
|
+
- `$SKILL_DIR/../../templates/spec.md` — esqueleto da Spec usado no passo 5.
|
|
57
|
+
- `../shared/references/planning-conventions.md` — §3 ("Regra das 3
|
|
58
|
+
perguntas"), base da entrevista focada do passo 4 e aplicável também quando o tema (Sintaxe)
|
|
59
|
+
precisar de uma pergunta direta ao usuário.
|
|
60
|
+
- `../shared/references/delegate-to-runtime.md` — uso opcional de um
|
|
61
|
+
runtime externo disponível (Gemini/OpenCode/Codex) para resumir documentação extensa encontrada no
|
|
62
|
+
passo 1 (mesmo critério de `backlog-ideator`: acima de ~80 linhas, delegue o resumo em vez de ler
|
|
63
|
+
tudo nativamente).
|
|
64
|
+
- `../shared/references/knowledge-provider-contract.md` — contrato do
|
|
65
|
+
Knowledge Provider consumido pelos passos 0.2, 1 (item 5) e 4 via `scripts/knowledge-doc.ts`.
|
|
66
|
+
- `../../scripts/knowledge-doc.ts` — CLI que expõe `status`/`search-specs`/
|
|
67
|
+
`create-spec`/`update-spec`/`find` sobre o Knowledge Provider (ver passo 0.2).
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Comportamento
|
|
72
|
+
|
|
73
|
+
### 0 — Triagem de complexidade e Knowledge Provider
|
|
74
|
+
|
|
75
|
+
**0.1 — Triagem de complexidade**
|
|
76
|
+
|
|
77
|
+
Antes de investir no fluxo completo (passos 1-6), classifique o `<tema>` já confirmado (ver Sintaxe)
|
|
78
|
+
em um de três níveis de processo — vocabulário adaptado dos níveis Spike/Bounded/Architectural da
|
|
79
|
+
skill `brainstorming` do superpowers (`obra/superpowers`, MIT) ao vocabulário do Vetor:
|
|
80
|
+
|
|
81
|
+
| Nível | Critério | O que muda no fluxo |
|
|
82
|
+
|-------|----------|----------------------|
|
|
83
|
+
| **Investigação** (Spike) | O tema é uma pergunta aberta ou exploração de viabilidade, sem uma capacidade concreta ainda decidida (ex.: "investigar como resolver X", "viabilidade de Y") — não há o que decompor nem um "sim/não" que baste virar Acceptance Criteria. | Rode o passo 1 (Context Discovery) normalmente para levantar o que já existe, mas **não gere o rascunho do passo 5 ainda**. Pare após o passo 2 e pergunte ao usuário se deseja (a) prosseguir mesmo assim, aceitando lacunas amplas (`⚠️ ABERTO` na maioria das seções), (b) tratar como Confirmação rápida assim que a decisão estiver mais clara, ou (c) encerrar aqui — investigação registrada, sem Spec gerada. |
|
|
84
|
+
| **Confirmação rápida** (Bounded) | O tema já é uma capacidade atômica — mesmo critério de "tema grande" do passo 3, mas na negativa (nenhum sinal de múltiplos fluxos/personas/fronteiras) — e o contexto do passo 1 tende a bastar com poucas perguntas. | Pule o passo 3 (Decomposição, que já se aplicaria a temas atômicos) e resolva o passo 4 (Entrevista) com o mínimo de perguntas necessário — a "confirmação rápida de 2-3 pontos" é o limite de 3 perguntas já imposto ao passo 4. Siga direto ao passo 5 para um rascunho enxuto. |
|
|
85
|
+
| **Spec completa** (Architectural) | O tema apresenta qualquer sinal de "tema grande" do passo 3 (múltiplos fluxos, múltiplas personas, capacidades separáveis, fronteiras/dependências entre partes). | Fluxo padrão, sem atalho: passos 1-6 completos, incluindo decomposição (passo 3) e entrevista por componente (passo 4). |
|
|
86
|
+
|
|
87
|
+
Registre a classificação escolhida (1 linha, com a razão) antes de seguir para o passo 1 — não decida
|
|
88
|
+
silenciosamente. Se a classificação for ambígua entre dois níveis, prefira o nível mais alto (mais
|
|
89
|
+
rigor, nunca menos, na dúvida) e registre a ambiguidade em `Open Questions` no rascunho (passo 5.6).
|
|
90
|
+
|
|
91
|
+
Esta triagem é interna ao fluxo de geração da Spec — decide **quanto** processo aplicar aqui dentro
|
|
92
|
+
depois que o usuário já pediu uma Spec. Uma triagem equivalente, mas orientada a decidir **se** uma
|
|
93
|
+
Spec é necessária antes do dispatch de implementação, acontece em `issue-coordinator` Fase 2 (gate de
|
|
94
|
+
Spec/design) — ver `wiki/Arquitetura.md` e `wiki/Decisoes-de-Design.md`. As duas são independentes:
|
|
95
|
+
esta skill nunca é invocada automaticamente por aquele gate, que apenas sinaliza a ausência de Spec.
|
|
96
|
+
|
|
97
|
+
**0.2 — Knowledge Provider**
|
|
98
|
+
|
|
99
|
+
A busca por Specs relacionadas (passo 1, item 5) e a persistência (passo 6) são feitas através de um
|
|
100
|
+
**Knowledge Provider** — uma fonte de conhecimento do projeto, abstrata por design:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
Knowledge Provider
|
|
104
|
+
├── filesystem (implementado — via scripts/knowledge-doc.ts)
|
|
105
|
+
├── obsidian (issue #225, ainda não implementado neste código)
|
|
106
|
+
└── future providers
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Antes do passo 1, rode:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" status
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
- `{"enabled": true, ...}` (default quando `.claude/vetor/config.json` não define `knowledge`, ou
|
|
116
|
+
define `knowledge.enabled` diferente de `false`) → use o Knowledge Provider nos passos 1 (item 5) e
|
|
117
|
+
4 conforme descrito abaixo.
|
|
118
|
+
- `{"enabled": false, ...}` (`knowledge.enabled: false` explícito) → **fallback**: ignore o provider
|
|
119
|
+
em todo o fluxo — descoberta do item 5 vira busca direta por `grep`/`find` em `docs/specs/**/*.md`
|
|
120
|
+
(como nas demais categorias do passo 1) e o passo 6 não persiste nada em disco (apenas apresenta o
|
|
121
|
+
rascunho, como nesta skill antes desta integração).
|
|
122
|
+
|
|
123
|
+
A skill nunca assume nem referencia Obsidian diretamente em nenhum ponto do fluxo — o CLI sempre usa
|
|
124
|
+
`FilesystemKnowledgeProvider` hoje; quando `ObsidianKnowledgeProvider` existir (#225), a mudança fica
|
|
125
|
+
isolada em `scripts/knowledge-doc.ts`, sem alterar os passos abaixo.
|
|
126
|
+
|
|
127
|
+
### 1 — Context Discovery
|
|
128
|
+
|
|
129
|
+
Antes de gerar qualquer rascunho, procure contexto no projeto **nesta ordem de prioridade**. Em toda
|
|
130
|
+
busca por arquivo (`find`/`grep`), exclua sempre
|
|
131
|
+
`.claude/worktrees/*`, `node_modules/`, `target/`, `build/`, `dist/`, `.venv/`, `__pycache__/`.
|
|
132
|
+
|
|
133
|
+
Se `<tema>` já foi informado (ou já foi confirmado com o usuário — ver Sintaxe), use-o para filtrar
|
|
134
|
+
a categoria 6 e para julgar a relevância do conteúdo lido nas demais. **Se `<tema>` ainda não existe**
|
|
135
|
+
(invocação sem argumento, primeira passada), rode as categorias 1 a 5 e 7 **sem filtro** — como
|
|
136
|
+
levantamento geral do projeto — para propor um tema; a categoria 6 (código por palavra-chave) só se
|
|
137
|
+
aplica depois que o tema estiver definido.
|
|
138
|
+
|
|
139
|
+
1. **Documentação existente do Vetor:** `.claude/vetor/docs/**/*.md`
|
|
140
|
+
2. **README:** `README.md` na raiz do projeto
|
|
141
|
+
3. **Arquitetura:** `ARCHITECTURE.md`, `docs/architecture/**`, ou qualquer `docs/*.md` cujo conteúdo
|
|
142
|
+
trate de arquitetura
|
|
143
|
+
4. **ADRs:** `docs/adr/**`, `docs/decisions/**`, ou arquivos que casem com `*ADR*.md`
|
|
144
|
+
5. **Specs existentes:** se o Knowledge Provider estiver habilitado (passo 0.2), rode
|
|
145
|
+
`deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" search-specs "<tema>"` — a busca
|
|
146
|
+
prévia por Specs relacionadas antes de gerar uma nova; senão, `grep`/`find` direto em
|
|
147
|
+
`docs/specs/**/*.md`. Em ambos os casos, o objetivo é o mesmo: evitar duplicar uma Spec já criada
|
|
148
|
+
para o mesmo tema
|
|
149
|
+
6. **Código relevante:** busque por palavras-chave do tema (já definido) nos módulos indicados por
|
|
150
|
+
`.claude/vetor/module-test-map.md` (se existir)
|
|
151
|
+
7. **Configuração do Vetor:** `.claude/vetor/config.json`, `.claude/vetor/module-test-map.md`,
|
|
152
|
+
`.claude/rules/vetor/*.md`
|
|
153
|
+
8. **Contexto fornecido diretamente pelo usuário:** qualquer detalhe já dado na mensagem atual ou em
|
|
154
|
+
resposta a uma pergunta feita por esta skill
|
|
155
|
+
|
|
156
|
+
Para cada categoria, registre o que foi encontrado (arquivo + trecho relevante) ou, explicitamente,
|
|
157
|
+
que nada foi encontrado — uma categoria vazia deve aparecer no relatório do passo 2 como vazia, nunca
|
|
158
|
+
ser omitida silenciosamente. Se um arquivo encontrado passar de ~80 linhas, resuma-o (nativamente ou
|
|
159
|
+
via runtime de delegação disponível, ver Referências) em vez de reproduzi-lo inteiro.
|
|
160
|
+
|
|
161
|
+
### 2 — Reportar o contexto encontrado
|
|
162
|
+
|
|
163
|
+
**Antes de redigir qualquer rascunho de Spec**, apresente o resultado da descoberta. Quando o tema
|
|
164
|
+
ainda não estiver confirmado (levantamento geral do passo 1), use `"(tema a confirmar — ver
|
|
165
|
+
proposta abaixo)"` no lugar de `<tema>` e liste a proposta de tema logo após o relatório, para
|
|
166
|
+
confirmação do usuário antes do passo 3 (Decomposição).
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
## Contexto encontrado para "<tema>"
|
|
170
|
+
|
|
171
|
+
1. Documentação do Vetor: <arquivo(s) + trecho | "nenhuma encontrada">
|
|
172
|
+
2. README: <trecho relevante | "nenhum README encontrado">
|
|
173
|
+
3. Arquitetura: <arquivo(s) + trecho | "nenhuma encontrada">
|
|
174
|
+
4. ADRs: <arquivo(s) + trecho | "nenhum ADR encontrado">
|
|
175
|
+
5. Specs existentes: <arquivo(s) + trecho | "nenhuma Spec existente para este tema">
|
|
176
|
+
6. Código relevante: <arquivo(s)/módulo(s) | "nenhum código relevante localizado">
|
|
177
|
+
7. Configuração do Vetor: <achado | "sem configuração relevante">
|
|
178
|
+
8. Contexto fornecido pelo usuário: <resumo | "nenhum">
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Se a Spec existente do item 5 já cobrir o mesmo tema, pare aqui e pergunte ao usuário se deseja
|
|
182
|
+
atualizar a existente em vez de gerar uma nova (não decida por conta própria) — use o mecanismo de
|
|
183
|
+
pergunta disponível (`AskUserQuestion` em modo interativo; texto livre em modo headless, ver passo 6
|
|
184
|
+
para o vocabulário exato de opções). Este é um aviso antecipado baseado em busca textual (pode
|
|
185
|
+
falsear por tema parecido, mas não idêntico); a checagem definitiva — por identidade exata
|
|
186
|
+
(`spec:<slug>`) — acontece no passo 6, na hora de persistir.
|
|
187
|
+
|
|
188
|
+
### 3 — Decomposição em componentes
|
|
189
|
+
|
|
190
|
+
Antes de entrevistar ou redigir qualquer rascunho, avalie se o tema é **grande** o bastante para
|
|
191
|
+
exigir decomposição. Um tema é grande quando o contexto do passo 1-2 sustenta **mais de uma**
|
|
192
|
+
capacidade independente — sinal disso é a presença de qualquer um destes:
|
|
193
|
+
|
|
194
|
+
- mais de um fluxo de usuário essencialmente distinto (ex.: "entrar" vs. "recuperar senha");
|
|
195
|
+
- mais de uma persona com necessidades diferentes;
|
|
196
|
+
- capacidades que poderiam ser entregues, testadas ou desativadas de forma separada;
|
|
197
|
+
- dependências ou fronteiras funcionais claras entre partes do tema.
|
|
198
|
+
|
|
199
|
+
Se **nenhum** desses sinais aparecer (tema já é uma única capacidade atômica, ex.: "adicionar botão
|
|
200
|
+
de copiar no card de resultado"), pule este passo e o passo 4 — vá direto ao passo 5.
|
|
201
|
+
|
|
202
|
+
Quando o tema for grande, identifique os componentes considerando escopo, usuários/personas,
|
|
203
|
+
capacidades, critérios de aceitação, dependências e fronteiras funcionais, e apresente-os ao
|
|
204
|
+
usuário **antes de prosseguir**:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
## Decomposição proposta para "<tema>"
|
|
208
|
+
|
|
209
|
+
1. <Componente 1> — <1 frase: o que cobre>
|
|
210
|
+
2. <Componente 2> — <1 frase: o que cobre>
|
|
211
|
+
3. <Componente N> — <1 frase: o que cobre>
|
|
212
|
+
|
|
213
|
+
Confirma esta decomposição, ou deseja ajustar/reorganizar?
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Exemplo (tema "sistema de autenticação"):
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
## Decomposição proposta para "sistema de autenticação"
|
|
220
|
+
|
|
221
|
+
1. Login — autenticação de credenciais e emissão de sessão.
|
|
222
|
+
2. Recuperação de senha — fluxo de redefinição para usuário que perdeu acesso.
|
|
223
|
+
3. Sessão — manutenção, expiração e renovação do estado autenticado.
|
|
224
|
+
4. Autorização — controle de acesso a recursos após autenticação.
|
|
225
|
+
|
|
226
|
+
Confirma esta decomposição, ou deseja ajustar/reorganizar?
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
O usuário pode confirmar, pedir ajustes (adicionar/remover/renomear/fundir componentes) ou
|
|
230
|
+
reorganizar. Limite a **no máximo 2 rodadas de ajuste** após a proposta inicial — evita loop
|
|
231
|
+
infinito de refinamento. Ao atingir o limite sem confirmação explícita, prossiga com a última
|
|
232
|
+
versão da decomposição e registre a divergência residual em `Open Questions` no rascunho (passo 5),
|
|
233
|
+
em vez de insistir em mais uma rodada.
|
|
234
|
+
|
|
235
|
+
Trate cada componente confirmado como uma unidade independente para o passo 4 e para as seções de
|
|
236
|
+
`Functional Requirements` do rascunho (passo 5).
|
|
237
|
+
|
|
238
|
+
### 4 — Entrevista focada
|
|
239
|
+
|
|
240
|
+
Só entreviste quando o contexto reunido nos passos 1-3 **não** for suficiente para produzir, para
|
|
241
|
+
aquele componente (ou para o tema inteiro, se o passo 3 foi pulado), uma Spec confiável — isto é,
|
|
242
|
+
quando falta informação que mudaria de forma significativa o conteúdo do rascunho (ex.: altera um
|
|
243
|
+
Acceptance Criteria, muda um Non-Goal, ou decide um Edge Case). Nunca pergunte por completude
|
|
244
|
+
cosmética ou sobre cenário hipotético/futuro (ver `planning-conventions.md` §3, "Regra das 3
|
|
245
|
+
perguntas").
|
|
246
|
+
|
|
247
|
+
Para cada componente que precisar de entrevista, faça **no máximo 3 perguntas objetivas**,
|
|
248
|
+
priorizando nesta ordem (pare assim que tiver o suficiente — nem sempre as 3 são necessárias):
|
|
249
|
+
|
|
250
|
+
1. problema que está sendo resolvido;
|
|
251
|
+
2. resultado esperado;
|
|
252
|
+
3. escopo e não-escopo;
|
|
253
|
+
4. comportamento esperado;
|
|
254
|
+
5. casos de erro;
|
|
255
|
+
6. restrições relevantes.
|
|
256
|
+
|
|
257
|
+
Se, após 3 perguntas, ainda faltar informação para aquele componente, **não faça uma quarta
|
|
258
|
+
pergunta** — marque a lacuna como `⚠️ ABERTO: <o que falta definir>` no rascunho (passo 5), o mesmo
|
|
259
|
+
idioma já usado no restante da skill para incerteza.
|
|
260
|
+
|
|
261
|
+
### 5 — Motor de geração: montar o rascunho a partir do template
|
|
262
|
+
|
|
263
|
+
Copie a estrutura de `$SKILL_DIR/../../templates/spec.md` e preencha, a partir **apenas** do que foi encontrado ou
|
|
264
|
+
confirmado nos passos 1-4, aplicando as regras 5.1-5.5 a `Functional Requirements`,
|
|
265
|
+
`Non-Functional Requirements`, `Edge Cases` e `Non-Goals` — o núcleo do motor de geração — e 5.6 às
|
|
266
|
+
demais seções do template.
|
|
267
|
+
|
|
268
|
+
#### 5.1 — Comportamento, não implementação
|
|
269
|
+
|
|
270
|
+
Toda Spec descreve **o que** o sistema faz, nunca **como** foi construído. Evite decisão
|
|
271
|
+
tecnológica em `Functional Requirements`/`Non-Functional Requirements` quando ela não for parte do
|
|
272
|
+
próprio requisito:
|
|
273
|
+
|
|
274
|
+
```text
|
|
275
|
+
Evitar: "Utilizar Spring Boot com PostgreSQL."
|
|
276
|
+
Preferir: "O sistema deve persistir o cadastro do usuário e permitir sua recuperação posteriormente."
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
Exceção: quando a decisão tecnológica **é** o requisito (ex.: "integrar com o gateway de pagamento
|
|
280
|
+
X já contratado pela empresa" — uma restrição externa, não uma escolha de implementação livre),
|
|
281
|
+
mantenha-a no requisito. Toda decisão arquitetural/tecnológica encontrada nos passos 1-4 que não for
|
|
282
|
+
parte de um requisito vai para `## Decisions` como candidata a ADR — nunca embutida em
|
|
283
|
+
`Functional Requirements`/`Non-Functional Requirements`.
|
|
284
|
+
|
|
285
|
+
#### 5.2 — IDs estáveis (RF-/RNF-)
|
|
286
|
+
|
|
287
|
+
- Numere sequencialmente a partir de `RF-01` para requisitos funcionais e `RNF-01` para não
|
|
288
|
+
funcionais — uma sequência própria para cada prefixo, contínua por toda a Spec (não reinicia por
|
|
289
|
+
componente nem por seção).
|
|
290
|
+
- Quando o passo 3 identificou componentes, agrupe os RF-XX de cada componente sob um subtítulo com
|
|
291
|
+
o nome do componente (em vez de diluir os componentes num único bloco de requisitos), mas mantenha
|
|
292
|
+
a numeração global e sequencial — o agrupamento é só apresentação, não reinicia a sequência.
|
|
293
|
+
- IDs são estáveis: ao **refinar** uma Spec existente (nova rodada sobre um rascunho já gerado, ou
|
|
294
|
+
atualização via `create-spec`/edição manual), novos requisitos recebem o **próximo número
|
|
295
|
+
disponível**; nunca renumere um `RF-`/`RNF-` já existente para "abrir espaço" ou reordenar. Um
|
|
296
|
+
requisito removido deixa lacuna na numeração — isso é esperado e preferível a renumerar (mesmo
|
|
297
|
+
espírito de #202 §7: os IDs sustentarão futuramente `spec → requirement → task → code → test`).
|
|
298
|
+
|
|
299
|
+
#### 5.3 — Priority e Acceptance Criteria
|
|
300
|
+
|
|
301
|
+
- Toda seção de requisito usa `**Priority:** Must | Should | Could` (MoSCoW), derivada do que os
|
|
302
|
+
passos 1-4 sustentam: o que é indispensável ao Goal declarado é `Must`; o que foi mencionado como
|
|
303
|
+
desejável mas não essencial é `Should`; o que é especulativo/futuro é `Could`. Quando a prioridade
|
|
304
|
+
não puder ser inferida com confiança, prefira `Should` e registre
|
|
305
|
+
`⚠️ ABERTO: confirmar prioridade deste requisito` em `Open Questions` — nunca marque `Must` só
|
|
306
|
+
para "jogar seguro".
|
|
307
|
+
- Todo requisito `Must` tem **ao menos um** Acceptance Criteria verificável — binário, observável ou
|
|
308
|
+
com valor mensurável, nunca um adjetivo vago:
|
|
309
|
+
|
|
310
|
+
```text
|
|
311
|
+
Evitar: "O sistema deve ser rápido."
|
|
312
|
+
Preferir: "Uma solicitação válida deve receber resposta em até 500 ms em condições normais."
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Quando o contexto ou a entrevista não permitiram determinar um valor concreto, **não omita o
|
|
316
|
+
critério** — escreva-o com a lacuna explícita, no mesmo checkbox:
|
|
317
|
+
|
|
318
|
+
```text
|
|
319
|
+
- [ ] ⚠️ ABERTO: definir limite máximo aceitável para o tempo de resposta.
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
- Requisitos `Should`/`Could` têm Acceptance Criteria quando o contexto sustentar; sua ausência não
|
|
323
|
+
exige justificativa nem `⚠️ ABERTO` — a obrigatoriedade desta regra é exclusiva de `Must`.
|
|
324
|
+
|
|
325
|
+
#### 5.4 — Edge Cases (contextuais)
|
|
326
|
+
|
|
327
|
+
Avalie, para cada requisito ou componente, quais destas categorias são plausíveis no domínio da
|
|
328
|
+
Spec — **sem exigir todas em toda feature**:
|
|
329
|
+
|
|
330
|
+
```text
|
|
331
|
+
entrada inválida · ausência de dados · timeout · dependência indisponível · duplicidade ·
|
|
332
|
+
concorrência · retry · autenticação expirada · estado inconsistente
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
- Inclua em `## Edge Cases` só as categorias com relevância real para o tema (ex.: uma Spec sem
|
|
336
|
+
chamada a serviço externo não precisa tratar "dependência indisponível"); para cada categoria
|
|
337
|
+
incluída, defina o comportamento esperado — nomear o caso sem descrever o comportamento não conta
|
|
338
|
+
como tratado.
|
|
339
|
+
- Se nenhuma categoria for relevante ao tema, não deixe a seção vazia silenciosamente — escreva
|
|
340
|
+
explicitamente algo como "Nenhum edge case relevante identificado para este tema" (mesmo princípio
|
|
341
|
+
de "vazio explícito, nunca omitido" já usado no passo 2 para as categorias de contexto).
|
|
342
|
+
- Nunca preencha a seção mecanicamente com as 9 categorias só para parecer completo — isso é padding
|
|
343
|
+
irrelevante, não Edge Case relevante ao domínio.
|
|
344
|
+
|
|
345
|
+
#### 5.5 — Non-Goals (sempre explícitos)
|
|
346
|
+
|
|
347
|
+
`## Non-Goals` nunca fica vazia. Derive ao menos uma entrada de:
|
|
348
|
+
|
|
349
|
+
- componentes identificados no passo 3 mas deliberadamente fora do escopo desta Spec;
|
|
350
|
+
- decisões tecnológicas/arquiteturais encontradas nos passos 1-4 e roteadas para `## Decisions`
|
|
351
|
+
(5.1) em vez de viraram requisito;
|
|
352
|
+
- fronteiras explícitas mencionadas em `Goals` ou na entrevista — o complemento natural de cada
|
|
353
|
+
Goal, isto é, o que ele deliberadamente não cobre.
|
|
354
|
+
|
|
355
|
+
Se a descoberta não sustentar nenhum Non-Goal específico, registre a fronteira mais óbvia do tema
|
|
356
|
+
(ex.: "Não cobre cenários fora do descrito em Goals") em vez de deixar a seção sem conteúdo. Isso
|
|
357
|
+
existe para impedir expansão silenciosa de escopo durante a implementação (#202 §10) — nunca é
|
|
358
|
+
opcional.
|
|
359
|
+
|
|
360
|
+
#### 5.6 — Demais seções
|
|
361
|
+
|
|
362
|
+
- **Título / Summary:** derive do tema e do contexto encontrado, em 1-2 frases.
|
|
363
|
+
- **Context:** síntese das fontes relevantes, citando os arquivos de origem.
|
|
364
|
+
- Demais seções do template (Goals, Users/Personas, Behavior/States, Data,
|
|
365
|
+
Integrations/Dependencies, Error Handling, Security/Privacy, Rollout, References): preencha o que
|
|
366
|
+
o contexto sustenta; onde a informação não existir, escreva explicitamente
|
|
367
|
+
`⚠️ ABERTO: <o que falta definir>` em vez de deixar a seção vazia ou inventar conteúdo.
|
|
368
|
+
- **Open Questions:** liste toda pergunta ainda sem resposta identificada durante a descoberta, a
|
|
369
|
+
decomposição (divergência residual do passo 3), a entrevista (lacunas marcadas `⚠️ ABERTO` no
|
|
370
|
+
passo 4) e as prioridades não confirmadas (5.3).
|
|
371
|
+
- **Revision History:** uma linha inicial com a data e "rascunho inicial gerado por /vetor:spec".
|
|
372
|
+
|
|
373
|
+
Mantenha a estrutura extensível — não invente seções obrigatórias fora do template, e não force
|
|
374
|
+
seções irrelevantes para um tema pequeno (ver `$SKILL_DIR/../../templates/spec.md`).
|
|
375
|
+
|
|
376
|
+
### 6 — Apresentar o rascunho e persistir
|
|
377
|
+
|
|
378
|
+
Mostre o rascunho completo na conversa para revisão do usuário e pergunte se deseja salvá-lo. Explicite
|
|
379
|
+
o que esta versão da skill **não** cobre ainda, para não sugerir uma qualidade que ela ainda não
|
|
380
|
+
entrega:
|
|
381
|
+
|
|
382
|
+
- validação de qualidade (Quality Gate, dimension checkers, rastreabilidade — Handoff #203) e
|
|
383
|
+
refinamento iterativo a partir de feedback de qualidade;
|
|
384
|
+
- overwrite avançado (versionamento, merge automático de rascunhos divergentes) — o que existe é o
|
|
385
|
+
fluxo binário `update`/`create-new`/`cancel` abaixo, não um merge de conteúdo;
|
|
386
|
+
- Knowledge Provider além de filesystem (ex.: Obsidian, issue #225);
|
|
387
|
+
- geração de código a partir da Spec — esta skill só produz o documento; consumi-lo para gerar
|
|
388
|
+
Issues/Tasks/Worktree/Implementation é responsabilidade de um estágio posterior do workflow (ex.:
|
|
389
|
+
`issue-coordinator`), fora do escopo desta skill.
|
|
390
|
+
|
|
391
|
+
**Path previsível (issue #219):** com o Knowledge Provider `filesystem` (default, sem config
|
|
392
|
+
adicional), toda Spec é persistida em `docs/specs/<slug>.md` — o mesmo `<slug>` usado na identidade
|
|
393
|
+
`spec:<slug>`. Este path é a forma documentada de localizar a Spec fora da conversa (ex.: por um
|
|
394
|
+
humano, ou por uma etapa futura do workflow que venha a consumi-la).
|
|
395
|
+
|
|
396
|
+
**6.1 — Checar colisão de identidade antes de persistir**
|
|
397
|
+
|
|
398
|
+
Antes de chamar `create-spec`, sempre confira se a identidade já existe:
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" find spec:<slug-derivado-do-tema>
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Sem `--root` (default `docs`, mesmo default usado em 6.2/6.3 — nunca troque de root entre as três
|
|
405
|
+
chamadas, senão a checagem e a escrita podem mirar locais diferentes). O `<slug>` já deve estar
|
|
406
|
+
normalizado em kebab-case (o mesmo valor que será passado a `create-spec`/`update-spec` a seguir) —
|
|
407
|
+
`find` não normaliza como `create-spec` normaliza `--slug`; se o slug usado aqui divergir do
|
|
408
|
+
normalizado, a colisão real só será pega pelo fallback de 6.2.
|
|
409
|
+
|
|
410
|
+
- `null` → nenhuma colisão, siga direto para 6.2 (`create-spec`).
|
|
411
|
+
- Um resultado (`{"path": ..., "excerpt": ...}`) → existe uma Spec com esta identidade exata. Nunca
|
|
412
|
+
prossiga direto para `create-spec` (ele falharia) nem decida sozinho qual ação tomar — vá para 6.3
|
|
413
|
+
(decisão de overwrite).
|
|
414
|
+
|
|
415
|
+
**6.2 — Persistir (sem colisão)**
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
# grave o rascunho completo em um arquivo temporário antes (evita problemas de quoting em
|
|
419
|
+
# heredoc com o conteúdo livre da Spec) e use-o como stdin:
|
|
420
|
+
deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" create-spec \
|
|
421
|
+
--slug <slug-derivado-do-tema> --project <nome-do-repositório> --status draft \
|
|
422
|
+
< <arquivo-temporário-com-o-rascunho>
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
- O `slug` deriva do tema (kebab-case, ex.: "autenticação de usuários" → `autenticacao-de-usuarios`).
|
|
426
|
+
- O documento recebe frontmatter válido (`id`, `type: spec`, `project`, `status: draft`, `created`,
|
|
427
|
+
`updated`) e identidade estável `spec:<slug>`, localizável depois via
|
|
428
|
+
`knowledge-doc.ts find spec:<slug>`.
|
|
429
|
+
- Se o passo 1 encontrou um documento com relação clara ao tema (ex.: o ADR que rege a decisão, ou a
|
|
430
|
+
arquitetura específica do componente — não qualquer resultado incidental), passe
|
|
431
|
+
`--link <path-do-documento-relacionado>` para criar o link. Não linke indiscriminadamente: só
|
|
432
|
+
quando a relação for evidente a partir do que foi encontrado no passo 1. O path pode ser passado
|
|
433
|
+
tanto relativo à raiz do repositório (ex.: `docs/adr/001.md`, como reportado pelo passo 1) quanto
|
|
434
|
+
relativo à raiz do Knowledge Provider (ex.: `adr/001.md`) — o CLI normaliza um prefixo `docs/`
|
|
435
|
+
redundante automaticamente.
|
|
436
|
+
- Se `create-spec` mesmo assim falhar (corrida com outra sessão entre 6.1 e 6.2, por exemplo),
|
|
437
|
+
trate como colisão — vá para 6.3 — em vez de tentar sobrescrever por conta própria.
|
|
438
|
+
- Reporte ao usuário a identidade e o path onde a Spec foi salva.
|
|
439
|
+
|
|
440
|
+
**6.3 — Decisão de overwrite: `update` / `create-new` / `cancel`**
|
|
441
|
+
|
|
442
|
+
Nunca decida sozinho qual das três opções aplicar. Em modo **interativo**, use `AskUserQuestion` com
|
|
443
|
+
as três opções abaixo (uma pergunta, não texto livre); em modo **headless** — sem interlocutor para
|
|
444
|
+
responder (ex.: despachada de forma não-interativa por outro agente/skill) — **nunca assuma
|
|
445
|
+
`update`**: trate a ausência de resposta como `cancel`, reporte a colisão (identidade e path
|
|
446
|
+
existente) e pare, sem persistir nada. Silenciosamente sobrescrever é exatamente o que esta issue
|
|
447
|
+
proíbe.
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
Já existe uma Spec com a identidade "spec:<slug>" (<path>). O que deseja fazer?
|
|
451
|
+
|
|
452
|
+
1. update — sobrescrever o conteúdo desta Spec com o novo rascunho (mantém created, avança updated)
|
|
453
|
+
2. create-new — manter a existente intacta e persistir este rascunho sob um novo slug
|
|
454
|
+
3. cancel — não persistir nada; o rascunho continua disponível apenas nesta conversa
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
- **`update`**: rode `update-spec` (mesmo `--slug`, corpo via stdin como em 6.2). Preserva
|
|
458
|
+
`id`/`type`/`project`/`created` do frontmatter existente e avança apenas `updated`; `status` só
|
|
459
|
+
muda se `--status` for passado explicitamente (ex.: usuário confirmou uma transição de `draft`
|
|
460
|
+
para `approved`). Também preserva qualquer linha `- Relacionado: <target>` já gravada no corpo por
|
|
461
|
+
um `create-spec --link` anterior, mesmo que o novo rascunho não a mencione — `update-spec` **não
|
|
462
|
+
adiciona** um link novo durante a atualização (limitação conhecida: vincular um documento
|
|
463
|
+
relacionado depois da criação ainda não tem um comando dedicado).
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
deno run -A "$SKILL_DIR/../../scripts/knowledge-doc.ts" update-spec \
|
|
467
|
+
--slug <slug-derivado-do-tema> \
|
|
468
|
+
< <arquivo-temporário-com-o-rascunho>
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
- **`create-new`**: pergunte (ou proponha) um novo `<slug>` que diferencie esta Spec da existente
|
|
472
|
+
(ex.: sufixo do tema, não um sufixo numérico arbitrário) e siga 6.2 normalmente com esse slug —
|
|
473
|
+
isso nunca é um comando novo, é o mesmo `create-spec`.
|
|
474
|
+
- **`cancel`**: não execute `create-spec` nem `update-spec`. Informe ao usuário que o rascunho
|
|
475
|
+
permanece apenas na conversa e pode ser retomado depois.
|
|
476
|
+
- Em qualquer uma das três opções, reporte ao usuário o resultado (identidade + path persistido, ou
|
|
477
|
+
confirmação de que nada foi gravado).
|
|
478
|
+
|
|
479
|
+
Quando o Knowledge Provider está desabilitado (passo 0.2), mantenha o comportamento anterior: **não
|
|
480
|
+
grava a Spec em disco** — o rascunho fica apenas na conversa, e 6.1-6.3 não se aplicam.
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## Restrições
|
|
485
|
+
|
|
486
|
+
- Nunca afirme certeza sobre um requisito que o contexto descoberto não sustenta — marque como
|
|
487
|
+
`⚠️ ABERTO`.
|
|
488
|
+
- Nunca decida sozinho sobrescrever uma Spec existente — ao detectar colisão de identidade (passo
|
|
489
|
+
6.1), sempre ofereça a escolha explícita `update`/`create-new`/`cancel` (passo 6.3) via
|
|
490
|
+
`AskUserQuestion` em modo interativo; em modo headless sem interlocutor, trate a ausência de
|
|
491
|
+
resposta como `cancel` — nunca como `update` implícito.
|
|
492
|
+
- Nunca acople a descoberta de contexto a um provider específico além de `FilesystemKnowledgeProvider`
|
|
493
|
+
(hoje o único implementado em `scripts/knowledge-doc.ts`).
|
|
494
|
+
- Nunca persista a Spec sem antes ter rodado a busca prévia do passo 1, item 5, **e** a checagem de
|
|
495
|
+
colisão por identidade exata do passo 6.1 — a busca do passo 1 é textual/aproximada, não substitui
|
|
496
|
+
a checagem por identidade.
|
|
497
|
+
- Nunca crie um link (`--link`) para um documento sem relação clara com o tema — vínculos
|
|
498
|
+
indiscriminados são piores que a ausência de vínculo.
|
|
499
|
+
- Nunca persista em disco quando o Knowledge Provider estiver desabilitado (passo 0.2) — apenas
|
|
500
|
+
apresente o rascunho na conversa.
|
|
501
|
+
- Nunca omita uma categoria de busca do relatório do passo 2, mesmo quando vazia.
|
|
502
|
+
- Nunca gere o rascunho (passo 5) sem antes apresentar a decomposição (passo 3) quando o tema for
|
|
503
|
+
grande (ver critério de "tema grande" no passo 3) — a confirmação do usuário é obrigatória, não
|
|
504
|
+
opcional. Temas atômicos (nenhum sinal de "grande") pulam os passos 3 e 4 legitimamente, direto
|
|
505
|
+
ao passo 5 — isso não viola esta restrição.
|
|
506
|
+
- Nunca ultrapasse 2 rodadas de ajuste na decomposição (passo 3) — ao atingir o limite, prossiga com
|
|
507
|
+
a última versão e registre a divergência em `Open Questions`.
|
|
508
|
+
- Nunca faça mais de 3 perguntas por componente na entrevista (passo 4) — ver `planning-conventions.md`
|
|
509
|
+
§3 ("Regra das 3 perguntas"). Ao esgotar o limite sem resposta suficiente, marque `⚠️ ABERTO` em vez
|
|
510
|
+
de perguntar de novo.
|
|
511
|
+
- Nunca pergunte quando a resposta não mudaria a Spec de forma significativa (ex.: não alteraria um
|
|
512
|
+
Acceptance Criteria, Non-Goal ou Edge Case) — prossiga com o que já foi descoberto.
|
|
513
|
+
- Nunca registre decisão tecnológica/arquitetural em `Functional Requirements`/
|
|
514
|
+
`Non-Functional Requirements` quando ela não for parte do próprio requisito — roteie para
|
|
515
|
+
`## Decisions` (5.1).
|
|
516
|
+
- Nunca renumere um `RF-`/`RNF-` já existente ao refinar uma Spec — novos requisitos recebem o
|
|
517
|
+
próximo número disponível da sequência; uma lacuna por remoção é aceitável (5.2).
|
|
518
|
+
- Nunca deixe um requisito `Must` sem Acceptance Criteria verificável — quando não houver valor
|
|
519
|
+
determinável, marque `⚠️ ABERTO` explicitamente no próprio checkbox em vez de omitir o critério
|
|
520
|
+
(5.3).
|
|
521
|
+
- Nunca preencha `## Edge Cases` mecanicamente com todas as categorias, nem a deixe vazia sem uma
|
|
522
|
+
frase explícita quando nenhuma for relevante ao tema (5.4).
|
|
523
|
+
- Nunca deixe `## Non-Goals` vazia — na ausência de achado específico, registre a fronteira mais
|
|
524
|
+
óbvia do tema (5.5).
|