spec-first-copilot 0.7.0 → 0.8.0-beta.2

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.
@@ -1,93 +1,93 @@
1
- ---
2
- name: sf-session-finish
3
- description: |
4
- Encerrar sessão. Salva estado, atualiza napkin, gera retomada.md.
5
- Trigger: /sf-session-finish
6
- author: GustavoMaritan
7
- version: 1.0.0
8
- date: 2026-04-08
9
- ---
10
-
11
- # /sf-session-finish
12
-
13
- Encerra a sessão de trabalho de forma organizada.
14
- Consolida estado, atualiza memória, gera ponto de retomada para a próxima sessão.
15
-
16
- ## Passos
17
-
18
- ### 1. Levantar estado atual
19
-
20
- Para cada `.context.md` em `workspace/Output/*/`:
21
- - Status atual + Progresso.md (% concluído, fase atual)
22
- - Tasks em andamento
23
-
24
- ### 2. Verificar working tree dos repos
25
-
26
- Para cada repo em `projetos/`:
27
- ```bash
28
- cd projetos/{repo}
29
- git status --short
30
- git log --oneline -3
31
- ```
32
- - Se working tree sujo → avisar (sugerir commit antes de pausar)
33
-
34
- ### 3. Atualizar `.ai/memory/napkin.md`
35
-
36
- Atualizar seção `## Sessão Atual` com:
37
- - Data, o que foi feito, o que estava em andamento
38
- - Decisões tomadas, armadilhas encontradas
39
-
40
- ### 4. Gerar resumo de retomada
41
-
42
- Criar/atualizar `workspace/Output/retomada.md`:
43
-
44
- ```markdown
45
- # Ponto de Retomada — {{DATA}}
46
-
47
- > Gerado pelo /sf-session-finish. Leia este arquivo ao iniciar a próxima sessão.
48
-
49
- ## Estado geral
50
-
51
- | Feature/Setup | Status | Fase atual | % | Próxima ação |
52
- |---------------|--------|------------|---|-------------|
53
- | {{nome}} | {{status}} | Fase {{N}} | {{%}} | {{ação}} |
54
-
55
- ## Repos — estado do git
56
-
57
- | Repo | Branch ativa | Working tree | Último commit |
58
- |------|-------------|-------------|---------------|
59
- | {{repo}} | {{branch}} | limpo/sujo | {{commit msg}} |
60
-
61
- ## O que estava em andamento
62
-
63
- - Task: {{AREA-NNN}} — {{descrição}}
64
- - Bloqueios: {{se houver}}
65
- - Decisões pendentes: {{se houver}}
66
-
67
- ## Para retomar
68
-
69
- 1. {{Passo 1 — ex: "Subir infra: docker compose up -d"}}
70
- 2. {{Passo 2 — ex: "Continuar /sf-dev feat_mvp --fase 2"}}
71
- 3. {{Passo 3 — ex: "Resolver ambiguidade X do PRD"}}
72
-
73
- ## Aprendizados desta sessão
74
-
75
- - {{Decisão ou armadilha que vale registrar}}
76
- ```
77
-
78
- ### 5. Informar ao usuário
79
-
80
- ```
81
- ✅ Sessão encerrada. Estado salvo em:
82
- - `.ai/memory/napkin.md` — memória atualizada
83
- - `workspace/Output/retomada.md` — ponto de retomada
84
-
85
- Para retomar:
86
- 1. Ler retomada.md
87
- 2. Seguir os passos listados
88
- ```
89
-
90
- ## Notas
91
- - Não modifica .context.md (status da pipeline não muda)
92
- - Não faz commit automático — avisa se working tree sujo
93
- - `retomada.md` é sobrescrito a cada /sf-session-finish (ponto atual, não histórico)
1
+ ---
2
+ name: sf-session-finish
3
+ description: |
4
+ Encerrar sessão. Salva estado, atualiza napkin, gera retomada.md.
5
+ Trigger: /sf-session-finish
6
+ author: GustavoMaritan
7
+ version: 1.0.0
8
+ date: 2026-04-08
9
+ ---
10
+
11
+ # /sf-session-finish
12
+
13
+ Encerra a sessão de trabalho de forma organizada.
14
+ Consolida estado, atualiza memória, gera ponto de retomada para a próxima sessão.
15
+
16
+ ## Passos
17
+
18
+ ### 1. Levantar estado atual
19
+
20
+ Para cada `.context.md` em `workspace/Output/*/`:
21
+ - Status atual + Progresso.md (% concluído, fase atual)
22
+ - Tasks em andamento
23
+
24
+ ### 2. Verificar working tree dos repos
25
+
26
+ Para cada repo em `projetos/`:
27
+ ```bash
28
+ cd projetos/{repo}
29
+ git status --short
30
+ git log --oneline -3
31
+ ```
32
+ - Se working tree sujo → avisar (sugerir commit antes de pausar)
33
+
34
+ ### 3. Atualizar `.ai/memory/napkin.md`
35
+
36
+ Atualizar seção `## Sessão Atual` com:
37
+ - Data, o que foi feito, o que estava em andamento
38
+ - Decisões tomadas, armadilhas encontradas
39
+
40
+ ### 4. Gerar resumo de retomada
41
+
42
+ Criar/atualizar `workspace/Output/retomada.md`:
43
+
44
+ ```markdown
45
+ # Ponto de Retomada — {{DATA}}
46
+
47
+ > Gerado pelo /sf-session-finish. Leia este arquivo ao iniciar a próxima sessão.
48
+
49
+ ## Estado geral
50
+
51
+ | Feature/Setup | Status | Fase atual | % | Próxima ação |
52
+ |---------------|--------|------------|---|-------------|
53
+ | {{nome}} | {{status}} | Fase {{N}} | {{%}} | {{ação}} |
54
+
55
+ ## Repos — estado do git
56
+
57
+ | Repo | Branch ativa | Working tree | Último commit |
58
+ |------|-------------|-------------|---------------|
59
+ | {{repo}} | {{branch}} | limpo/sujo | {{commit msg}} |
60
+
61
+ ## O que estava em andamento
62
+
63
+ - Task: {{AREA-NNN}} — {{descrição}}
64
+ - Bloqueios: {{se houver}}
65
+ - Decisões pendentes: {{se houver}}
66
+
67
+ ## Para retomar
68
+
69
+ 1. {{Passo 1 — ex: "Subir infra: docker compose up -d"}}
70
+ 2. {{Passo 2 — ex: "Continuar /sf-dev feat_mvp --fase 2"}}
71
+ 3. {{Passo 3 — ex: "Resolver ambiguidade X do PRD"}}
72
+
73
+ ## Aprendizados desta sessão
74
+
75
+ - {{Decisão ou armadilha que vale registrar}}
76
+ ```
77
+
78
+ ### 5. Informar ao usuário
79
+
80
+ ```
81
+ ✅ Sessão encerrada. Estado salvo em:
82
+ - `.ai/memory/napkin.md` — memória atualizada
83
+ - `workspace/Output/retomada.md` — ponto de retomada
84
+
85
+ Para retomar:
86
+ 1. Ler retomada.md
87
+ 2. Seguir os passos listados
88
+ ```
89
+
90
+ ## Notas
91
+ - Não modifica .context.md (status da pipeline não muda)
92
+ - Não faz commit automático — avisa se working tree sujo
93
+ - `retomada.md` é sobrescrito a cada /sf-session-finish (ponto atual, não histórico)
@@ -1,192 +1,192 @@
1
-
2
- # /sf-start <nome>
3
-
4
- Orquestrador único de entrada do pipeline SFW v4.
5
- Mesma lógica pra qualquer scope (bootstrap, feature, bug, task técnica).
6
- Distinção "bootstrap vs feature" é derivada automaticamente da existência de `docs/`.
7
-
8
- ## Argumento
9
-
10
- `<nome>` = nome do scope no Input (título da page no Confluence, nome da pasta no filesystem).
11
- Usuário nomeia livremente. Convenção sugerida (opcional):
12
-
13
- - Bootstrap/setup: `app_<nome_projeto>`, `bootstrap`, `setup_<nome>`
14
- - Features: `feat_<nome_descritivo>`
15
- - Bugs: `bug_<nome_descritivo>`
16
- - Tasks técnicas: `task_<nome_descritivo>`
17
-
18
- Framework aceita qualquer nome. Convenção é pra organização visual no Input.
19
-
20
- ## Execução
21
-
22
- Siga EXATAMENTE os passos em ordem. Leia o arquivo completo antes de agir.
23
-
24
- ### Passo 1 — Detectar first_run
25
-
26
- | Condição | Significado |
27
- |----------|-------------|
28
- | `docs/` ausente ou vazio | **first_run = true** — bootstrap do projeto. `/sf-design` vai criar `docs/` + `projetos.yaml` a partir do TRD |
29
- | `docs/` populado (≥1 arquivo) | **first_run = false** — feature/incremento. `docs/` atualizado via `/sf-merge-docs` no fim do `/sf-dev` |
30
-
31
- Registrar no `.context.md` (Passo 4). **Imutável** depois de criado.
32
-
33
- ### Passo 2 — Carregar insumos do backend (`/sf-load`)
34
-
35
- **SEMPRE executar**, independente do Input já existir local.
36
- `/sf-load` é idempotente — se já existe, detecta INALTERADO e não sobrescreve.
37
-
38
- ```
39
- Executar /sf-load {nome}
40
- ```
41
-
42
- Seguir TODOS os passos do `/sf-load` (ver `.github/skills/sf-load/SKILL.md`):
43
- - Ler `sfw.config.yml` pra saber o adapter
44
- - Buscar scope `{nome}` no backend
45
- - Descer recursivamente até o último nível
46
- - Materializar TUDO em `workspace/Input/{nome}/`
47
- - Registrar no `.ai/load-log.md`
48
-
49
- **Se `sfw.config.yml` não existe**: projeto é 100% local.
50
- Pular `/sf-load` e ir direto pro Passo 3. Usuário deve ter colocado insumos
51
- manualmente em `workspace/Input/{nome}/`.
52
-
53
- ### Passo 3 — Validar pré-condições
54
-
55
- | # | Validação | Se falhar |
56
- |---|-----------|-----------|
57
- | 1 | `<nome>` foi informado como argumento | Parar → "Informe o nome. Ex: /sf-start feat_cadastro_cliente" |
58
- | 2 | `workspace/Input/{nome}/` existe e contém ≥1 arquivo | Parar → "Nenhum insumo encontrado. Verifique o backend ou crie workspace/Input/{nome}/ manualmente" |
59
- | 3 | `workspace/Output/{nome}/.context.md` não existe OU tem status `not_started` | Se avançado → "Scope já em andamento. Status: {status}. Para continuar de onde parou, rode a skill do próximo estágio" |
60
-
61
- ### Passo 4 — Criar estrutura de Output + `.context.md`
62
-
63
- 1. Criar `workspace/Output/{nome}/` se não existir
64
- 2. Criar `.context.md` usando template `.github/templates/feature/context.template.md`:
65
-
66
- ```yaml
67
- ---
68
- nome: "{nome}"
69
- first_run: {true|false} # derivado do Passo 1 (SEM aspas, bool real)
70
- prd_existe: false # /sf-extract preenche
71
- trd_existe: false # /sf-extract preenche
72
- prd_aprovado: false # usuário (PM) marca true após revisar PRD
73
- trd_aprovado: false # usuário (dev) marca true após revisar TRD
74
- areas_tocadas: [] # /sf-design preenche a partir dos GATEs do TRD
75
- input_path: "workspace/Input/{nome}/"
76
- status: "not_started"
77
- ultima_skill: "/sf-start"
78
- atualizado_em: "{{ISO_DATETIME}}"
79
- ---
80
- ```
81
-
82
- ### Passo 5 — Executar `/sf-discovery` (OBRIGATÓRIO em v4)
83
-
84
- > **Breaking v4**: discovery deixou de ser opcional. Força entendimento dos
85
- > insumos antes da extração. Reduz iteração de fix em PRD/TRD.
86
-
87
- ```
88
- Executar /sf-discovery workspace/Input/{nome}/
89
- ```
90
-
91
- Seguir `.github/skills/sf-discovery/SKILL.md`. Output: `workspace/Output/{nome}/sf-discovery.md`.
92
-
93
- Atualizar `.context.md`:
94
- ```yaml
95
- status: "discovery_done"
96
- ultima_skill: "/sf-discovery"
97
- ```
98
-
99
- ### Passo 6 — Executar `/sf-extract`
100
-
101
- ```
102
- Executar /sf-extract {nome}
103
- ```
104
-
105
- Seguir `.github/skills/sf-extract/SKILL.md`. Pode gerar **PRD, TRD ou ambos** — dependendo
106
- dos insumos. Outputs:
107
-
108
- - `workspace/Output/{nome}/PRD.md` — se insumos têm conteúdo de produto
109
- - `workspace/Output/{nome}/TRD.md` — se insumos têm conteúdo técnico
110
- - `workspace/Output/{nome}/.extract-log.md` — hashes + destino por arquivo
111
-
112
- `/sf-extract` atualiza `.context.md`:
113
- ```yaml
114
- status: "extract_done"
115
- prd_existe: {true|false}
116
- trd_existe: {true|false}
117
- ```
118
-
119
- ### Passo 7 — CHECKPOINT DUPLO — aprovação PM + dev
120
-
121
- Após `/sf-extract`, o orquestrador **para** e informa o usuário. Há 2 aprovações
122
- paralelas (ordem irrelevante entre elas, ambas precisam antes de prosseguir):
123
-
124
- ```
125
- /sf-extract completou. Próximos passos:
126
-
127
- ┌─ [PM APROVA PRD] (se prd_existe=true)
128
- │ 1. Abra workspace/Output/{nome}/PRD.md
129
- │ 2. Revise as 13 seções
130
- │ 3. Responda ambiguidades em §12 (coluna `Resposta`)
131
- │ 4. Quando aprovar, edite .context.md: prd_aprovado: true
132
-
133
- ├─ [DEV APROVA TRD] (se trd_existe=true)
134
- │ 1. Abra workspace/Output/{nome}/TRD.md
135
- │ 2. Revise as 11 seções (§Sistema + GATEs §Área-*)
136
- │ 3. Responda ambiguidades em §10 (coluna `Resposta`)
137
- │ 4. Quando aprovar, edite .context.md: trd_aprovado: true
138
-
139
- └─ Quando as aprovações aplicáveis estiverem true, execute:
140
- /sf-design {nome}
141
- ```
142
-
143
- **Cenários**:
144
- - `prd_existe=true + trd_existe=true` (maioria): precisa PM aprovar PRD E dev aprovar TRD
145
- - `prd_existe=true + trd_existe=false`: só PM precisa aprovar PRD
146
- - `prd_existe=false + trd_existe=true`: só dev precisa aprovar TRD
147
- - `prd_existe=false + trd_existe=false`: extract reportou erro (não é possível chegar aqui)
148
-
149
- ### Passo 8 — Encerrar orquestrador
150
-
151
- Após o CHECKPOINT do Passo 7, `/sf-start` **encerra**. O usuário revisa e aprova
152
- manualmente os docs, depois chama `/sf-design {nome}`.
153
-
154
- **Pipeline completo (para referência do usuário)**:
155
-
156
- ```
157
- /sf-start {nome} ← ORQUESTRADOR (este skill)
158
- ├─ /sf-load (se backend configurado)
159
- ├─ /sf-discovery (obrigatório)
160
- ├─ /sf-extract → gera PRD e/ou TRD
161
- └─ STOP: aguarda aprovação PM (PRD) + aprovação dev (TRD)
162
-
163
- [manual: revisar PRD.md, marcar prd_aprovado=true]
164
- [manual: revisar TRD.md, marcar trd_aprovado=true]
165
-
166
- /sf-design {nome}
167
- ├─ first_run=true: cria docs/ (5 arquivos) + projetos.yaml
168
- ├─ sempre: gera specs/{nome}/ (brief, contracts, scenarios)
169
- └─ status → design_done
170
-
171
- /sf-plan {nome}
172
- └─ gera specs/{nome}/tasks.md + workspace/Output/{nome}/Progresso.md
173
- └─ status → plan_done
174
-
175
- /sf-dev {nome} (ou /sf-dev {nome} --fase 1)
176
- ├─ first_run=true: INFRA-001 cria/clona repos em projetos/
177
- ├─ implementa tasks com loop (coder → review → security review)
178
- ├─ E2E + aprovação
179
- ├─ se feature (first_run=false): chama /sf-merge-docs automaticamente
180
- └─ status → dev_done → done
181
- ```
182
-
183
- ## Notas
184
-
185
- - `/sf-load` é sempre o 1º passo real — garante Input sincronizado com backend
186
- - Se não há `sfw.config.yml`, projeto é 100% local e `/sf-load` é pulado
187
- - `first_run` é imutável após criação do `.context.md`
188
- - `docs/` em first_run: NASCE no `/sf-design` (não no `/sf-extract`) a partir do TRD
189
- - `projetos.yaml` é gerado pelo `/sf-design` em first_run
190
- - **Aprovação dupla**: mesmo em time pequeno (dev = PM), mantém as 2 marcações —
191
- "fluxo fica mais claro" vence cerimônia-mínima (decisão de v4)
192
- - Ambiguidades em §12 PRD / §10 TRD são BLOQUEANTES — `/sf-design` não avança sem respostas
1
+
2
+ # /sf-start <nome>
3
+
4
+ Orquestrador único de entrada do pipeline SFW v4.
5
+ Mesma lógica pra qualquer scope (bootstrap, feature, bug, task técnica).
6
+ Distinção "bootstrap vs feature" é derivada automaticamente da existência de `docs/`.
7
+
8
+ ## Argumento
9
+
10
+ `<nome>` = nome do scope no Input (título da page no Confluence, nome da pasta no filesystem).
11
+ Usuário nomeia livremente. Convenção sugerida (opcional):
12
+
13
+ - Bootstrap/setup: `app_<nome_projeto>`, `bootstrap`, `setup_<nome>`
14
+ - Features: `feat_<nome_descritivo>`
15
+ - Bugs: `bug_<nome_descritivo>`
16
+ - Tasks técnicas: `task_<nome_descritivo>`
17
+
18
+ Framework aceita qualquer nome. Convenção é pra organização visual no Input.
19
+
20
+ ## Execução
21
+
22
+ Siga EXATAMENTE os passos em ordem. Leia o arquivo completo antes de agir.
23
+
24
+ ### Passo 1 — Detectar first_run
25
+
26
+ | Condição | Significado |
27
+ |----------|-------------|
28
+ | `docs/` ausente ou vazio | **first_run = true** — bootstrap do projeto. `/sf-design` vai criar `docs/` + `projetos.yaml` a partir do TRD |
29
+ | `docs/` populado (≥1 arquivo) | **first_run = false** — feature/incremento. `docs/` atualizado via `/sf-merge-docs` no fim do `/sf-dev` |
30
+
31
+ Registrar no `.context.md` (Passo 4). **Imutável** depois de criado.
32
+
33
+ ### Passo 2 — Carregar insumos do backend (`/sf-load`)
34
+
35
+ **SEMPRE executar**, independente do Input já existir local.
36
+ `/sf-load` é idempotente — se já existe, detecta INALTERADO e não sobrescreve.
37
+
38
+ ```
39
+ Executar /sf-load {nome}
40
+ ```
41
+
42
+ Seguir TODOS os passos do `/sf-load` (ver `.github/skills/sf-load/SKILL.md`):
43
+ - Ler `sfw.config.yml` pra saber o adapter
44
+ - Buscar scope `{nome}` no backend
45
+ - Descer recursivamente até o último nível
46
+ - Materializar TUDO em `workspace/Input/{nome}/`
47
+ - Registrar no `.ai/load-log.md`
48
+
49
+ **Se `sfw.config.yml` não existe**: projeto é 100% local.
50
+ Pular `/sf-load` e ir direto pro Passo 3. Usuário deve ter colocado insumos
51
+ manualmente em `workspace/Input/{nome}/`.
52
+
53
+ ### Passo 3 — Validar pré-condições
54
+
55
+ | # | Validação | Se falhar |
56
+ |---|-----------|-----------|
57
+ | 1 | `<nome>` foi informado como argumento | Parar → "Informe o nome. Ex: /sf-start feat_cadastro_cliente" |
58
+ | 2 | `workspace/Input/{nome}/` existe e contém ≥1 arquivo | Parar → "Nenhum insumo encontrado. Verifique o backend ou crie workspace/Input/{nome}/ manualmente" |
59
+ | 3 | `workspace/Output/{nome}/.context.md` não existe OU tem status `not_started` | Se avançado → "Scope já em andamento. Status: {status}. Para continuar de onde parou, rode a skill do próximo estágio" |
60
+
61
+ ### Passo 4 — Criar estrutura de Output + `.context.md`
62
+
63
+ 1. Criar `workspace/Output/{nome}/` se não existir
64
+ 2. Criar `.context.md` usando template `.github/templates/feature/context.template.md`:
65
+
66
+ ```yaml
67
+ ---
68
+ nome: "{nome}"
69
+ first_run: {true|false} # derivado do Passo 1 (SEM aspas, bool real)
70
+ prd_existe: false # /sf-extract preenche
71
+ trd_existe: false # /sf-extract preenche
72
+ prd_aprovado: false # usuário (PM) marca true após revisar PRD
73
+ trd_aprovado: false # usuário (dev) marca true após revisar TRD
74
+ areas_tocadas: [] # /sf-design preenche a partir dos GATEs do TRD
75
+ input_path: "workspace/Input/{nome}/"
76
+ status: "not_started"
77
+ ultima_skill: "/sf-start"
78
+ atualizado_em: "{{ISO_DATETIME}}"
79
+ ---
80
+ ```
81
+
82
+ ### Passo 5 — Executar `/sf-discovery` (OBRIGATÓRIO em v4)
83
+
84
+ > **Breaking v4**: discovery deixou de ser opcional. Força entendimento dos
85
+ > insumos antes da extração. Reduz iteração de fix em PRD/TRD.
86
+
87
+ ```
88
+ Executar /sf-discovery workspace/Input/{nome}/
89
+ ```
90
+
91
+ Seguir `.github/skills/sf-discovery/SKILL.md`. Output: `workspace/Output/{nome}/sf-discovery.md`.
92
+
93
+ Atualizar `.context.md`:
94
+ ```yaml
95
+ status: "discovery_done"
96
+ ultima_skill: "/sf-discovery"
97
+ ```
98
+
99
+ ### Passo 6 — Executar `/sf-extract`
100
+
101
+ ```
102
+ Executar /sf-extract {nome}
103
+ ```
104
+
105
+ Seguir `.github/skills/sf-extract/SKILL.md`. Pode gerar **PRD, TRD ou ambos** — dependendo
106
+ dos insumos. Outputs:
107
+
108
+ - `workspace/Output/{nome}/PRD.md` — se insumos têm conteúdo de produto
109
+ - `workspace/Output/{nome}/TRD.md` — se insumos têm conteúdo técnico
110
+ - `workspace/Output/{nome}/.extract-log.md` — hashes + destino por arquivo
111
+
112
+ `/sf-extract` atualiza `.context.md`:
113
+ ```yaml
114
+ status: "extract_done"
115
+ prd_existe: {true|false}
116
+ trd_existe: {true|false}
117
+ ```
118
+
119
+ ### Passo 7 — CHECKPOINT DUPLO — aprovação PM + dev
120
+
121
+ Após `/sf-extract`, o orquestrador **para** e informa o usuário. Há 2 aprovações
122
+ paralelas (ordem irrelevante entre elas, ambas precisam antes de prosseguir):
123
+
124
+ ```
125
+ /sf-extract completou. Próximos passos:
126
+
127
+ ┌─ [PM APROVA PRD] (se prd_existe=true)
128
+ │ 1. Abra workspace/Output/{nome}/PRD.md
129
+ │ 2. Revise as 13 seções
130
+ │ 3. Responda ambiguidades em §12 (coluna `Resposta`)
131
+ │ 4. Quando aprovar, edite .context.md: prd_aprovado: true
132
+
133
+ ├─ [DEV APROVA TRD] (se trd_existe=true)
134
+ │ 1. Abra workspace/Output/{nome}/TRD.md
135
+ │ 2. Revise as 11 seções (§Sistema + GATEs §Área-*)
136
+ │ 3. Responda ambiguidades em §10 (coluna `Resposta`)
137
+ │ 4. Quando aprovar, edite .context.md: trd_aprovado: true
138
+
139
+ └─ Quando as aprovações aplicáveis estiverem true, execute:
140
+ /sf-design {nome}
141
+ ```
142
+
143
+ **Cenários**:
144
+ - `prd_existe=true + trd_existe=true` (maioria): precisa PM aprovar PRD E dev aprovar TRD
145
+ - `prd_existe=true + trd_existe=false`: só PM precisa aprovar PRD
146
+ - `prd_existe=false + trd_existe=true`: só dev precisa aprovar TRD
147
+ - `prd_existe=false + trd_existe=false`: extract reportou erro (não é possível chegar aqui)
148
+
149
+ ### Passo 8 — Encerrar orquestrador
150
+
151
+ Após o CHECKPOINT do Passo 7, `/sf-start` **encerra**. O usuário revisa e aprova
152
+ manualmente os docs, depois chama `/sf-design {nome}`.
153
+
154
+ **Pipeline completo (para referência do usuário)**:
155
+
156
+ ```
157
+ /sf-start {nome} ← ORQUESTRADOR (este skill)
158
+ ├─ /sf-load (se backend configurado)
159
+ ├─ /sf-discovery (obrigatório)
160
+ ├─ /sf-extract → gera PRD e/ou TRD
161
+ └─ STOP: aguarda aprovação PM (PRD) + aprovação dev (TRD)
162
+
163
+ [manual: revisar PRD.md, marcar prd_aprovado=true]
164
+ [manual: revisar TRD.md, marcar trd_aprovado=true]
165
+
166
+ /sf-design {nome}
167
+ ├─ first_run=true: cria docs/ (5 arquivos) + projetos.yaml
168
+ ├─ sempre: gera specs/{nome}/ (brief, contracts, scenarios)
169
+ └─ status → design_done
170
+
171
+ /sf-plan {nome}
172
+ └─ gera specs/{nome}/tasks.md + workspace/Output/{nome}/Progresso.md
173
+ └─ status → plan_done
174
+
175
+ /sf-dev {nome} (ou /sf-dev {nome} --fase 1)
176
+ ├─ first_run=true: INFRA-001 cria/clona repos em projetos/
177
+ ├─ implementa tasks com loop (coder → review → security review)
178
+ ├─ E2E + aprovação
179
+ ├─ se feature (first_run=false): chama /sf-merge-docs automaticamente
180
+ └─ status → dev_done → done
181
+ ```
182
+
183
+ ## Notas
184
+
185
+ - `/sf-load` é sempre o 1º passo real — garante Input sincronizado com backend
186
+ - Se não há `sfw.config.yml`, projeto é 100% local e `/sf-load` é pulado
187
+ - `first_run` é imutável após criação do `.context.md`
188
+ - `docs/` em first_run: NASCE no `/sf-design` (não no `/sf-extract`) a partir do TRD
189
+ - `projetos.yaml` é gerado pelo `/sf-design` em first_run
190
+ - **Aprovação dupla**: mesmo em time pequeno (dev = PM), mantém as 2 marcações —
191
+ "fluxo fica mais claro" vence cerimônia-mínima (decisão de v4)
192
+ - Ambiguidades em §12 PRD / §10 TRD são BLOQUEANTES — `/sf-design` não avança sem respostas