@spec-wave/cli 0.27.0 → 0.28.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.
@@ -0,0 +1,88 @@
1
+ # A crítica adversarial na prática
2
+
3
+ O que este arquivo acrescenta ao fluxo: a crítica **não é um veredito**, é uma amostra. Tratá-la
4
+ como veredito produz os dois erros caros — aceitar um documento defeituoso porque a passada veio
5
+ limpa, e reescrever lógica correta porque um finding disse para reescrever.
6
+
7
+ ## A crítica é não-determinística
8
+
9
+ Passadas sucessivas sobre o **mesmo arquivo** dão vereditos diferentes. Três passadas medidas sobre
10
+ o mesmo `plan.md`, sem editar nada entre a primeira e a segunda além da correção que a primeira
11
+ pediu:
12
+
13
+ | Passada | Achados |
14
+ |---|---|
15
+ | 1 | 1 menor — um refetch disparado por posição quando o item já vinha no payload |
16
+ | 2 | 2 menores — a correção da passada 1 tinha ficado **pela metade** (uma seção corrigida, outra não, o plano contradizendo a si mesmo) + uma regra descrita de duas formas |
17
+ | 3 | 2 menores, ambos novos — do tipo "o plano não explica X", não mais contradição |
18
+
19
+ Em outra Feature, duas passadas sobre o mesmo arquivo e o mesmo modelo deram
20
+ `✅ Nenhuma contradição encontrada` e depois `1 GRAVE` — e o defeito já estava lá na primeira.
21
+
22
+ **Leia "nenhuma contradição encontrada" como *um revisor não achou nada nesta passada*.**
23
+
24
+ ### Três consequências práticas
25
+
26
+ 1. **Reaplique a crítica depois de editar**, mesmo com veredito `limpa`. Foi a segunda passada que
27
+ pegou a correção incompleta, e custa um minuto.
28
+ 2. **Findings "menores" podem ser substantivos.** O primeiro do exemplo era um round-trip
29
+ desperdiçado no caso mais comum — não bloqueava o `ready`, mas era defeito real.
30
+ 3. **Saiba parar.** Quando os achados viram "o plano não explica X" em vez de "o plano se
31
+ contradiz", o retorno virou marginal. Corrija o que você mesmo introduziu e siga.
32
+
33
+ ## Antes de corrigir, confira o finding contra o arquivo
34
+
35
+ A crítica produz os dois tipos de erro, e eles pedem respostas opostas.
36
+
37
+ **Falso positivo.** O padrão já observado: o texto do finding termina em "não é contradição real" e
38
+ a severidade sai `grave` mesmo assim. Aí o ajuste é tornar o documento **mais explícito no ponto
39
+ citado**, não reescrever a lógica. Reescrever a lógica de um plano correto por causa de um finding
40
+ mal calibrado é o pior desfecho disponível: custa a revisão e introduz o defeito que não existia.
41
+
42
+ **Defeito real.** Também já observado: o plano dizia duas vezes "esta feature não cria tabela nem
43
+ coluna (RN15)" e trazia um `CREATE TABLE` com uma coluna de texto livre, violando de quebra uma
44
+ decisão registrada no `tech_context`. Nenhuma leitura superficial pegaria — as duas afirmações
45
+ estavam a páginas de distância.
46
+
47
+ **Cite o trecho do arquivo que confirma ou refuta o finding.** É o que distingue "corrigi o que a
48
+ IA mandou" de "verifiquei e o problema existe", e é o que o usuário precisa para julgar a sua
49
+ correção sem reler o documento inteiro.
50
+
51
+ ## Qual superfície corrigir
52
+
53
+ O achado cita âncoras, e a âncora diz onde corrigir:
54
+
55
+ | O achado cita | Corrija |
56
+ |---|---|
57
+ | seções do plano técnico | `plan.md` |
58
+ | `Story N` / `Task N.M` | `decomposition.md` — são títulos daquele arquivo |
59
+
60
+ Confundir as duas trava o ciclo: você corrige o documento errado, recritica, e o mesmo achado volta.
61
+
62
+ **Mas verifique se o defeito nasce acima.** Um achado que aponta uma `Task` pode ter a causa no
63
+ `plan.md`. Corrigir só o rascunho deixa os dois divergentes, e a próxima geração traz o defeito de
64
+ volta. A regra: se o achado descreve uma **decisão técnica**, corrija nos dois; se descreve um
65
+ **recorte de escopo**, o rascunho basta.
66
+
67
+ ## Recriticar sem regerar
68
+
69
+ ```bash
70
+ npx @spec-wave/cli@latest run <n> --yes --step critique
71
+ ```
72
+
73
+ **Nunca `--step plan` para isso.** Ele regera o documento do zero e descarta a correção — é o erro
74
+ que faz o ciclo não convergir, porque cada rodada recomeça do mesmo lugar.
75
+
76
+ Existe também `critique --file <caminho>`, que é **consulta**: não comenta na issue, não aplica
77
+ label e não consome tentativa. Útil para conferir uma correção antes de gastar o portão.
78
+
79
+ ## Quando a crítica esgota
80
+
81
+ Depois de N reprovas seguidas (3, por padrão) o fluxo aplica `spec-wave:needs-human` e para.
82
+
83
+ Isso não é um erro a contornar — é o fluxo dizendo que a correção automática não está convergindo.
84
+ Pare e envolva o usuário. A label sai à mão, e sair dela sem resolver a causa só adia o mesmo
85
+ impasse para a próxima passada.
86
+
87
+ O mesmo vale para `spec-wave:critique-failed`: o caminho de retomada é **corrigir o documento e
88
+ recriticar**, nunca regerar.
@@ -0,0 +1,171 @@
1
+ ---
2
+ name: spec-wave-preparar-specs
3
+ description: "Use para gerar o spec.md de TODAS as Features de uma milestone de uma vez: confere o ambiente antes de gastar modelo, gera, valida a estrutura, revisa o conjunto procurando contradições ENTRE as specs, mergeia os PRs e move as issues para 📋 Spec. Gatilhos: 'gera as specs da v06', 'roda os specs da milestone X', 'quero todas as features da v05.2 especificadas', 'gera as specs que faltam', 'quais features estão sem spec?', 'preciso das specs prontas antes de gerar os planos'. NÃO use para uma Feature isolada — aí é a skill spec (um passo) ou preparar-feature (a Feature inteira, até Ready)."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Bash(gh issue *)
7
+ - Bash(gh pr *)
8
+ - Bash(gh run *)
9
+ - Bash(gh api *)
10
+ - Bash(git *)
11
+ - Read
12
+ - Glob
13
+ - Grep
14
+ ---
15
+
16
+ # Specs de uma milestone inteira
17
+
18
+ Levar todas as Features de uma milestone de "sem spec" até "spec revisada e mergeada na base, issue em 📋 Spec". São seis fases e a ordem importa: cada uma existe para que a seguinte não desperdice trabalho caro.
19
+
20
+ O custo real aqui não é tempo — é que **cada geração paga um modelo**. Um erro de configuração descoberto na sétima Feature custa sete gerações. Por isso a Fase 0 existe, e por isso a Fase 1 para na primeira falha em vez de seguir em frente.
21
+
22
+ **Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
23
+
24
+ ## Fase 0 — Preflight (nunca pule)
25
+
26
+ ```bash
27
+ npx @spec-wave/cli@latest preflight --milestone <nome>
28
+ ```
29
+
30
+ Um comando reporta: token utilizável, modo de execução (config × variável do repositório), se a publicação por Pull Request funciona, as Features da milestone com o estado do `spec.md` de cada uma, e labels de gatilho grudadas. Sai com código 1 se houver bloqueio. `--json` devolve o mesmo relatório para você ramificar.
31
+
32
+ **Leia a coluna de estado de cada Feature antes de agir** — ela não é `existe`/`não existe`:
33
+
34
+ | Estado | O que significa | O que fazer |
35
+ |---|---|---|
36
+ | `· gerar` | não existe em lugar nenhum | entra na rodada |
37
+ | `✓ na base` / `✓ no disco` | já mergeada | não gerar |
38
+ | `⏳ em PR aberto` | gerada, aguardando revisão/merge | **não gerar** — regerar descarta a revisão e paga o modelo de novo |
39
+ | `⚠ em branch sem PR` | commit passou, PR não nasceu | abrir o PR; ver `reference/armadilhas.md` |
40
+ | `? indeterminado` | a consulta falhou | confirmar antes, para não pagar duas vezes |
41
+
42
+ Se qualquer bloqueio aparecer, **resolva antes de gerar**. As causas estão em `reference/armadilhas.md`; leia esse arquivo agora se for a primeira vez que você roda esta skill neste repositório.
43
+
44
+ Confirme **duas** coisas com o usuário antes de começar — é a última chance barata de descobrir que a milestone errada foi escolhida, e a única de decidir onde a rodada roda:
45
+
46
+ 1. **a lista de Features** que serão geradas;
47
+ 2. **o modo de execução** — `actions` ou `local`. O preflight diz qual está configurado hoje; isso é o *default* da pergunta, não a resposta. Os custos dos dois são diferentes o bastante (Fase 1) para a escolha ser dele, não sua.
48
+
49
+ ## Fase 1 — Gerar
50
+
51
+ **O modo de execução decide como acionar** — e ele é o que o usuário respondeu na Fase 0, não o que o preflight encontrou configurado:
52
+
53
+ | Modo | Como acionar | O que custa |
54
+ |---|---|---|
55
+ | `actions` | aplicar a label `spec-wave:spec` | minutos de GitHub Actions; roda em paralelo e não prende a máquina |
56
+ | `local` | `npx @spec-wave/cli@latest run <issue>`, com `--dry-run` antes | nenhum minuto de CI; alguns minutos por Feature, mas a máquina fica ocupada |
57
+
58
+ **Se a resposta diferir do que está configurado, troque o modo antes de gerar** — não tente acionar "do outro jeito" por cima da configuração atual:
59
+
60
+ ```bash
61
+ npx @spec-wave/cli@latest mode <actions|local>
62
+ ```
63
+
64
+ Três consequências que impedem essa troca de ser um detalhe desta rodada — diga-as ao usuário **antes** de executar, porque duas delas sobrevivem à rodada:
65
+
66
+ - **a escolha vale para todo mundo.** O `mode` escreve os dois lados do interruptor: o `.spec-wave.json` e a variável de repositório `SPEC_WAVE_EXECUTION`, que o `if:` de cada job avalia. Quem rodar o fluxo depois de você herda o modo que você deixou.
67
+ - **a variável exige permissão de administração.** Sem ela o comando grava só o config e diz o que faltou — e os dois lados passam a divergir: você acha que desarmou os workflows, e eles continuam disparando.
68
+ - **o `.spec-wave.json` fica modificado localmente.** Commite, senão quem clona o repositório (dev-agent, Actions) continua lendo o modo antigo.
69
+
70
+ **No modo `local`, NÃO aplique label de gatilho.** O `run` não aplica nenhuma, e aplicá-la à mão põe a label e o `run` no mesmo passo da mesma Feature — o modelo é pago duas vezes.
71
+
72
+ **Os dois modos fazem a mesma coisa:** geram o documento e o publicam **via API, em branch própria por Feature (`spec-wave/<issue>-spec`), abrindo um PR**. Nada é escrito no seu checkout — confirme com `git status` na primeira geração.
73
+
74
+ Cada `run` termina dizendo em qual PR o documento saiu, e avisando que *o próximo passo do fluxo lê o documento da branch base* — ou seja, o merge é pré-requisito do `plan`, não um detalhe de arrumação.
75
+
76
+ ### Uma canária, depois em paralelo
77
+
78
+ Nem tudo de uma vez, nem tudo em série:
79
+
80
+ 1. **Gere UMA sozinha e espere.** Ela custa uma geração e responde tudo que é sistêmico: credencial válida, permissão de publicar, modo correto, PR abrindo de fato. Um erro descoberto aqui custa 1 geração; descoberto na sétima, custa 7. **Se a canária falhar, não dispare mais nada.**
81
+ 2. **Passando a canária, o resto sai em até 4 trilhas simultâneas.**
82
+
83
+ Paralelizar é seguro porque o lock da CLI é **por issue** (`.git/spec-wave/run-<n>.lock`) e a publicação é por API, em branch própria — issues diferentes nunca disputam nada.
84
+
85
+ O teto de 4 não vem da CLI, vem do backend: no modo `local` quem gera é o agente desta máquina, e outras sessões podem estar usando o mesmo. Vale conferir com `pgrep -af "spec-wave run"` antes. Em `actions` nada disso se aplica: o paralelismo é do próprio GitHub.
86
+
87
+ **Rode em background, nunca em primeiro plano.** Uma spec leva minutos; uma ferramenta com timeout curto mata o comando no meio — e o custo já foi pago.
88
+
89
+ **Ao falhar, a pergunta é sempre a mesma:** *isto é específico desta Feature, ou vai acontecer com todas?* Leia o log (`gh run view <id> --log-failed | tail -40`) ou o erro da CLI antes de qualquer outra coisa. Onde a falha aconteceu já indica a resposta:
90
+
91
+ - **Na canária** — trate como sistêmico até prova em contrário e **não dispare as trilhas**. Credencial, permissão, publicação e configuração falham assim.
92
+ - **Numa trilha, com a canária tendo passado** — quase sempre pontual. As outras trilhas seguem; não as interrompa para investigar uma.
93
+
94
+ **`error_max_turns` é o caso pontual mais comum** — o modelo gasta o teto de turnos explorando o repositório e não chega a escrever. A própria CLI classifica: se as chamadas de ferramenta são **distintas**, foi exploração (varia entre execuções) e **repetir no mesmo modelo costuma bastar**; se elas **se repetem**, é loop degenerado e repetir só paga a mesma perambulação de novo. Só nesse segundo caso entram trocar de modelo ou subir `maxTurns` — e essas são decisões do usuário, porque custam mais caro. O teto vive no frontmatter do prompt da CLI, não no `.spec-wave.json`.
95
+
96
+ Diga ao usuário o que encontrou e o que recomenda, em vez de tentar contornar sozinho: várias saídas possíveis (mudar o modo, mexer em proteção de branch, trocar credencial) são decisões dele.
97
+
98
+ ## Fase 2 — Validar estrutura
99
+
100
+ Barato e determinístico, então roda em todas antes da revisão cara.
101
+
102
+ **Não use `spec-wave validate` aqui:** ele valida spec **e** plan juntos, e nesta altura o `plan.md` não existe — reprovaria toda Feature da milestone e ainda consumiria a label `spec-wave:ready`. A conferência desta fase é de leitura.
103
+
104
+ O que olhar em cada spec:
105
+
106
+ - as seções obrigatórias estão presentes e com o nome exato. O gerador escreve seis (`Visão Geral`, `Regras de Negócio`, `Fluxos`, `Critérios de Aceite`, `Dependências`, `Requisitos Não-Funcionais`) e o `validate` mais tarde vai exigir três delas **byte a byte** — `Visão Geral`, `Critérios de Aceite` e `Requisitos Não-Funcionais`. Título divergente ("encontrei X, esperava Y") se resolve renomeando, não regerando;
107
+ - nenhum sinal de corte: bloco de código não fechado, parêntese aberto na última linha. Um documento truncado passa na conferência de seções e vale menos que documento nenhum;
108
+ - conte os `[TODO: requer esclarecimento` de cada spec. O número não é defeito — é o mapa do que ficou em aberto, e vai para o relatório final.
109
+
110
+ Se uma spec estiver estruturalmente quebrada, **não reaplique `spec-wave:spec` por reflexo**: essa label **sobrescreve** o arquivo. Se o documento já foi revisado ou editado, regenerar joga fora a revisão.
111
+
112
+ ## Fase 3 — Revisar conteúdo
113
+
114
+ Aqui está a maior parte do valor, e é o que distingue esta skill de rodar sete comandos em sequência. Leia `reference/revisao.md` — ele traz o método e as classes de problema que aparecem de verdade, com exemplos reais.
115
+
116
+ As specs ainda não estão na base neste ponto — cada uma vive na branch do seu PR. Leia direto de lá, sem checkout:
117
+
118
+ ```bash
119
+ git fetch origin
120
+ git show origin/spec-wave/<issue>-spec:docs/features/<slug>/spec.md
121
+ ```
122
+
123
+ Em resumo: leia as specs **como conjunto**, não uma a uma. Problemas de spec isolada o gerador já evita bem; o que ele não consegue ver é a relação entre documentos — regra que duas features contam de formas diferentes, dependência circular, feature que aponta para um lugar que não existe, e afirmações que a própria rodada tornou falsas.
124
+
125
+ Separe o que encontrar em duas classes, porque elas têm destinos diferentes:
126
+
127
+ - **Achado material** — muda o desenho de alguma feature, ou tem risco em produção. Vai como comentário na issue, com a regra que o originou e a decisão necessária.
128
+ - **Lacuna paramétrica** — falta um número, um prazo, um limiar. Não bloqueia; agrupe por tema no relatório final, porque doze delas costumam ser uma decisão só.
129
+
130
+ ## Fase 4 — Mergear os PRs
131
+
132
+ A Fase 1 já abriu um PR por Feature; **não há nada a publicar**. O trabalho aqui é mergear os que a revisão aprovou.
133
+
134
+ Isso reordena as fases de propósito: a revisão da Fase 3 acontece **antes** do merge, lendo o conteúdo direto das branches, e o merge passa a ser o registro de que a revisão terminou.
135
+
136
+ Para cada PR: confira que o check obrigatório passou e mergeie. Um PR por Feature é bom para o histórico (cada spec rastreável à sua issue), então não tente consolidar num PR único — consolidar exigiria desfazer o que a ferramenta fez sozinha, sem ganho real.
137
+
138
+ Achado material **não** bloqueia o merge. A spec registra o que foi gerado a partir da fonte normativa; o achado é decisão do PO e vive na issue. Segurar o merge só deixa a spec invisível para quem precisa dela — inclusive para o `plan`, que lê da branch base.
139
+
140
+ Ao final, reconcilie o checkout com `git pull --rebase`.
141
+
142
+ ## Fase 5 — Mover o board
143
+
144
+ Depois do merge, para cada Feature:
145
+
146
+ ```bash
147
+ npx @spec-wave/cli@latest move <n> "📋 Spec"
148
+ ```
149
+
150
+ Use o comando, não mutação manual no board — ele embute as regras do fluxo. E note que **a Etapa nunca retrocede**: uma vez movida, não volta por comando. Por isso este passo vem *depois* do merge, quando as specs de fato existem na base, e não antes.
151
+
152
+ Confirme lendo o board de volta, não pela saída do comando.
153
+
154
+ ## Fase 6 — Relatório
155
+
156
+ Entregue ao usuário, nesta ordem — do que exige decisão para o que é registro:
157
+
158
+ 1. **Achados materiais**, se houver, com link do comentário em cada issue. É o que ele precisa decidir antes de gerar planos.
159
+ 2. **Placar**: N/N specs na base, PRs mergeados, issues em 📋 Spec.
160
+ 3. **Tabela** por Feature: issue, nome, linhas, TODOs.
161
+ 4. **Lacunas paramétricas agrupadas por tema**, com a contagem.
162
+ 5. **O que ficou aberto** — dependências de features sem spec, inversões de sequenciamento entre milestones, dívida operacional.
163
+
164
+ Um plano gerado sobre uma spec cuja regra vai mudar é retrabalho garantido. Se a Fase 3 produziu achados materiais, diga isso explicitamente ao recomendar o próximo passo.
165
+
166
+ ## Referências
167
+
168
+ - `reference/armadilhas.md` — as armadilhas operacionais deste fluxo, cada uma com a causa e o sintoma. Leia antes da Fase 1 na primeira vez, e sempre que algo falhar de um jeito que não faz sentido.
169
+ - `reference/revisao.md` — o método da Fase 3 e as classes de problema que aparecem de verdade, com exemplos reais.
170
+
171
+ Depois desta skill, o passo natural de cada Feature é o plano técnico: skill **preparar-feature** (leva uma Feature de spec até ✅ Ready com Stories e Tasks) ou skill **plan** (só o `plan.md`).
@@ -0,0 +1,209 @@
1
+ # Armadilhas operacionais deste fluxo
2
+
3
+ Cada item aqui custou uma investigação real. A causa vem junto porque o sintoma, sozinho,
4
+ costuma apontar para o lugar errado.
5
+
6
+ ## Índice
7
+
8
+ 1. Token do `gh` inválido no ambiente
9
+ 2. `gh issue edit --add-label` falha com 503
10
+ 3. A API do GitHub devolve 503 intermitente
11
+ 4. Working tree compartilhado com outros agentes
12
+ 5. Label de gatilho grudada impede o retry
13
+ 6. `spec-wave:spec` sobrescreve spec revisada
14
+ 7. `spec-wave update` reescreve os workflows
15
+ 8. Runs `skipped` são normais — não são falha
16
+ 9. `conclusion` vazia não é conclusão
17
+ 10. Geração leva minutos — não rode em primeiro plano
18
+ 11. Run interrompido deixa lock órfão
19
+ 12. O documento foi gerado e o PR não nasceu
20
+
21
+ ---
22
+
23
+ ## 1. Token do `gh` inválido no ambiente
24
+
25
+ **Sintoma:** `gh` falha com erro de autenticação, ou enxerga o repositório errado.
26
+
27
+ **Causa:** a variável `GH_TOKEN` do ambiente pode estar inválida ou pertencer a uma conta
28
+ sem acesso à organização, enquanto o keyring tem a conta certa.
29
+
30
+ **Como resolver:** exporte o token da conta correta antes dos comandos:
31
+
32
+ ```bash
33
+ export GH_TOKEN=$(env -u GH_TOKEN gh auth token -u <conta-com-acesso>)
34
+ ```
35
+
36
+ O `env -u GH_TOKEN` é necessário porque o `gh auth token` também consulta a variável
37
+ inválida se ela estiver setada.
38
+
39
+ A CLI tem a saída própria dela para o mesmo problema, que não depende do shell:
40
+ `spec-wave --account <login> <comando>`, ou `"github": { "account": "<login>" }` no
41
+ `.spec-wave.json`. Fora do CI, a conta declarada vence a variável de ambiente.
42
+
43
+ ## 2. `gh issue edit --add-label` falha com 503
44
+
45
+ **Sintoma:** o comando falha repetidamente, e parece que o gatilho não existe.
46
+
47
+ **Causa:** esse subcomando passa pelo GraphQL, que pode estar degradado enquanto o REST
48
+ funciona normalmente.
49
+
50
+ **Alternativa que funciona:**
51
+
52
+ ```bash
53
+ gh api -X POST repos/<owner>/<repo>/issues/<n>/labels -f "labels[]=spec-wave:spec"
54
+ ```
55
+
56
+ ## 3. A API do GitHub devolve 503 intermitente
57
+
58
+ **Sintoma:** comandos falham de forma aleatória e passam na tentativa seguinte.
59
+
60
+ **Como lidar:** envolva as chamadas em retry (3–5 tentativas com pausa) e **verifique o
61
+ resultado real**, não o código de saída isolado. Um `gh` que devolve string vazia sem erro
62
+ é indistinguível de "não encontrei nada" se você não conferir.
63
+
64
+ ## 4. Working tree compartilhado com outros agentes
65
+
66
+ **Sintoma:** arquivos modificados que você não criou; branch diferente da esperada.
67
+
68
+ **Causa:** outros processos (dev-agents, outras sessões) usam o mesmo checkout e trocam de
69
+ branch sem aviso.
70
+
71
+ **Regra:** nunca `checkout`, `stash` ou `reset` sem antes conferir `git branch --show-current`
72
+ e `git status --short`. A geração em si não disputa o checkout — ela publica por API, sem
73
+ tocar em disco —, mas tudo que você fizer à mão disputa.
74
+
75
+ Se precisar mesmo de uma branch checada — por exemplo, para editar arquivos de um PR já
76
+ aberto — use um worktree temporário fora do repositório, e remova depois:
77
+
78
+ ```bash
79
+ git worktree add /tmp/<dir> <branch>
80
+ # ... edições, commit, push ...
81
+ git worktree remove --force /tmp/<dir> && git worktree prune
82
+ ```
83
+
84
+ ## 5. Label de gatilho grudada impede o retry
85
+
86
+ **Sintoma:** reaplicar a label não dispara nada; ou o `run` local recusa executar com
87
+ `⛔ trigger-pending`.
88
+
89
+ **Causa:** o evento `issues: [labeled]` não redispara com a label já presente, e o `run`
90
+ recusa rodar com gatilho pendente — a label significa "Action em execução", ou uma que
91
+ falhou e a deixou para trás.
92
+
93
+ **Como resolver:** remover e reaplicar. No modo local, onde nenhuma Action está rodando, a
94
+ label é resíduo: **remova-a em vez de usar `--force`**, para a issue não mentir sobre o
95
+ estado.
96
+
97
+ ```bash
98
+ gh api -X DELETE "repos/<owner>/<repo>/issues/<n>/labels/spec-wave:spec"
99
+ ```
100
+
101
+ Nem sempre a label fica: em algumas falhas a CLI a remove sozinha no início do run.
102
+ Confira issue a issue em vez de supor — o `preflight` já lista as pendentes.
103
+
104
+ ## 6. `spec-wave:spec` sobrescreve spec revisada
105
+
106
+ A label **regenera** o documento do zero. Se a spec já foi revisada, editada à mão ou
107
+ corrigida, reaplicar joga tudo fora para consertar o que muitas vezes é uma frase.
108
+
109
+ Para correção pontual em documento já gerado, a edição direta é permitida **quando o
110
+ usuário pede explicitamente** — e só nesse caso. Edite no PR: as edições são preservadas.
111
+
112
+ ## 7. `spec-wave update` reescreve os workflows
113
+
114
+ O `update` compara os workflows com os templates da CLI e sobrescreve os divergentes. Toda
115
+ customização local neles é perdida no bump, silenciosamente, e o sintoma só aparece na
116
+ próxima geração.
117
+
118
+ Se o repositório tem workflows customizados de propósito, rode `update --skip-repo`, ou
119
+ reaplique a customização antes de commitar o bump. Confirme depois:
120
+
121
+ ```bash
122
+ git show origin/main:.github/workflows/generate-spec.yml | grep <marca-da-customizacao>
123
+ ```
124
+
125
+ ## 8. Runs `skipped` são normais — não são falha
126
+
127
+ O evento `issues: [labeled]` dispara **todos** os workflows que escutam labels; cada um se
128
+ filtra pelo próprio `if:`. Ver `generate-plan` e `decompose` como `skipped` depois de
129
+ aplicar `spec-wave:spec` é o comportamento correto, não um problema.
130
+
131
+ O mesmo vale para o repositório em modo `local`: todo job carrega
132
+ `if: vars.SPEC_WAVE_EXECUTION != 'local'`, então o run aparece verde e `skipped`, sem erro
133
+ e sem documento. Se você aplicou uma label e nada aconteceu, confira o modo antes de
134
+ procurar defeito: `npx @spec-wave/cli@latest mode`.
135
+
136
+ Ao procurar o run que interessa, filtre pelo workflow **e** pelo título da issue.
137
+
138
+ ## 9. `conclusion` vazia não é conclusão
139
+
140
+ O `gh run list` devolve `conclusion` como **string vazia** — não `null` — enquanto o run
141
+ está em andamento. Um filtro `select(.conclusion != null)` deixa passar runs que ainda
142
+ estão rodando, e você conclui cedo demais que tudo terminou.
143
+
144
+ Filtre por `.status == "completed"` **e** `conclusion` não-vazia.
145
+
146
+ ## 10. Geração leva minutos — não rode em primeiro plano
147
+
148
+ Uma spec é uma chamada de modelo gerando um documento longo: leva minutos. Rodar no
149
+ primeiro plano de uma ferramenta com timeout curto faz o comando morrer no meio — e o custo
150
+ já foi pago.
151
+
152
+ Rode em background, ou com timeout generoso (10 min por Feature). Numa milestone grande em
153
+ modo local isso passa de uma hora em série; combine com o usuário antes de começar.
154
+
155
+ ## 11. Run interrompido deixa lock órfão
156
+
157
+ **Sintoma:** `Já existe um 'spec-wave run' para <n> (pid NNNN, desde ...)` e a geração é
158
+ recusada, mesmo não havendo nada rodando.
159
+
160
+ **Causa:** o `run` grava `.git/spec-wave/run-<n>.lock` para impedir duas execuções na mesma
161
+ issue. Um run morto por timeout ou Ctrl-C não tem chance de limpar o próprio lock.
162
+
163
+ **Como resolver — confirmando antes:** o lock guarda o pid, então dá para verificar se o
164
+ processo realmente morreu em vez de apagar no escuro:
165
+
166
+ ```bash
167
+ cat .git/spec-wave/run-<n>.lock # {"pid":NNNN,"startedAt":"..."}
168
+ ps -p NNNN >/dev/null && echo VIVO || echo morto
169
+ rm .git/spec-wave/run-<n>.lock # só se morto
170
+ ```
171
+
172
+ O cuidado importa quando você rodou várias Features: pode haver um lock órfão e outro de um
173
+ run **em andamento** ao lado. Apagar o lock errado põe dois `run` na mesma issue.
174
+
175
+ A boa notícia é que a interrupção em si é limpa — o documento não é publicado pela metade.
176
+ Confirme com a ausência de PR novo antes de rerodar.
177
+
178
+ ## 12. O documento foi gerado e o PR não nasceu
179
+
180
+ **Sintoma:** o passo termina, o commit existe na branch `spec-wave/<n>-<doc>` — e nenhum PR
181
+ aparece. O documento fica numa branch que ninguém está olhando, e a próxima execução, se
182
+ ninguém perceber, **regera por cima**.
183
+
184
+ **Causa:** a publicação precisa de `pull-requests: write` **e** de a organização permitir
185
+ que Actions abram PRs. A segunda parte é a traiçoeira: *"Allow GitHub Actions to create and
186
+ approve pull requests"* (Settings → Actions → General) vem desligada por padrão em muitas
187
+ organizações, e o erro não se parece com falta de permissão.
188
+
189
+ **Como resolver:** ligar a opção, ou definir um PAT no secret `GH_PR_TOKEN`. O `preflight`
190
+ e o `doctor` verificam os dois; o estado `⚠ em branch sem PR` no inventário é exatamente
191
+ este caso.
192
+
193
+ Não se aplica ao modo `local`, onde o token é o seu.
194
+
195
+ ---
196
+
197
+ ## Nota histórica: o regime anterior à 0.27.0
198
+
199
+ Até a 0.26.0 a geração publicava com `commit` + `pull --rebase` + `push` **na branch
200
+ default**, a partir do checkout. Duas armadilhas vinham daí e **não valem mais**:
201
+
202
+ - **push rejeitado com `GH013`** em repositório que exige PR — a falha vinha *depois* de o
203
+ modelo ter gerado o documento, e o conteúdo se perdia com o runner;
204
+ - **working tree sujo quebrava toda geração local**, porque qualquer arquivo modificado
205
+ travava o `pull --rebase`.
206
+
207
+ Hoje a publicação é por API, em branch própria por documento, sem tocar no checkout. Se o
208
+ `preflight` apontar uma CLI antiga fixada nos workflows, as duas voltam a valer — e a
209
+ saída é `npx @spec-wave/cli@latest update --branch`.
@@ -0,0 +1,107 @@
1
+ # Fase 3 — revisão de conteúdo
2
+
3
+ O gerador escreve cada spec isoladamente, a partir do corpo de uma issue. Ele é bom nisso:
4
+ as seções vêm completas, os requisitos rastreados, os fluxos coerentes **dentro** do
5
+ documento. O que ele estruturalmente não consegue ver é a relação entre os documentos —
6
+ porque, quando escreveu o primeiro, os outros não existiam.
7
+
8
+ É exatamente aí que moram os problemas que custam caro depois. Por isso a regra desta fase:
9
+ **leia as specs como conjunto, não uma a uma.**
10
+
11
+ ## Como ler
12
+
13
+ Leia todas na íntegra antes de julgar qualquer uma. Ao ler a quinta, você reconhece na
14
+ primeira uma contradição que era invisível quando ela era o único documento.
15
+
16
+ Vale montar, enquanto lê, um mapa mental de três coisas:
17
+
18
+ - **regras compartilhadas** — um teto, uma ordem de prioridade, uma janela de tempo que
19
+ aparece em mais de uma feature;
20
+ - **quem depende de quem** — e em que direção cada spec declara a dependência;
21
+ - **afirmações sobre o mundo** — "tal feature ainda não existe", "isso é feito por X".
22
+
23
+ As três classes de problema abaixo saem desse mapa.
24
+
25
+ ## Classe 1 — contradição entre specs
26
+
27
+ Duas features descrevem a mesma regra de formas que não fecham: contagens diferentes,
28
+ prioridades diferentes, a mesma janela de tempo medida a partir de marcos diferentes.
29
+
30
+ Isso é grave porque cada spec, sozinha, parece certa. O erro só existe no par — e vira dois
31
+ comportamentos incompatíveis em produção, descobertos na integração.
32
+
33
+ Ao encontrar, verifique qual das duas está alinhada com a fonte normativa (o corpo da issue,
34
+ o documento de requisitos) antes de propor a correção. Frequentemente uma está certa e a
35
+ outra derivou.
36
+
37
+ ## Classe 2 — dependência que não fecha
38
+
39
+ Três formatos, todos vistos de verdade:
40
+
41
+ **Aponta para algo que não existe.** A feature A declara que seu componente vive na feature
42
+ B, e a spec de B não menciona esse componente em lugar nenhum. Alguém vai descobrir isso na
43
+ implementação, quando já for caro.
44
+
45
+ **Direção invertida ou circular.** A declara depender de B enquanto B declara depender de A.
46
+ Uma spec bem gerada às vezes corrige isso sozinha e **documenta a correção** — quando vir
47
+ uma nota dessas, confira se a outra ponta concorda.
48
+
49
+ **Inversão de sequenciamento entre milestones.** A dependência bloqueante está numa
50
+ milestone que vence *depois* da que depende dela. Não é erro de spec — é erro de
51
+ planejamento que só aparece quando se olha as datas junto com as dependências. Levante
52
+ sempre, porque ninguém mais vai olhar para os dois ao mesmo tempo.
53
+
54
+ **Como verificar de forma barata:** para cada dependência declarada, confira se o
55
+ diretório/arquivo existe e se a outra ponta concorda com a direção e o escopo.
56
+
57
+ ## Classe 3 — afirmação que a própria rodada tornou falsa
58
+
59
+ Esta é sutil e específica de gerar várias specs de uma vez: a spec gerada às 10h afirma
60
+ "tal feature ainda não possui spec" e às 10h20 essa spec passa a existir — gerada pela
61
+ mesma rodada.
62
+
63
+ **Cuidado ao corrigir:** a mesma frase costuma aparecer várias vezes no documento, sobre
64
+ alvos diferentes, e só algumas ficaram obsoletas. Verifique alvo por alvo antes de editar.
65
+ Corrigir por padrão de texto transforma afirmação verdadeira em falsa.
66
+
67
+ E note *como* corrigir: quando a afirmação obsoleta era a **justificativa** de um TODO, a
68
+ pergunta não desaparece — ela muda de razão. Reescreva a justificativa apontando onde a
69
+ questão vive agora, em vez de apagar a frase e deixar o TODO sem explicação.
70
+
71
+ ## Também procure
72
+
73
+ - **Sobreposição com feature já entregue.** Se uma spec descreve algo que uma feature
74
+ fechada já faz, há risco de duplicar comportamento em produção. Confira o estado da issue
75
+ antiga — "fechada" muda a conversa de "coordenar" para "não quebrar o que existe".
76
+ - **Regra que contradiz outra regra da mesma spec.** Raro, mas acontece quando uma regra é
77
+ categórica ("nunca expor dado individual") e outra define um recorte fino o bastante para
78
+ violá-la na prática. Vale destacar: costuma ser o achado de maior severidade.
79
+ - **Parâmetro declarado como "definido previamente" que ninguém definiu.** Limiares, prazos,
80
+ número de tentativas. Individualmente parecem detalhe; juntos costumam ser uma decisão só,
81
+ sem dono.
82
+
83
+ ## Como classificar o que encontrou
84
+
85
+ **Achado material** — muda o desenho de uma feature, ou tem risco em produção. Vai como
86
+ comentário na issue correspondente, contendo: a regra que o originou (citada), por que não
87
+ se resolve no `plan`, e a decisão necessária. Se o achado tem dois lados (duas features
88
+ discordando), comente **nos dois**, apontando um para o outro — quem abrir só uma issue
89
+ precisa enxergar o quadro inteiro.
90
+
91
+ **Lacuna paramétrica** — falta um número. Não bloqueia o `plan`. Agrupe por tema no
92
+ relatório final: doze lacunas espalhadas costumam ser seis decisões, e uma lista de doze
93
+ itens soltos não é acionável.
94
+
95
+ O teste para separar as duas: *se ninguém decidir isso, o que acontece?* Se a resposta é
96
+ "implementam errado" ou "duas partes se comportam de formas incompatíveis", é material. Se
97
+ é "implementam com um valor provisório e ajustam depois", é paramétrico.
98
+
99
+ ## O que não fazer
100
+
101
+ Não reescreva a spec para consertar o que encontrou. A spec é registro do que foi gerado a
102
+ partir da fonte normativa; a correção de regra é decisão do PO, e o lugar dela é a issue.
103
+ Editar o documento direto faz a decisão parecer tomada — e ninguém consegue rastrear quem
104
+ a tomou.
105
+
106
+ A exceção é o erro factual puro (Classe 3), que não é decisão de ninguém — e, mesmo aí,
107
+ só com pedido explícito do usuário.
@@ -16,6 +16,9 @@ Atualiza **somente o que divergiu** da versão da CLI: a **skill** instalada (po
16
16
  | `--skip-skill` | Não verifica/atualiza a skill instalada. |
17
17
  | `--skip-config` | Não verifica/atualiza o `.spec-wave.json`. |
18
18
  | `--skip-repo` | Não verifica/atualiza workflows e labels do repo. |
19
+ | `--branch [nome]` | Envia os arquivos do repo como **Pull Request** numa branch, em um único commit (sem valor: `spec-wave/update-v<versão>`). |
20
+ | `--config-in-pr` / `--no-config-in-pr` | Força incluir/excluir o `.spec-wave.json` do PR. |
21
+ | `--skill-in-pr` / `--no-skill-in-pr` | Força incluir/excluir a skill dos agentes do PR. |
19
22
  | `--dry-run` | Mostra o que seria atualizado sem alterar nada. |
20
23
  | `--yes` | Aplica sem pedir confirmação. |
21
24
 
@@ -28,15 +31,18 @@ Atualiza **somente o que divergiu** da versão da CLI: a **skill** instalada (po
28
31
 
29
32
  2. Mostre ao usuário o resumo por categoria (skill / config / arquivos do repo / labels). Se **nada** divergiu, informe que já está tudo na versão atual e encerre.
30
33
 
31
- 3. Com a aprovação, aplique:
34
+ 3. Com a aprovação, aplique — e **prefira o Pull Request**:
32
35
  ```bash
33
- npx @spec-wave/cli@latest update --yes
36
+ npx @spec-wave/cli@latest update --yes --branch # 1 commit atômico + PR (recomendado)
37
+ npx @spec-wave/cli@latest update --yes # commits diretos na branch default
34
38
  ```
35
39
  Limite o escopo com `--skip-skill`, `--skip-config` ou `--skip-repo` se o usuário só quiser parte.
36
40
 
37
41
  4. **Onde cada coisa aterrissa:**
38
- - **arquivos do repo** (workflows, labels) commitados no remoto pelo comando
39
- - **`.spec-wave.json`**arquivo **local**; lembre o usuário de commitá-lo
42
+ - **workflows e templates de issue** → no PR (com `--branch`) ou commitados direto na branch default
43
+ - **labels**sempre direto na base: são metadado do repositório, não há como versioná-las
44
+ - **`.spec-wave.json` e a skill** → o comando **consulta a base** e vai pelo mesmo caminho do arquivo: se o repositório já versiona aquele caminho, a atualização entra no PR; se não versiona, fica só local e o usuário precisa commitá-la. Force com `--config-in-pr` / `--skill-in-pr` se o projeto quiser passar a versionar.
45
+ - a skill é gravada em disco nos dois casos — é a cópia que o agente carrega
40
46
 
41
47
  5. Se a skill foi atualizada, oriente a **recarregar/reiniciar o agente** para pegar a nova versão.
42
48
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spec-wave-workflow
3
- description: "Use quando a pergunta for sobre o fluxo spec-wave como um todo — qual é a próxima etapa de uma issue, o que cada coluna do Kanban significa, quais labels disparam quais Actions, como funciona a crítica adversarial, ou quando o usuário pedir spec-wave sem dizer qual comando. É o mapa do processo RFC-001; para executar uma ação específica, use a skill do comando correspondente (setup, issue, spec, plan, ready, decompose, implement, order, task, story, move, doctor, update, info, uninstall, rfc, fix-pr)."
3
+ description: "Use quando a pergunta for sobre o fluxo spec-wave como um todo — qual é a próxima etapa de uma issue, o que cada coluna do Kanban significa, quais labels disparam quais Actions, como funciona a crítica adversarial, ou quando o usuário pedir spec-wave sem dizer qual comando. É o mapa do processo RFC-001; para executar uma ação específica, use a skill do comando correspondente (setup, issue, spec, plan, ready, decompose, run, bug, triage, implement, order, task, story, move, doctor, update, info, uninstall, rfc, fix-pr); para conduzir um trecho inteiro do fluxo de uma vez, preparar-feature (uma Feature até Ready) ou preparar-specs (as specs de uma milestone)."
4
4
  allowed-tools:
5
5
  - Bash(npx @spec-wave/cli@latest *)
6
6
  - Bash(gh issue *)
@@ -148,6 +148,11 @@ O slug vem do **título**: `[FEATURE] Cadastro de Pedidos com PIX` → `cadastro
148
148
  | gerar o plano técnico | `plan` |
149
149
  | validar spec+plan | `ready` |
150
150
  | quebrar em Stories/Tasks | `decompose` |
151
+ | levar uma Feature da spec até ✅ Ready, de ponta a ponta | `preparar-feature` |
152
+ | gerar as specs de uma milestone inteira | `preparar-specs` |
153
+ | rodar o fluxo localmente / desarmar os workflows | `run` |
154
+ | registrar ou corrigir um Bug | `bug` |
155
+ | triar um Bug | `triage` |
151
156
  | implementar | `implement` |
152
157
  | ver ordem das Stories | `order` |
153
158
  | mover Task | `task` |