spec-first-copilot 0.6.0-beta.9 → 0.7.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.
Files changed (57) hide show
  1. package/README.md +252 -167
  2. package/bin/cli.js +70 -70
  3. package/lib/init.js +92 -92
  4. package/lib/update.js +132 -132
  5. package/package.json +1 -1
  6. package/templates/.ai/memory/napkin.md +68 -68
  7. package/templates/.github/CHANGELOG.md +121 -0
  8. package/templates/.github/adapters/SETUP.md +314 -314
  9. package/templates/.github/adapters/confluence.md +295 -295
  10. package/templates/.github/adapters/errors.md +234 -234
  11. package/templates/.github/adapters/filesystem.md +353 -353
  12. package/templates/.github/adapters/interface.md +301 -301
  13. package/templates/.github/adapters/naming.md +241 -241
  14. package/templates/.github/adapters/registry.md +244 -244
  15. package/templates/.github/agents/backend-coder.md +14 -14
  16. package/templates/.github/agents/db-coder.md +165 -165
  17. package/templates/.github/agents/doc-writer.md +66 -53
  18. package/templates/.github/agents/frontend-coder.md +5 -5
  19. package/templates/.github/agents/infra-coder.md +341 -341
  20. package/templates/.github/agents/reviewer.md +6 -6
  21. package/templates/.github/agents/security-reviewer.md +153 -153
  22. package/templates/.github/copilot-instructions.md +272 -262
  23. package/templates/.github/instructions/docs.instructions.md +147 -145
  24. package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
  25. package/templates/.github/rules.md +229 -229
  26. package/templates/.github/scripts/bootstrap-confluence.js +289 -223
  27. package/templates/.github/skills/sf-design/SKILL.md +161 -216
  28. package/templates/.github/skills/sf-dev/SKILL.md +204 -351
  29. package/templates/.github/skills/sf-discovery/SKILL.md +415 -414
  30. package/templates/.github/skills/sf-extract/SKILL.md +225 -249
  31. package/templates/.github/skills/sf-load/SKILL.md +296 -295
  32. package/templates/.github/skills/sf-mcp/SKILL.md +386 -385
  33. package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -100
  34. package/templates/.github/skills/sf-plan/SKILL.md +152 -128
  35. package/templates/.github/skills/sf-publish/SKILL.md +144 -143
  36. package/templates/.github/skills/sf-session-finish/SKILL.md +93 -120
  37. package/templates/.github/skills/sf-start/SKILL.md +192 -145
  38. package/templates/.github/templates/estrutura/apiContracts.template.md +160 -159
  39. package/templates/.github/templates/estrutura/architecture.template.md +169 -168
  40. package/templates/.github/templates/estrutura/conventions.template.md +214 -212
  41. package/templates/.github/templates/estrutura/decisions.template.md +107 -107
  42. package/templates/.github/templates/estrutura/domain.template.md +161 -160
  43. package/templates/.github/templates/feature/PRD.template.md +279 -286
  44. package/templates/.github/templates/feature/Progresso.template.md +141 -141
  45. package/templates/.github/templates/feature/TRD.template.md +358 -0
  46. package/templates/.github/templates/feature/context.template.md +89 -48
  47. package/templates/.github/templates/feature/extract-log.template.md +49 -39
  48. package/templates/.github/templates/feature/projetos.template.yaml +79 -79
  49. package/templates/.github/templates/global/progresso_global.template.md +59 -57
  50. package/templates/.github/templates/specs/brief.template.md +66 -59
  51. package/templates/.github/templates/specs/contracts.template.md +147 -141
  52. package/templates/.github/templates/specs/scenarios.template.md +125 -117
  53. package/templates/.github/templates/specs/tasks.template.md +65 -63
  54. package/templates/_gitignore +35 -35
  55. package/templates/sfw.config.yml.example +147 -147
  56. package/templates/.github/templates/feature/backlog-extraido.template.md +0 -156
  57. package/templates/.github/templates/feature/sdd.template.md +0 -559
@@ -1,249 +1,225 @@
1
- # /sf-extract $ARGUMENTS
2
-
3
- Skill atômica de extração. Lê insumos brutos de `workspace/Input/$ARGUMENTS/` e gera PRD + categoriza chunks tech pro `/sf-design`.
4
- `$ARGUMENTS` = nome do scope (ex: `app_barbearia`, `feat_cadastro_cliente`, `bootstrap`).
5
-
6
- ## Multi-agent
7
-
8
- | Agente | Modelo | Papel |
9
- |--------|--------|-------|
10
- | **Reader** (1 por arquivo) | Sonnet | Lê e cataloga 1 arquivo. Não interpreta, apenas cataloga |
11
- | **Analyzer** | Opus | Cruza fontes, categoriza chunks (produto/tech/both), consulta docs/, detecta gaps/contradições, gera PRD |
12
-
13
- ## Pré-condições
14
-
15
- | # | Validação | Se falhar |
16
- |---|-----------|-----------|
17
- | 1 | `$ARGUMENTS` informado | Parar "Informe o nome. Ex: /sf-extract feat_cadastro_cliente" |
18
- | 2 | `workspace/Input/$ARGUMENTS/` existe com arquivos | Parar → "Pasta vazia. Rode /sf-load $ARGUMENTS ou coloque insumos manualmente" |
19
- | 3 | `workspace/Output/$ARGUMENTS/.context.md` existe | Parar → "Execute /sf-start $ARGUMENTS primeiro" |
20
- | 4 | Status é `not_started` ou `extract_done` | Se posterior → "Extração já aprovada. Use /sf-design se quer seguir, ou edite .context.md" |
21
-
22
- ## Passos
23
-
24
- ### 1. Carregar contexto
25
-
26
- - `.context.md` `first_run`, `areas_tocadas`, status
27
- - `discovery.md` (se existir) → análise profunda prévia dos insumos
28
- - **`docs/` se existir** — usar como baseline pra responder checklist sem perguntar ao user
29
- - Templates:
30
- - `.github/templates/sf-feature/PRD.template.md` (destino principal)
31
- - `.github/templates/sf-feature/sf-extract-log.template.md` (append-only)
32
- - `.github/templates/sf-feature/backlog-extraido.template.md` (condicional, ver passo 6)
33
-
34
- > Se `discovery.md` existir: usar mapa do sistema e perguntas respondidas como contexto
35
- > enriquecido. Resultado: menos ambiguidades, melhor estruturação.
36
-
37
- ### 2. Inventariar insumos
38
-
39
- Para cada arquivo em `workspace/Input/$ARGUMENTS/` (ignorar `.gitkeep`):
40
- - Calcular hash SHA-256 (primeiros 8 chars)
41
- - Se `.extract-log.md` existe → classificar: NOVO / MODIFICADO / INALTERADO
42
- - Se não existe → todos são NOVOS
43
-
44
- ### 3. Processar (Reader por arquivo)
45
-
46
- Para cada arquivo NOVO ou MODIFICADO:
47
-
48
- | Formato | O que extrair |
49
- |---------|---------------|
50
- | .md, .txt | Requisitos, regras, contexto, restrições |
51
- | .sql | Entidades, campos, tipos, constraints, índices |
52
- | .html | Telas, campos, ações, validações, rotas, permissões |
53
- | .xml, .json | Fluxos, decisões, configurações |
54
- | .csv | Dados tabulares, mapeamentos |
55
- | .png, .jpg, .pdf | Análise visual (wireframes, mockups) |
56
- | Não identificado | Registrar como NÃO IDENTIFICADO, gerar ambiguidade |
57
-
58
- Cada chunk deve ser categorizado:
59
- - **produto**jornadas, RNs, UX, atores, telas, validações de negócio
60
- - **tech** — stack, arquitetura, infra, segurança, schema SQL, convenções API
61
- - **both** informação que alimenta PRD e SDD simultaneamente (ex: tabela que vira entidade no PRD §3 e entidade técnica no SDD §6)
62
-
63
- ### 4. Consolidar (Analyzer)
64
-
65
- #### 4.1 Detectar se PRD é empty
66
-
67
- Critério: após ler TODOS os insumos, o Analyzer consegue identificar **pelo menos 1** de:
68
- - Regra de negócio (RN)
69
- - Jornada de usuário
70
- - Tela / componente UI
71
- - Ator com permissões
72
-
73
- **Sim `empty: false`**, preencher PRD normalmente.
74
- **Não `empty: true`**, PRD fica com Meta + nota de rodapé. Todo conteúdo vai pro extract-log como tech chunks.
75
-
76
- #### 4.2 — Consultar docs/ antes de marcar ambiguidade
77
-
78
- Para cada gap detectado (campo do template sem info nos insumos):
79
-
80
- 1. Verificar se `docs/` existe
81
- 2. Se existe, procurar resposta nos 5 arquivos (architecture, domain, conventions, apiContracts, decisions)
82
- 3. Se encontrada: marcar como **"resolvido em `docs/{arquivo} §{seção}`"** em §14 — NÃO vira pergunta
83
- 4. Se ausente / não coberta / contradita pelo insumo: vira ambiguidade BLOQUEANTE em §14
84
-
85
- #### 4.3 Checklist de temas críticos FIXO
86
-
87
- Rodar SEMPRE (independente de first_run ou feature), após consulta a `docs/`.
88
- Temas não cobertos nem por insumos nem por `docs/` viram ambiguidades:
89
-
90
- | # | Tema | Se ausente |
91
- |---|------|------------|
92
- | 1 | **Autenticação** — mecanismo (JWT, OAuth, session) + quais operações exigem | "Mecanismo/escopo de autenticação não definido" |
93
- | 2 | **Autorização / Roles** — perfis, matriz de permissões, granularidade | "Perfis e regras de autorização não definidos" |
94
- | 3 | **Separação de serviços** mono/micro, API vs Worker vs Web | "Arquitetura de serviços não definida" |
95
- | 4 | **Ambientes & deploy** — dev/staging/prod, CI/CD, containers | "Estratégia de ambientes e deploy não definida" |
96
- | 5 | **Dados sensíveis / LGPD** PII, criptografia, retenção, base legal | "Tratamento de dados sensíveis não mencionado" |
97
- | 6 | **Validações de entrada** regras, limites, formatos, mensagens de erro | "Validações não detalhadas" |
98
- | 7 | **Tratamento de erros** cenários de falha, UX de erro, códigos | "Cenários de erro não definidos" |
99
- | 8 | **Impacto em dados existentes** — migração, backfill, compatibilidade | "Impacto em dados existentes não avaliado" |
100
-
101
- > Analyzer NÃO inventa respostas. Se não está em insumo NEM em `docs/`, PERGUNTA.
102
- > Em scopes puro-técnicos (PRD empty), temas 1-5 são prioridade; 6-8 ficam N/A comum.
103
-
104
- #### 4.4 Regras de consolidação
105
-
106
- - Detectar contradições entre fontes ambiguidade citando as duas
107
- - Nunca inferir regra de negócio se não explícito, é ambiguidade
108
- - IDs estáveis: RN-001 nunca renumera, novos continuam sequência
109
- - Rastreabilidade: cada info aponta pro arquivo fonte no §15
110
-
111
- ### 5. Gerar PRD.md
112
-
113
- Usar template `.github/templates/sf-feature/PRD.template.md`:
114
-
115
- - Meta: preencher `empty` com resultado do 4.1
116
- - Se `empty: true`: preencher Meta + adicionar nota rodapé "scope puro-técnico"
117
- - Se `empty: false`: preencher 15 seções normalmente
118
- - §14 Ambiguidades: itens com "resolvido em docs/..." + itens bloqueantes (que exigem resposta do user)
119
- - §15 Rastreabilidade: tabela insumo seções alimentadas
120
-
121
- ### 6. Backlog extraído (condicional)
122
-
123
- Gerar `backlog_extraido.md` **APENAS** se:
124
- - `first_run = true` (detectado do `.context.md`) E
125
- - Insumos mencionam features/funcionalidades que extrapolam o escopo atual
126
-
127
- Usar template `.github/templates/sf-feature/backlog-extraido.template.md`:
128
- - Funcionalidades fora-de-escopo organizadas em roadmap faseado
129
- - Cada item sugere `/sf-start <nome>` futuro
130
- - Máximo 4-5 fases, priorizando cadastros/fundação na fase 1
131
-
132
- Se `first_run = false` (feature): não gerar. Backlog é artefato de bootstrap.
133
-
134
- ### 7. Gerar/atualizar `.extract-log.md`
135
-
136
- ```markdown
137
- # Extract Log — $ARGUMENTS
138
-
139
- ## Extração N — {{ISO_DATETIME}}
140
-
141
- | Arquivo | Hash | Classificação | Status | Seções PRD | Categoria chunks |
142
- |---------|------|---------------|--------|-----------|------------------|
143
- | ... | ... | NOVO | extraído | §3, §5, §7 | produto, both |
144
- | ... | ... | NOVO | extraído | — | tech (stack, infra) |
145
-
146
- ### Tech chunks (pro /sf-design consumir)
147
-
148
- | Arquivo | Linhas/seção | Categoria | Conteúdo resumido |
149
- |---------|--------------|-----------|-------------------|
150
- | stack.md | toda | tech: stack | .NET 8 + React + PostgreSQL |
151
- | schema.sql | CREATE TABLE users | tech: db | Entidades iniciais |
152
- | infra.md | §3 | tech: infra | Docker + GitHub Actions |
153
- ```
154
-
155
- Chunks categorizados como `tech` ou `both` alimentam o `/sf-design` sem re-ler os insumos.
156
-
157
- ### 8. Atualizar `.context.md`
158
-
159
- ```yaml
160
- status: "extract_done"
161
- prd_empty: "{true|false}" # resultado do 4.1
162
- ultima_skill: "/sf-extract"
163
- atualizado_em: "{{ISO_DATETIME}}"
164
- ```
165
-
166
- ### 9. Publicar PRD no backend (OBRIGATÓRIO quando config existe)
167
-
168
- **Este passo NÃO é opcional**. Tomar decisão baseada em arquivo, não em intenção:
169
-
170
- | Detecção | Ação |
171
- |----------|------|
172
- | `sfw.config.yml` NÃO existe | Pular silenciosamente (projeto 100% local). Registrar no output da skill: "publish: skipped (no sfw.config.yml)" |
173
- | `sfw.config.yml` existe | **Chamar `/sf-publish $ARGUMENTS PRD`** sem "se", sem "talvez". Execute. |
174
-
175
- `/sf-publish` internamente respeita `mode` de cada target (`auto`/`manual`/`off`) e lida com `empty: true` (publica com nota).
176
-
177
- Ver `.github/skills/sf-publish/SKILL.md`.
178
-
179
- ### 10. Saída obrigatória
180
-
181
- Antes de terminar, a skill DEVE reportar:
182
-
183
- ```
184
- /sf-extract $ARGUMENTS — completo
185
-
186
- Artefatos locais:
187
- - workspace/Output/$ARGUMENTS/PRD.md (empty: {true|false})
188
- - workspace/Output/$ARGUMENTS/.extract-log.md
189
- - workspace/Output/$ARGUMENTS/backlog_extraido.md (se aplicável)
190
-
191
- Publish:
192
- - {target-name}: {CREATED|UPDATED|SKIPPED|CONFLICT|ERROR} — ver .ai/sf-publish-log.md
193
- OU
194
- - SKIPPED (no sfw.config.yml) — projeto 100% local
195
-
196
- Próximo passo:
197
- /sf-design $ARGUMENTS ← após revisar PRD e responder ambiguidades §14
198
- ```
199
-
200
- Se `/sf-publish` retornou ERROR, a skill NÃO falhaapenas reporta no output pro user decidir. Artefato local está salvo.
201
-
202
- ## Como responder ambiguidades (PRD §14)
203
-
204
- Quando `/sf-design` bloquear por ambiguidades pendentes, o usuário deve respondê-las
205
- **editando o próprio PRD** (caminho oficial). Fluxo:
206
-
207
- 1. Abrir `workspace/Output/$ARGUMENTS/PRD.md`
208
- 2. Ir até **§14 Ambiguidades**
209
- 3. Para cada linha sem resposta: preencher a coluna **`Resposta`** com texto objetivo
210
- 4. Salvar o arquivo
211
- 5. Rodar `/sf-design $ARGUMENTS` novamente o gate vai passar
212
-
213
- Exemplo:
214
-
215
- ```markdown
216
- | ID | Pergunta | Origem | Resposta | Resolvido em docs/ |
217
- |----|----------|--------|----------|--------------------|
218
- | AMB-001 | Qual o formato esperado de CPF? | schema.sql §3 | Sem máscara, 11 chars | |
219
- | AMB-002 | Quais perfis acessam /admin? | requisitos.md | Apenas role=ADMIN | — |
220
- ```
221
-
222
- **Regras:**
223
- - Resposta vazia ou `—` ainda bloqueia o `/sf-design`
224
- - Marcação `resolvido em docs/{arquivo} §{seção}` é gerada pelo Analyzer (4.2)não preencher manualmente
225
- - Resposta uma vez aceita pelo `/sf-design` é registrada permanentemente; não precisa repetir em re-extração
226
-
227
- **Quando o caminho A não basta** (mudança estrutural — nova entidade, mudança de escopo,
228
- contradição que exige novos insumos): adicionar arquivo de ajuste em
229
- `workspace/Input/$ARGUMENTS/ajustes_v1.md` e rodar `/sf-extract` de novo. O hash detecta
230
- NOVO → merge aditivo regenera PRD.
231
-
232
- ## Re-extração
233
-
234
- - Merge ADITIVO com PRD existente (nunca remove info de inalterados)
235
- - Seções afetadas marcadas com `<!-- ATUALIZADO: re-extração ISO_DATE -->`
236
- - Novos IDs continuam sequência (RN-001, RN-002, ...)
237
- - Tech chunks no extract-log também são append-only
238
- - Se PRD era `empty: true` e re-extração encontra produto → flip pra `empty: false` + preencher seções
239
-
240
- ## Erros
241
-
242
- | Erro | Ação |
243
- |------|------|
244
- | Pasta vazia | Parar, listar formatos aceitos |
245
- | `.context.md` não existe | Parar, sugerir `/sf-start $ARGUMENTS` |
246
- | Nenhum arquivo novo/modificado | Informar "Nenhuma alteração detectada" |
247
- | Arquivo não identificado | Registrar no log, gerar ambiguidade |
248
- | Contradição entre arquivos | Gerar ambiguidade citando os dois |
249
- | `docs/` consultado e contradiz insumo | Gerar ambiguidade especial: "insumo X diverge de docs/Y §Z — qual prevalece?" |
1
+
2
+ # /sf-extract $ARGUMENTS
3
+
4
+ Skill atômica de extração. insumos brutos de `workspace/Input/$ARGUMENTS/` e gera **PRD e/ou TRD** conforme o conteúdo dos insumos.
5
+ `$ARGUMENTS` = nome do scope (ex: `app_barbearia`, `feat_cadastro_cliente`).
6
+
7
+ ## Multi-agent
8
+
9
+ | Agente | Modelo | Papel |
10
+ |--------|--------|-------|
11
+ | **Reader** (1 por arquivo) | Sonnet | e cataloga 1 arquivo. Não interpreta, apenas cataloga |
12
+ | **Produto-Analyzer** | Opus | Consolida conteúdo de produto → gera PRD (se aplicável) |
13
+ | **Tech-Analyzer** | Opus | Consolida conteúdo técnico → gera TRD (se aplicável) |
14
+
15
+ ## Pré-condições
16
+
17
+ | # | Validação | Se falhar |
18
+ |---|-----------|-----------|
19
+ | 1 | `$ARGUMENTS` informado | Parar → "Informe o nome. Ex: /sf-extract feat_cadastro_cliente" |
20
+ | 2 | `workspace/Input/$ARGUMENTS/` existe com arquivos | Parar → "Pasta vazia. Rode /sf-load $ARGUMENTS ou coloque insumos manualmente" |
21
+ | 3 | `workspace/Output/$ARGUMENTS/.context.md` existe | Parar → "Execute /sf-start $ARGUMENTS primeiro" |
22
+ | 4 | Status é `discovery_done` ou `extract_done` | Se anterior → "Rode /sf-discovery primeiro". Se posterior → "Extração já aprovada. Edite .context.md pra re-extrair" |
23
+
24
+ ## Passos
25
+
26
+ ### 1. Carregar contexto
27
+
28
+ - `.context.md` `first_run`, status
29
+ - `discovery.md` (obrigatório em v4) → análise profunda prévia dos insumos
30
+ - **`docs/` se existir** — usar como baseline pra responder checklist sem perguntar
31
+ - Templates:
32
+ - `.github/templates/feature/PRD.template.md`
33
+ - `.github/templates/feature/TRD.template.md`
34
+ - `.github/templates/feature/extract-log.template.md` (append-only)
35
+
36
+ ### 2. Inventariar insumos
37
+
38
+ Para cada arquivo em `workspace/Input/$ARGUMENTS/` (ignorar `.gitkeep`):
39
+ - Calcular hash SHA-256 (primeiros 8 chars)
40
+ - Se `.extract-log.md` existe classificar: NOVO / MODIFICADO / INALTERADO
41
+ - Se não existe → todos são NOVOS
42
+
43
+ ### 3. Processar (Reader por arquivo, em paralelo)
44
+
45
+ Para cada arquivo NOVO ou MODIFICADO, Reader cataloga sem interpretar:
46
+
47
+ | Formato | O que extrair (cru) |
48
+ |---------|---------------------|
49
+ | .md, .txt | Parágrafos, listas, tabelas, qualquer menção a domínio/técnica |
50
+ | .sql | CREATE TABLE, constraints, índices, comentários, referências |
51
+ | .html | Campos, rotas, ações, permissões, estados (data-*) |
52
+ | .xml (drawio) | Fluxos, decisões, atores, sequências |
53
+ | .csv | Dados tabulares, mapeamentos |
54
+ | .png, .jpg, .pdf | Análise visual (wireframes, mockups) |
55
+ | Não identificado | Registrar NÃO IDENTIFICADO, gerar ambiguidade |
56
+
57
+ Reader devolve estrutura com **tudo que viu**, sem categorizar produto/tech.
58
+
59
+ ### 4. Consolidar decisão de quais docs gerar
60
+
61
+ Após todos os Readers, o skill decide:
62
+
63
+ - **Há conteúdo de produto?** (jornadas, atores, RNs, UX, telas)
64
+ - SIM → Produto-Analyzer gera PRD
65
+ - NÃO PRD não é criado; `prd_existe = false` no `.context.md`
66
+ - **Há conteúdo técnico?** (stack, schema, endpoints, infra, segurança)
67
+ - SIM Tech-Analyzer gera TRD
68
+ - NÃO TRD não é criado; `trd_existe = false` no `.context.md`
69
+
70
+ **Ambos falsos** = extração falhou: erro "insumos sem conteúdo utilizável" + listar ambiguidade pedindo esclarecimento.
71
+
72
+ **Cenários típicos**:
73
+ - first-run de projeto novo com brief de produto + decisões técnicas → PRD + TRD (caso comum)
74
+ - bootstrap de infra (só docs técnicas) TRD
75
+ - feature de UX pura em projeto maduro (sem impacto técnico) → só PRD (raro)
76
+
77
+ ### 5. Produto-Analyzer (se aplicável)
78
+
79
+ Gera PRD.md seguindo `templates/feature/PRD.template.md`:
80
+
81
+ - 13 seções fixas
82
+ - RNs com IDs estáveis (RN-001...)
83
+ - §11 Fora de Escopo: sugerir `/sf-start <nome>` pros itens (em vez de "backlog_extraido")
84
+ - §12 Ambiguidades: perguntas bloqueantes (o PM vai responder)
85
+ - §13 Rastreabilidade: de qual insumo veio cada seção
86
+
87
+ Antes de marcar ambiguidade, consultar `docs/domain.md` e `docs/conventions.md` —
88
+ se resposta está lá, marcar "resolvido em docs/X §Y" em vez de perguntar.
89
+
90
+ ### 6. Tech-Analyzer (se aplicável)
91
+
92
+ Gera TRD.md seguindo `templates/feature/TRD.template.md`:
93
+
94
+ - 11 seções fixas organizadas por área (§Sistema + §Área-X + transversais)
95
+ - GATEs SIM/NÃO por §Área: preenche áreas que a feature toca
96
+ - §1 §Sistema é GATE=SIM sempre em first-run (baseline completo)
97
+ - ADRs em §9 (imutáveis após aceitas; sincronizadas em docs/decisions.md via /sf-merge-docs)
98
+ - §10 Ambiguidades técnicas: perguntas bloqueantes (o dev vai responder)
99
+
100
+ Antes de marcar ambiguidade, consultar `docs/architecture.md`, `docs/conventions.md`,
101
+ `docs/apiContracts.md`, `docs/decisions.md` se resposta está lá, marcar
102
+ "resolvido em docs/X §Y".
103
+
104
+ ### 7. Checklist de temas críticos (FIXO)
105
+
106
+ Rodar sempre, após consulta a `docs/`. Temas não cobertos nem por insumos nem
107
+ por `docs/` viram ambiguidades em PRD se é de produto, em TRD se é técnico:
108
+
109
+ | # | Tema | Doc destino se vazio | Texto da ambiguidade |
110
+ |---|------|---------------------|----------------------|
111
+ | 1 | Autenticação — mecanismo (JWT/OAuth/session) + operações protegidas | TRD §7.1 | "Mecanismo/escopo de auth não definido" |
112
+ | 2 | Autorização / Papéis — perfis, matriz, granularidade | TRD §7.2 | "Papéis e permissões não definidos" |
113
+ | 3 | Separação de serviços — mono/micro, API vs Worker vs Web | TRD §1.2 | "Arquitetura de serviços não definida" |
114
+ | 4 | Ambientes & deploy — dev/staging/prod, CI/CD | TRD §1.3-§1.4 e §5 | "Estratégia de ambientes não definida" |
115
+ | 5 | Dados sensíveis / LGPD | TRD §7.3 | "Tratamento de PII não mencionado" |
116
+ | 6 | Validações de entrada (schema) | TRD §2.3 | "Validações de schema não detalhadas" |
117
+ | 7 | Cenários de erro de produto | PRD §8 | "Cenários de erro não definidos" |
118
+ | 8 | Impacto em dados existentes (migração) | TRD §4.3 | "Impacto em dados existentes não avaliado" |
119
+ | 9 | Métricas de sucesso (produto) | PRD §9 | "Como medir sucesso desta feature?" |
120
+
121
+ > Analyzer NÃO inventa respostas. Se não está em insumo NEM em `docs/`, PERGUNTA.
122
+ > Em scope só-PRD ou só-TRD, temas fora do domínio correspondente são ignorados.
123
+
124
+ ### 8. Gerar/atualizar `.extract-log.md`
125
+
126
+ ```markdown
127
+ ## Extração N — {{ISO_DATETIME}}
128
+
129
+ | Arquivo | Hash | Classificação | Status | Destino |
130
+ |---------|------|---------------|--------|---------|
131
+ | requisitos.md | a3f29c1d | NOVO | extraído | PRD §1, §3, §5 + TRD §2.1 |
132
+ ```
133
+
134
+ Campo "Destino" mostra em qual doc (PRD/TRD) e em quais seções a info foi.
135
+
136
+ ### 9. Atualizar `.context.md`
137
+
138
+ ```yaml
139
+ status: "extract_done"
140
+ prd_existe: {{true|false}} # resultado do passo 4
141
+ trd_existe: {{true|false}} # resultado do passo 4
142
+ prd_aprovado: false # user vai aprovar manualmente
143
+ trd_aprovado: false # idem
144
+ ultima_skill: "/sf-extract"
145
+ atualizado_em: "{{ISO_DATETIME}}"
146
+ ```
147
+
148
+ ### 10. Publicar no backend (se `sfw.config.yml` existe)
149
+
150
+ Chamar `/sf-publish $ARGUMENTS PRD` (se `prd_existe=true`) e
151
+ `/sf-publish $ARGUMENTS TRD` (se `trd_existe=true`). Respeita `mode` de cada target.
152
+ Ver `.github/skills/sf-publish/SKILL.md`.
153
+
154
+ ### 11. Saída obrigatória
155
+
156
+ ```
157
+ /sf-extract $ARGUMENTS completo
158
+
159
+ Artefatos locais:
160
+ - workspace/Output/$ARGUMENTS/PRD.md (gerado: {{true|false}})
161
+ - workspace/Output/$ARGUMENTS/TRD.md (gerado: {{true|false}})
162
+ - workspace/Output/$ARGUMENTS/.extract-log.md
163
+
164
+ Publish:
165
+ - {target-name}: PRD: {{status}} | TRD: {{status}}
166
+ OU
167
+ - SKIPPED (no sfw.config.yml) — projeto 100% local
168
+
169
+ Próximos passos:
170
+ 1. [PM] Revise workspace/Output/$ARGUMENTS/PRD.md e aprove:
171
+ - Abra o arquivo, preencha §12 Ambiguidades (coluna "Resposta")
172
+ - Marque prd_aprovado=true em .context.md quando aprovar
173
+ (se PRD não foi gerado, pule)
174
+
175
+ 2. [dev] Revise workspace/Output/$ARGUMENTS/TRD.md e aprove:
176
+ - Abra o arquivo, preencha §10 Ambiguidades técnicas
177
+ - Marque trd_aprovado=true em .context.md quando aprovar
178
+ (se TRD não foi gerado, pule)
179
+
180
+ 3. Após aprovações relevantes: /sf-design $ARGUMENTS
181
+ ```
182
+
183
+ Se `/sf-publish` retornou ERROR, a skill NÃO falha — apenas reporta. Artefato local salvo.
184
+
185
+ ## Como responder ambiguidades (PRD §12 e TRD §10)
186
+
187
+ Mesma mecânica pros 2 docs. Quando `/sf-design` bloquear por ambiguidades pendentes:
188
+
189
+ 1. Abrir `workspace/Output/$ARGUMENTS/PRD.md` (ou TRD.md)
190
+ 2. Ir até §Ambiguidades (§12 no PRD, §10 no TRD)
191
+ 3. Para cada linha sem resposta: preencher a coluna **`Resposta`** com texto objetivo
192
+ 4. Salvar
193
+ 5. Rodar `/sf-design $ARGUMENTS` novamente — gate vai passar
194
+
195
+ **Regras:**
196
+ - Resposta vazia ou `—` → ainda bloqueia
197
+ - Marcação `resolvido em docs/{arquivo} §{seção}` é gerada pelo Analyzer — não preencher manualmente
198
+ - Respostas são permanentes; não precisa repetir em re-extração
199
+
200
+ **Quando esse caminho não basta** (mudança estrutural grandenova entidade, mudança
201
+ de escopo, contradição que exige novos insumos): adicionar arquivo de ajuste em
202
+ `workspace/Input/$ARGUMENTS/ajustes_v1.md` e rodar `/sf-extract` de novo. O hash detecta
203
+ NOVO → merge aditivo regenera PRD/TRD.
204
+
205
+ ## Re-extração
206
+
207
+ - Merge ADITIVO com PRD/TRD existentes (nunca remove info de arquivos inalterados)
208
+ - Seções afetadas marcadas com `<!-- ATUALIZADO: re-extração ISO_DATE -->`
209
+ - Novos IDs (RN-NNN no PRD, ADR-NNN no TRD) continuam sequência
210
+ - Se PRD era inexistente e re-extração encontra produto → cria PRD agora
211
+ (`prd_existe` vira true; `prd_aprovado` volta pra false pra nova revisão)
212
+ - Idem pro TRD
213
+
214
+ ## Erros
215
+
216
+ | Erro | Ação |
217
+ |------|------|
218
+ | Pasta vazia | Parar, listar formatos aceitos |
219
+ | `.context.md` não existe | Parar, sugerir `/sf-start $ARGUMENTS` |
220
+ | Status anterior a `discovery_done` | Parar → "/sf-discovery antes de /sf-extract" |
221
+ | Nenhum arquivo novo/modificado | Informar "Nenhuma alteração detectada" |
222
+ | Arquivo não identificado | Registrar no log, gerar ambiguidade |
223
+ | Contradição entre arquivos | Gerar ambiguidade citando os dois |
224
+ | `docs/` contradiz insumo | Ambiguidade especial: "insumo X diverge de docs/Y §Z qual prevalece?" |
225
+ | Insumos não geram PRD NEM TRD | Erro "insumos sem conteúdo utilizável" + pedir esclarecimento |