@esquadrao/cli 0.0.0-stage → 1.6.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/LICENSE +21 -0
- package/README.md +366 -2
- package/assets/fonts/Anton-Regular.ttf +0 -0
- package/assets/fonts/BebasNeue-Regular.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/assets/fonts/Poppins-Bold.ttf +0 -0
- package/assets/fonts/README.md +13 -0
- package/bin/cli.js +126 -0
- package/package.json +58 -4
- package/scripts/ast_slice.js +73 -0
- package/scripts/cutout.py +197 -0
- package/scripts/dag_validator.js +78 -0
- package/scripts/lint.js +43 -0
- package/scripts/merkle_verify.js +83 -0
- package/scripts/wcag_check.js +77 -0
- package/skill-audit/SKILL.md +42 -0
- package/skill-audit/references/merkle-ledger-spec.md +27 -0
- package/skill-audit/references/receipt-ed25519-verification.md +17 -0
- package/skill-audit/references/time-travel-replay.md +10 -0
- package/skill-code-reviewer/SKILL.md +40 -0
- package/skill-context/SKILL.md +44 -0
- package/skill-context/references/ast-virtualization.md +10 -0
- package/skill-context/references/openapi-contract-synthesis.md +10 -0
- package/skill-engineering-manager/SKILL.md +40 -0
- package/skill-media-producer/SKILL.md +328 -0
- package/skill-media-producer/references/caption-templates.md +194 -0
- package/skill-media-producer/references/composicoes-especiais.md +99 -0
- package/skill-media-producer/references/configuracao-inicial.md +239 -0
- package/skill-media-producer/references/corte-podcast-3-niveis.md +179 -0
- package/skill-media-producer/references/llm-agent-guide.md +231 -0
- package/skill-orchestrate/SKILL.md +49 -0
- package/skill-orchestrate/references/mission-lifecycle.md +36 -0
- package/skill-orchestrate/references/swarm-coordination.md +33 -0
- package/skill-pipeline/SKILL.md +42 -0
- package/skill-pipeline/references/auto-healing-patterns.md +17 -0
- package/skill-pipeline/references/dag-decomposition-rules.md +18 -0
- package/skill-pipeline/references/topological-waves.md +16 -0
- package/skill-product-manager/SKILL.md +40 -0
- package/skill-qa-engineer/SKILL.md +40 -0
- package/skill-review/SKILL.md +46 -0
- package/skill-review/references/anti-slop-patterns.md +17 -0
- package/skill-review/references/dual-blind-adjudication.md +15 -0
- package/skill-review/references/voice-calibration.md +10 -0
- package/skill-security-engineer/SKILL.md +40 -0
- package/skill-software-architect/SKILL.md +40 -0
- package/skill-software-engineer/SKILL.md +40 -0
- package/skill-sre-engineer/SKILL.md +40 -0
- package/skill-system-analyst/SKILL.md +40 -0
- package/skill-tech-lead/SKILL.md +40 -0
- package/skill-technical-writer/SKILL.md +40 -0
- package/skill-ui/SKILL.md +45 -0
- package/skill-ui/references/design-tokens-spec.md +19 -0
- package/skill-ui/references/visual-tdd-methodology.md +10 -0
- package/skill-ui/references/wcag-target-sizes.md +9 -0
- package/src/captionTemplates.js +285 -0
- package/src/commands/onboard.js +618 -0
- package/src/commands/role.js +119 -0
- package/src/commands/setup.js +174 -0
- package/src/commands/studio.js +1822 -0
- package/src/roles/authority.js +129 -0
- package/src/roles/codeReviewer.js +65 -0
- package/src/roles/engineeringManager.js +53 -0
- package/src/roles/index.js +80 -0
- package/src/roles/mediaProducer.js +223 -0
- package/src/roles/productManager.js +50 -0
- package/src/roles/qaEngineer.js +54 -0
- package/src/roles/securityEngineer.js +53 -0
- package/src/roles/softwareArchitect.js +58 -0
- package/src/roles/softwareEngineer.js +76 -0
- package/src/roles/sreEngineer.js +60 -0
- package/src/roles/systemAnalyst.js +45 -0
- package/src/roles/techLead.js +46 -0
- package/src/roles/technicalWriter.js +46 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Prova de Corte de Podcast em 3 Níveis
|
|
2
|
+
|
|
3
|
+
> **Status:** procedimento validado em 2026-11-11 com o CLI 1.5.0. A skill **consegue** detectar pausas longas e respiros curtos, cortar, remapear legendas, renderizar e medir. A composição visual de comparação (três painéis + timelines) é feita **fora** da skill, com FFmpeg/Python.
|
|
4
|
+
|
|
5
|
+
Este documento descreve o teste que mostra, na prática, a diferença entre:
|
|
6
|
+
|
|
7
|
+
1. **Pausa longa:** silêncio de 1,2–1,5 s entre blocos de fala.
|
|
8
|
+
2. **Respiro curto:** pausa de 0,35–0,45 s entre frases.
|
|
9
|
+
3. **Controle:** o mesmo vídeo cortado em três níveis, sem refazer a gravação.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. O que a skill faz e o que não faz
|
|
14
|
+
|
|
15
|
+
| Etapa | A skill faz? | Comando / observação |
|
|
16
|
+
| :--- | :--- | :--- |
|
|
17
|
+
| Detectar pausas e respiros | **Sim** | `esquadrao studio detect-silence <video> --silence-duration <s>` |
|
|
18
|
+
| Cortar pausas longas | **Sim** | `auto-clip` com `--silence-duration 0.8` (padrão) |
|
|
19
|
+
| Cortar respiros curtos | **Sim** | `auto-clip` com `--silence-duration 0.35` |
|
|
20
|
+
| Remapear legendas após o corte | **Sim** | `--captions <arquivo.srt>` |
|
|
21
|
+
| Renderizar e validar QA | **Sim** | `auto-clip` gera MP4 e roda `qa` |
|
|
22
|
+
| Reportar métricas | **Sim** | JSON com `silences_detected`, `silence_cut_s`, `speech_clips_count`, `captions_count`, `qa` |
|
|
23
|
+
| Montar o comparativo de 3 painéis | **Não** | Composição externa com FFmpeg (`xstack`/`hstack`) e timelines |
|
|
24
|
+
| Gerar timeline visual verde/vermelho | **Não** | Script Python/PIL ou SVG externo |
|
|
25
|
+
|
|
26
|
+
**Conclusão:** o corte e a medição são 100% da skill; a peça de marketing é uma composição posterior.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. Fixture de validação
|
|
31
|
+
|
|
32
|
+
Para o teste ser determinístico, use uma gravação limpa, sem ruído de fundo:
|
|
33
|
+
|
|
34
|
+
- **8 frases** de 2–3 s cada.
|
|
35
|
+
- **4 pausas longas** de 1,5 s entre blocos.
|
|
36
|
+
- **3 respiros curtos** de 0,40 s entre frases.
|
|
37
|
+
- Áudio final com ~28 s.
|
|
38
|
+
- Legenda SRT com os tempos de cada frase.
|
|
39
|
+
- Vídeo vertical 1080×1920 com cena de apoio contínua (a cena não interfere no corte).
|
|
40
|
+
|
|
41
|
+
Padrão dos intervalos:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
frase 1 [1,5 s] frase 2 [0,4 s] frase 3 [1,5 s] frase 4
|
|
45
|
+
frase 4 [0,4 s] frase 5 [1,5 s] frase 6 [0,4 s] frase 7
|
|
46
|
+
frase 7 [1,5 s] frase 8
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
> **Dica:** se usar TTS, corte o silêncio residual do início e do fim de cada arquivo antes de concatenar. Caso contrário, o arredondamento do encoder pode transformar um respiro de 0,40 s em 0,80 s e ele será cortado já no nível padrão.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. Passo a passo
|
|
54
|
+
|
|
55
|
+
### Passo 1 — Montar o bruto
|
|
56
|
+
|
|
57
|
+
1. Gere ou grave as 8 frases separadas.
|
|
58
|
+
2. Remova o silêncio residual de cada frase:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
ffmpeg -i frase.mp3 \
|
|
62
|
+
-af "silenceremove=start_periods=1:start_duration=0:start_threshold=-45dB,areverse,silenceremove=start_periods=1:start_duration=0:start_threshold=-45dB,areverse" \
|
|
63
|
+
-c:a aac frase-limpa.m4a
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
3. Concatene na ordem do padrão acima, inserindo os intervalos de 1,5 s e 0,40 s.
|
|
67
|
+
4. Monte o vídeo vertical com a cena de apoio e o áudio concatenado.
|
|
68
|
+
5. Crie o `raw.srt` com os tempos de cada frase.
|
|
69
|
+
|
|
70
|
+
### Passo 2 — Verificar o que será detectado
|
|
71
|
+
|
|
72
|
+
Rode a detecção nos dois níveis antes de renderizar:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
esquadrao studio detect-silence raw.mp4 --silence-duration 0.8 --json
|
|
76
|
+
esquadrao studio detect-silence raw.mp4 --silence-duration 0.35 --json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Esperado no fixture de referência:**
|
|
80
|
+
|
|
81
|
+
| Nível | `--silence-duration` | Silêncios detectados | Clipes de fala |
|
|
82
|
+
| :--- | ---: | ---: | ---: |
|
|
83
|
+
| Padrão | `0.8` | 4 (apenas pausas longas) | 5 |
|
|
84
|
+
| Respiro | `0.35` | 7 (4 longas + 3 curtas) | 8 |
|
|
85
|
+
|
|
86
|
+
Se o nível de 0,35 detectar muito mais que 7, há ruído ou pausas naturais da locução sendo tratadas como respiro. Ajuste para `0.40` ou `0.45`.
|
|
87
|
+
|
|
88
|
+
### Passo 3 — Rodar os três níveis
|
|
89
|
+
|
|
90
|
+
O nível “original” é o próprio `raw.mp4`, sem corte. Os outros dois usam o mesmo arquivo e a mesma legenda:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Padrão: remove pausas longas, preserva respiros
|
|
94
|
+
esquadrao studio auto-clip raw.mp4 \
|
|
95
|
+
--captions raw.srt \
|
|
96
|
+
--silence-duration 0.8 \
|
|
97
|
+
--dest workspace-padrao --json
|
|
98
|
+
|
|
99
|
+
# Respiro: remove pausas longas e respiros curtos
|
|
100
|
+
esquadrao studio auto-clip raw.mp4 \
|
|
101
|
+
--captions raw.srt \
|
|
102
|
+
--silence-duration 0.35 \
|
|
103
|
+
--dest workspace-respiro --json
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Cada execução devolve um JSON com os campos usados na comparação:
|
|
107
|
+
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"status": "ok",
|
|
111
|
+
"silences_detected": 7,
|
|
112
|
+
"silence_cut_s": 7.339,
|
|
113
|
+
"speech_clips_count": 8,
|
|
114
|
+
"captions_count": 17,
|
|
115
|
+
"qa": { "passed": true, "duration_s": 21.1 }
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Passo 4 — Validar os números
|
|
120
|
+
|
|
121
|
+
Critérios de aceite:
|
|
122
|
+
|
|
123
|
+
- [ ] O nível padrão tem menos silêncios que o nível respiro.
|
|
124
|
+
- [ ] O nível respiro tem duração menor que o nível padrão.
|
|
125
|
+
- [ ] Os dois MP4s passam no QA (`qa.passed = true`).
|
|
126
|
+
- [ ] As legendas continuam sincronizadas e sem corte nas duas saídas.
|
|
127
|
+
- [ ] O nível respiro não remove fala: compare os `speech_clips_count` e ouça as junções.
|
|
128
|
+
|
|
129
|
+
### Passo 5 — Montar o comparativo (fora da skill)
|
|
130
|
+
|
|
131
|
+
A skill entrega três MP4s verticais. A peça de LP é montada depois:
|
|
132
|
+
|
|
133
|
+
1. Três painéis verticais de 360×640, centralizados em um canvas 1920×1080.
|
|
134
|
+
2. Rótulos: `Original`, `Corte padrão 0,8 s`, `Corte de respiro 0,35 s`.
|
|
135
|
+
3. Abaixo de cada painel, uma timeline:
|
|
136
|
+
- verde = fala;
|
|
137
|
+
- vermelho = trecho removido;
|
|
138
|
+
- marcações nas pausas longas e nos respiros.
|
|
139
|
+
4. Métricas reais extraídas do JSON:
|
|
140
|
+
- `8 pausas • 14,2 s removidos • 27% mais curto` (exemplo).
|
|
141
|
+
5. Sem áudio no comparativo; é uma peça visual em loop.
|
|
142
|
+
|
|
143
|
+
Composição de referência:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
ffmpeg -i original.mp4 -i padrao.mp4 -i respiro.mp4 \
|
|
147
|
+
-filter_complex "\
|
|
148
|
+
[0:v]scale=360:640,setsar=1[a];\
|
|
149
|
+
[1:v]scale=360:640,setsar=1[b];\
|
|
150
|
+
[2:v]scale=360:640,setsar=1[c];\
|
|
151
|
+
[a][b][c]hstack=inputs=3[out]" \
|
|
152
|
+
-map "[out]" -an -c:v libx264 -pix_fmt yuv420p comparativo.mp4
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
> A timeline verde/vermelha não é gerada pelo `auto-clip`; use o JSON de `detect-silence` para desenhar os blocos.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 4. Resultado da validação (2026-11-11)
|
|
160
|
+
|
|
161
|
+
Fixture de referência: 28,4 s de vídeo, 8 frases, 4 pausas de 1,5 s e 3 respiros de 0,40 s.
|
|
162
|
+
|
|
163
|
+
| Nível | `--silence-duration` | Silêncios | Clipes de fala | Duração final | QA |
|
|
164
|
+
| :--- | ---: | ---: | ---: | ---: | :--- |
|
|
165
|
+
| Original | — | — | 1 | 28,4 s | — |
|
|
166
|
+
| Padrão | `0.8` | 4 | 5 | 22,3 s | aprovado |
|
|
167
|
+
| Respiro | `0.35` | 7 | 8 | 21,1 s | aprovado |
|
|
168
|
+
|
|
169
|
+
**Leitura:** o nível padrão removeu 6,07 s (4 pausas longas); o nível respiro removeu 7,34 s (as 4 longas + 3 curtas). A diferença de 1,27 s é exatamente o conjunto de respiros, sem perda de fala.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 5. Limites e recomendações
|
|
174
|
+
|
|
175
|
+
- **0,35 s é agressivo.** Use apenas em áudio limpo, sem ruído e com locução pausada. Para podcast com respiração audível ou ambiente, comece em `0.45` ou `0.5`.
|
|
176
|
+
- **Ruído de fundo impede o `silencedetect`.** Normalize ou aplique redução de ruído antes; caso contrário, o silêncio “real” pode não cruzar o limiar de `-30dB`.
|
|
177
|
+
- **TTS tem silêncio residual.** Sem o corte de bordas, o respiro de 0,40 s pode virar 0,8 s e ser removido no nível padrão.
|
|
178
|
+
- **O comparativo não é um comando da skill.** Se virar item de produto, entra como backlog próprio; hoje é composição externa.
|
|
179
|
+
- **Sempre ouça as junções.** Métrica verde não substitui a checagem auditiva de respiração cortada no meio da palavra.
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Guia Operacional para LLMs e Agentes de IA — Esquadrão de Conteúdo Studio
|
|
2
|
+
|
|
3
|
+
Este guia estabelece o padrão de comportamento, diálogo e orquestração para assistentes inteligentes (Claude Code, Cursor, Codex CLI, Grok Build e Hermes) ao interagir com usuários na produção de vídeos automatizados.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Regra de Ouro: Soberania da Decisão do Usuário
|
|
8
|
+
|
|
9
|
+
O assistente de IA **nunca** deve impor uma configuração padrão arbitrária:
|
|
10
|
+
- **Não force formato widescreen (16:9):** Mais de 80% do consumo atual de cortes ocorre em formato vertical (9:16). Sempre pergunte a intenção do usuário.
|
|
11
|
+
- **Não force fundo preto (`dark`):** O modo `dark` é voltado para testes ou canais puramente tipográficos. A maioria dos usuários deseja cortar vídeos longos com legendas (`podcast_clip`) ou unir cenas de apoio e filmagens (`edit_only`).
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. Roteiro de Interação com o Usuário
|
|
16
|
+
|
|
17
|
+
Ao ser acionado pelo usuário com comandos como *"quero criar um corte"*, *"edite este vídeo"* ou *"configure o estúdio de vídeo"*, siga este fluxo:
|
|
18
|
+
|
|
19
|
+
### Fase 1: Sondagem e Descoberta
|
|
20
|
+
Envie uma mensagem amigável e direta coletando as decisões essenciais:
|
|
21
|
+
> *"Vou preparar a esteira de edição para você. Para deixar o vídeo no ponto certo, me diga:*
|
|
22
|
+
> *1. **Formato:** Você quer em formato **vertical 9:16** (Reels, TikTok, Shorts) ou **widescreen 16:9** (YouTube tradicional)?*
|
|
23
|
+
> *2. **Estilo:** Você quer **fatiar uma gravação com legendas** sincronizadas, **unir trechos de vídeo** ou prefere **texto sobre fundo escuro**?*
|
|
24
|
+
> *3. Qual é o arquivo de vídeo que vamos usar de fonte?"*
|
|
25
|
+
|
|
26
|
+
### Fase 2: Checagem de Ambiente
|
|
27
|
+
Antes de criar arquivos, verifique se a máquina possui os requisitos operacionais:
|
|
28
|
+
```bash
|
|
29
|
+
node -v
|
|
30
|
+
ffmpeg -version
|
|
31
|
+
ffprobe -version
|
|
32
|
+
```
|
|
33
|
+
Se o FFmpeg não for encontrado, responda com o comando de instalação imediato:
|
|
34
|
+
- **Windows:** `winget install Gyan.FFmpeg`
|
|
35
|
+
- **macOS:** `brew install ffmpeg`
|
|
36
|
+
- **Linux:** `sudo apt update && sudo apt install -y ffmpeg`
|
|
37
|
+
|
|
38
|
+
### Fase 3: Preparação do Workspace
|
|
39
|
+
Execute no terminal:
|
|
40
|
+
```bash
|
|
41
|
+
# 1. Instalar o CLI globalmente se ainda não estiver presente
|
|
42
|
+
npm install -g @esquadrao/cli
|
|
43
|
+
|
|
44
|
+
# 2. Configurar o workspace atual
|
|
45
|
+
esquadrao setup
|
|
46
|
+
|
|
47
|
+
# 3. Inicializar o estúdio
|
|
48
|
+
esquadrao studio init --dest ./workspace
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
A inicialização cria a seguinte árvore real no workspace:
|
|
52
|
+
```text
|
|
53
|
+
workspace/
|
|
54
|
+
├── assets/ # Cópias locais das mídias importadas
|
|
55
|
+
├── packages/ # EditPlans (editplan.json), transcrições e ganchos
|
|
56
|
+
├── artifacts/ # Vídeos finais em MP4 gerados pelo renderizador
|
|
57
|
+
└── studio.json # Manifesto do estúdio e inventário de assets
|
|
58
|
+
```
|
|
59
|
+
*(Nota: O estúdio cria estritamente `assets/`, `packages/`, `artifacts/` e `studio.json`. Pastas como `editplans/`, `renders/` e `qa/` não são geradas.)*
|
|
60
|
+
|
|
61
|
+
> **Onboarding:** No modo `podcast_clip`, o `esquadrao onboard` executa o pipeline real de `auto-clip` e aceita `--captions`, `--openai`, `--local` ou `--no-captions`. Sem motor de legenda, ele aplica `--no-captions`, gera o corte real sem legendas e avisa; nunca prometa legendas sem informar o pré-requisito.
|
|
62
|
+
|
|
63
|
+
### Fase 4: Importação da Mídia e Leitura dos Metadados
|
|
64
|
+
Importe o arquivo do usuário e anote o ID do asset:
|
|
65
|
+
```bash
|
|
66
|
+
esquadrao studio import /caminho/do/video.mp4 --dest ./workspace --json
|
|
67
|
+
```
|
|
68
|
+
A resposta retorna:
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"id": "AST-A1B2C3D4",
|
|
72
|
+
"metadata": {
|
|
73
|
+
"duration_s": 45.2,
|
|
74
|
+
"width": 1920,
|
|
75
|
+
"height": 1080,
|
|
76
|
+
"has_audio": true
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Fase 5: Montagem do EditPlan
|
|
82
|
+
Com base nas escolhas do usuário, crie `./workspace/packages/editplan.json`.
|
|
83
|
+
- Para formato vertical: `width: 1080`, `height: 1920`.
|
|
84
|
+
- Para formato widescreen: `width: 1920`, `height: 1080`.
|
|
85
|
+
- Ajuste os pontos de corte (`in_ms`, `out_ms`) garantindo que `out_ms <= duration_s * 1000`.
|
|
86
|
+
|
|
87
|
+
**Apresente um resumo claro para o usuário antes de renderizar:**
|
|
88
|
+
> *"Preparei o plano de corte:*
|
|
89
|
+
> *- Formato: Vertical 9:16 (1080x1920)*
|
|
90
|
+
> *- Trecho: 00:05 a 00:35 (30 segundos)*
|
|
91
|
+
> *- Legendas: 3 frases sincronizadas com áudio nivelado*
|
|
92
|
+
> *Posso iniciar a renderização no seu computador?"*
|
|
93
|
+
|
|
94
|
+
### Fase 6: Renderização e QA
|
|
95
|
+
Após a confirmação:
|
|
96
|
+
```bash
|
|
97
|
+
esquadrao studio render ./workspace/packages/editplan.json --dest ./workspace --json
|
|
98
|
+
esquadrao studio qa ./workspace/artifacts/video.mp4 --plan ./workspace/packages/editplan.json
|
|
99
|
+
```
|
|
100
|
+
Entregue o caminho do vídeo final gerado e confirme que a checagem técnica passou com sucesso.
|
|
101
|
+
|
|
102
|
+
### Fase Alternativa Rápida: Pipeline Integrado de Auto-Corte (`auto-clip`)
|
|
103
|
+
Quando o usuário deseja fatiar pausas mortas a partir de um vídeo longo sem montar o `editplan.json` manualmente:
|
|
104
|
+
```bash
|
|
105
|
+
# Executa corte de silêncios (>0.8s), montagem de cortes contíguos e renderização com QA:
|
|
106
|
+
esquadrao studio auto-clip /caminho/do/video.mp4 --dest ./workspace --json
|
|
107
|
+
```
|
|
108
|
+
O comando emite o resumo com total de silêncio expurgado, quantidade de cortes contíguos e o artefato renderizado aprovado.
|
|
109
|
+
|
|
110
|
+
> **REGRA MANDATÓRIA PARA A LLM — NÃO PROMETER LEGENDA AUTOMÁTICA SEM PRÉ-REQUISITO:**
|
|
111
|
+
> O assistente de IA NÃO deve prometer ao usuário legendas automáticas sem explicitar os três caminhos suportados:
|
|
112
|
+
> 1. `--captions <arquivo.srt>`: Caminho canônico, offline e determinístico (recomendado).
|
|
113
|
+
> 2. `--openai`: Requer a variável de ambiente `OPENAI_API_KEY` para transcrição via API remota OpenAI Whisper.
|
|
114
|
+
> 3. `--local`: Utiliza `@xenova/transformers` + `Xenova/whisper-tiny` (declarada em `optionalDependencies`). Se o pacote opcional não estiver instalado, o comando falha com instrução acionável; use `--no-captions` para cortar sem legendas.
|
|
115
|
+
> O agente deve sempre solicitar um arquivo SRT, instruir a configuração de `OPENAI_API_KEY` ou instalar o modelo local antes de prometer legendas no corte.
|
|
116
|
+
>
|
|
117
|
+
> **Templates de legenda:** existem nove presets documentados em [`caption-templates.md`](caption-templates.md), disponíveis via `--caption-template <id>` ou `captions[].template`. `--caption-style impact|word|full` permanece como legado.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 3. Matriz de Tratamento de Erros Comuns
|
|
122
|
+
|
|
123
|
+
| Erro Observado | Causa Raiz | Ação Corretiva Determinística |
|
|
124
|
+
| :--- | :--- | :--- |
|
|
125
|
+
| `ffmpeg is not installed` | Binário ausente no PATH | Orientar instalação via `winget`, `brew` ou `apt` e reabrir terminal. |
|
|
126
|
+
| `out_ms exceeds asset duration` | Ponto de saída além do arquivo | Obter duração real com `studio import` e recalcular `out_ms`. |
|
|
127
|
+
| `Missing audio stream in artifact` | Fonte sem áudio ou falha de mix | Garantir `anullsrc` para vídeo mudo ou verificar se o arquivo original tem áudio. |
|
|
128
|
+
| `Caption special characters error` | Caracteres `%` ou `'` na legenda | O motor trata com `\%` e `\'`. Não usar tags HTML em legendas. |
|
|
129
|
+
| `QA duration mismatch > 250ms` | Cortes inconsistentes com a timeline | Alinhar `timeline_start_ms` com o somatório dos cortes anteriores. |
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 4. Playbook Avançado: Corte de Vídeo Longo, Copy Viral, B-Rolls e Música
|
|
135
|
+
|
|
136
|
+
Quando o usuário fornecer uma gravação longa (podcast, aula, live ou entrevista de 30min a 2h), siga este roteiro de 5 passos para entregar um corte viral de alto nível:
|
|
137
|
+
|
|
138
|
+
### Passo 1: Transcrição Estruturada
|
|
139
|
+
Extraia o mapa textual completo com marcações de tempo:
|
|
140
|
+
```bash
|
|
141
|
+
esquadrao studio transcribe /caminho/do/video_longo.mp4 --dest ./workspace --json
|
|
142
|
+
```
|
|
143
|
+
O arquivo `./workspace/packages/transcript.json` conterá todos os blocos com `start_s`, `end_s` e `text`.
|
|
144
|
+
|
|
145
|
+
> **Aviso de Execução:** O comando `transcribe` utiliza o mesmo mecanismo do auto-clip. Requer chave `OPENAI_API_KEY` configurada ou instalação prévia do módulo `@xenova/transformers`.
|
|
146
|
+
|
|
147
|
+
### Passo 2: Análise de Copy e Seleção dos Melhores Trechos
|
|
148
|
+
A LLM pode rodar o detector automatizado de ganchos ou analisar manualmente o `transcript.json`:
|
|
149
|
+
```bash
|
|
150
|
+
esquadrao studio find-hooks ./workspace/packages/transcript.json --min-dur 30 --max-dur 60 --json
|
|
151
|
+
```
|
|
152
|
+
O comando retorna os Top 3 candidatos ranqueados com pontuação de gancho, timestamps exatos (`start_ms`, `end_ms`) e punchlines.
|
|
153
|
+
|
|
154
|
+
A LLM deve aplicar a **Fórmula Tripartite de Retenção Viral**:
|
|
155
|
+
1. **O Gancho (0 a 3 segundos):** Identifique o momento em que o orador faz uma pergunta contraintuitiva, revela um segredo ou expõe um erro comum. O corte DEVE começar exatamente na primeira palavra do gancho (ex: *"O maior erro de quem tenta vender..."*).
|
|
156
|
+
2. **Janela de Retenção (30s a 60s flexível):** A ideia central precisa ser explicada com clareza sem prolixidade. Se o raciocínio exigir 45s ou 55s, respeite a conclusão natural da ideia. Permita ajuste se o usuário solicitar cortes mais curtos ou mais longos.
|
|
157
|
+
3. **Punchline de Fechamento:** O corte encerra no clímax da resposta ou conclusão, cortando antes de transições vazias ("é isso", "então pessoal", "deixa o like").
|
|
158
|
+
|
|
159
|
+
### Passo 3: Escolha Dinâmica dos B-Rolls e Layouts
|
|
160
|
+
Para evitar que o corte fique monótono ("cabeça falante"), a LLM insere B-rolls (`overlays`) e escolhe o layout ideal:
|
|
161
|
+
- **`layout: "fullscreen"` (Padrão):** Insira a cada 5 a 8 segundos cenas de apoio temáticas (ex: dinheiro, mansões, carros, trabalho) cobrindo 100% da tela durante 2 a 3 segundos, mantendo a voz do orador contínua.
|
|
162
|
+
- **`layout: "split_bottom"` (Dupla Retenção):** Para canais de alta velocidade (TikTok/Shorts), divida a tela com o orador em cima e o vídeo de apoio/pack embaixo. Use `--overlay-duration full` para manter o pack na base durante todo o clipe; sem essa flag, o layout é uma janela de B-roll de 2–4 s.
|
|
163
|
+
- **`layout: "pip"` (Picture-in-Picture):** Quando o orador estiver apontando para um objeto ou reagindo a algo.
|
|
164
|
+
- **`layout: "split_top"` (Pendente / Backlog CLI-06):** Previsto no schema (orador embaixo e B-roll em cima), porém não implementado no renderizador atual (cai em tela cheia). O agente deve utilizar `"split_bottom"`, `"fullscreen"` ou `"pip"`.
|
|
165
|
+
- **Recorte de pessoa / cutout (experimental / CLI-14):** `studio cutout --background <pack> --python <interpretador>` remove o fundo e compõe o pack atrás do orador. Exige Python com `rembg`/OpenCV e custa ~18–20 min de CPU por 60 s em 15 fps; não prometa tempo real. Consulte [`composicoes-especiais.md`](./composicoes-especiais.md).
|
|
166
|
+
|
|
167
|
+
### Passo 4: Trilha Sonora com Ducking
|
|
168
|
+
Importe a música de fundo e configure a atenuação de volume:
|
|
169
|
+
- **Atenuação Estática de Volume:** A propriedade `ducking: true` em `music_tracks` aplica uma redução fixa de `-22dB` via mixagem `amix`. Não se trata de ducking dinâmico por sidechain com compressão em tempo real sobre a voz (previsto no backlog CLI-05). O volume fixo reduz a trilha para não encobrir a fala.
|
|
170
|
+
|
|
171
|
+
### Passo 5: Geração do EditPlan Completo e Renderização
|
|
172
|
+
Exemplo canônico de EditPlan com cortes, B-rolls, música e legendas estilo impacto:
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"schema_version": 1,
|
|
176
|
+
"mode": "podcast_clip",
|
|
177
|
+
"output": {
|
|
178
|
+
"width": 1080,
|
|
179
|
+
"height": 1920,
|
|
180
|
+
"fps_num": 30,
|
|
181
|
+
"fps_den": 1,
|
|
182
|
+
"video_codec": "h264",
|
|
183
|
+
"audio_codec": "aac"
|
|
184
|
+
},
|
|
185
|
+
"clips": [
|
|
186
|
+
{
|
|
187
|
+
"kind": "video",
|
|
188
|
+
"clip_id": "fala-principal",
|
|
189
|
+
"asset_id": "AST-PODCAST01",
|
|
190
|
+
"in_ms": 124000,
|
|
191
|
+
"out_ms": 168000,
|
|
192
|
+
"timeline_start_ms": 0,
|
|
193
|
+
"speed": 1
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
"audio_tracks": [
|
|
197
|
+
{ "kind": "source", "clip_id": "fala-principal", "gain_db": 0 }
|
|
198
|
+
],
|
|
199
|
+
"overlays": [
|
|
200
|
+
{
|
|
201
|
+
"kind": "video",
|
|
202
|
+
"asset_id": "AST-BROLL-DINHEIRO",
|
|
203
|
+
"layout": "fullscreen",
|
|
204
|
+
"in_ms": 0,
|
|
205
|
+
"out_ms": 3000,
|
|
206
|
+
"timeline_start_ms": 6000,
|
|
207
|
+
"duration_ms": 3000
|
|
208
|
+
}
|
|
209
|
+
],
|
|
210
|
+
"music_tracks": [
|
|
211
|
+
{
|
|
212
|
+
"asset_id": "AST-TRILHA01",
|
|
213
|
+
"gain_db": -22,
|
|
214
|
+
"ducking": true
|
|
215
|
+
}
|
|
216
|
+
],
|
|
217
|
+
"captions": [
|
|
218
|
+
{
|
|
219
|
+
"text": "O MAIOR ERRO",
|
|
220
|
+
"timeline_start_ms": 0,
|
|
221
|
+
"duration_ms": 1200,
|
|
222
|
+
"style": "impact"
|
|
223
|
+
}
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
Renderize e verifique com:
|
|
228
|
+
```bash
|
|
229
|
+
esquadrao studio render ./workspace/packages/editplan.json --dest ./workspace
|
|
230
|
+
esquadrao studio qa ./workspace/artifacts/video.mp4 --plan ./workspace/packages/editplan.json
|
|
231
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-orchestrate
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "Orchestrate autonomous multi-agent missions, manage checkpoints, and coordinate execution."
|
|
5
|
+
allowed-tools: ["terminal"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Agent Orchestrate
|
|
9
|
+
|
|
10
|
+
Orchestrate end-to-end missions, autonomous pipelines, and checkpoint rollbacks via CLI or git branches.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- Executing end-to-end autonomous missions across multi-phase tasks.
|
|
15
|
+
- Coordinating autonomous multi-agent swarms with bounded resource budgets.
|
|
16
|
+
- Capturing atomic state snapshots (`checkpoints`) before high-risk mutations.
|
|
17
|
+
- Reverting failed or regressed mission states deterministically (`rollback`).
|
|
18
|
+
|
|
19
|
+
## NOT for
|
|
20
|
+
|
|
21
|
+
- AST slicing or syntax graph extraction (`skill-context`).
|
|
22
|
+
- WCAG accessibility or visual TDD audits (`skill-ui`).
|
|
23
|
+
- Isolated forensic ledger verification (`skill-audit`).
|
|
24
|
+
- Single-wave pipeline scheduling (`skill-pipeline`).
|
|
25
|
+
|
|
26
|
+
## Workflow & CLI
|
|
27
|
+
|
|
28
|
+
Execute via local script and git commands:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 1. Validate DAG and execution waves
|
|
32
|
+
node scripts/dag_validator.js tasks.json
|
|
33
|
+
|
|
34
|
+
# 2. Capture git checkpoint before mutation
|
|
35
|
+
git checkout -b checkpoint/pre-mutation
|
|
36
|
+
|
|
37
|
+
# 3. Rollback to checkpoint on failure
|
|
38
|
+
git reset --hard HEAD
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## UX & Operational Rules
|
|
42
|
+
|
|
43
|
+
- **Anti-Context-Dumping**: Dispatch minimal context packets (<3,000 tokens). Never dump full workspace trees.
|
|
44
|
+
- **Structured Communication**: Return concise status summaries with work IDs, checkpoint hashes, and gate results.
|
|
45
|
+
|
|
46
|
+
## References
|
|
47
|
+
|
|
48
|
+
- Mission lifecycle & transitions: [references/mission-lifecycle.md](references/mission-lifecycle.md)
|
|
49
|
+
- Swarm coordination & arbitration: [references/swarm-coordination.md](references/swarm-coordination.md)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Mission Lifecycle Specification
|
|
2
|
+
|
|
3
|
+
Governs mission state transitions and atomic checkpointing in agent orchestration.
|
|
4
|
+
|
|
5
|
+
## Lifecycle States
|
|
6
|
+
|
|
7
|
+
- **INIT**: Task intake and contract refinement (`refine_prompt`). WorkRecord instantiated with DAG.
|
|
8
|
+
- **RUNNING**: Topological waves executing subtasks concurrently with GREEN test gates.
|
|
9
|
+
- **CHECKPOINT**: Execution paused to persist immutable state snapshot before risky mutations.
|
|
10
|
+
- **COMPLETED**: All subtasks verified GREEN (`verify_subtask`) and Merkle ledger exported.
|
|
11
|
+
- **FAILED**: Unrecoverable regression or exhausted remediations; triggers fail-closed state.
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
INIT ──> RUNNING ──┬──> CHECKPOINT ──> RUNNING
|
|
15
|
+
├──> COMPLETED (all gates GREEN)
|
|
16
|
+
└──> FAILED (unrecoverable / budget exhausted)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Checkpoint & Rollback Protocol
|
|
20
|
+
|
|
21
|
+
1. **Snapshot (`create_checkpoint`)**:
|
|
22
|
+
- Takes `work_id` and optional `label`.
|
|
23
|
+
- Serializes atomic snapshot of `WorkRecord` (DAG, task outputs, event log).
|
|
24
|
+
- Returns immutable `checkpoint_id`.
|
|
25
|
+
2. **Rollback (`rollback_checkpoint`)**:
|
|
26
|
+
- Takes `work_id` and `checkpoint_id`.
|
|
27
|
+
- Deterministically restores `WorkRecord` to snapshot and releases acquired locks.
|
|
28
|
+
- Appends signed rollback event to audit ledger.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Capture checkpoint via git branch or stash
|
|
32
|
+
git stash save "checkpoint-pre-patch"
|
|
33
|
+
|
|
34
|
+
# Rollback checkpoint on failure
|
|
35
|
+
git reset --hard HEAD
|
|
36
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Swarm Coordination Specification
|
|
2
|
+
|
|
3
|
+
Framework for coordinating autonomous multi-agent swarms, budgets, and concurrency locks via CLI and filesystem locks.
|
|
4
|
+
|
|
5
|
+
## Autonomous Swarm Coordination (`coordinate_mission_swarm`)
|
|
6
|
+
|
|
7
|
+
Swarms execute autonomous agents across topological DAG waves:
|
|
8
|
+
- **Wave Partitioning**: Subtasks grouped by disjoint file paths for safe parallelism.
|
|
9
|
+
- **Context Virtualization**: Minimal surgical context packets (<3,000 tokens) dispatched per agent.
|
|
10
|
+
- **Evidence Gates**: Subtask progression requires deterministic GREEN test verification.
|
|
11
|
+
|
|
12
|
+
## Budget Allocation (Tokens & Time)
|
|
13
|
+
|
|
14
|
+
Strict operational ceilings prevent runaway resource consumption:
|
|
15
|
+
- **Token Quotas**: Per-task allocation with SHA-256 context deduplication (>75% token savings).
|
|
16
|
+
- **Timeout Ceilings**: Bounded wall-clock timeouts trigger auto-remediation or fail-closed abort.
|
|
17
|
+
|
|
18
|
+
## Concurrency Arbitration (`arbitrate_concurrency`)
|
|
19
|
+
|
|
20
|
+
Prevents file access collisions and deadlocks across concurrent subagents:
|
|
21
|
+
- **Lock Modes**:
|
|
22
|
+
- `SHARED`: Simultaneous read-only access by multiple agents.
|
|
23
|
+
- `EXCLUSIVE`: Single-agent write lock on specific file paths.
|
|
24
|
+
- **Lease Operations**:
|
|
25
|
+
- `acquire`: Claims lock on `paths` with `agent_id`, `workspace_id`, and `ttl_seconds`.
|
|
26
|
+
- `renew`: Heartbeat extends `expires_at` for long-running executions.
|
|
27
|
+
- `release`: Deterministic cleanup requiring matching `agent_id` in `finally` blocks.
|
|
28
|
+
- **Zombie Purging**: Expired leases (`expires_at < now()`) auto-evict, promoting waiters.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Acquire path lockfile with atomic file write
|
|
32
|
+
node -e "fs.writeFileSync('.lock-src-core', JSON.stringify({agent_id: 'agent-1', expires_at: Date.now() + 30000}), {flag: 'wx'})"
|
|
33
|
+
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-pipeline
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "Decompose complex tasks into acyclic execution DAGs, compute topological waves, and auto-heal test failures."
|
|
5
|
+
allowed-tools: ["terminal"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Agent Pipeline
|
|
9
|
+
|
|
10
|
+
Decompose tasks into topological waves, enforce acyclic dependencies, and trigger deterministic auto-healing.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- Breaking down epics into granular, testable DAG tasks.
|
|
15
|
+
- Validating dependency acyclicity and computing execution waves.
|
|
16
|
+
- Automated error diagnosis and targeted test remediation (auto-healing).
|
|
17
|
+
|
|
18
|
+
## NOT for
|
|
19
|
+
|
|
20
|
+
- Merkle ledger verification (`skill-audit`).
|
|
21
|
+
- Multi-agent swarm leasing and concurrency locks (`skill-orchestrate`).
|
|
22
|
+
- Codebase outline and AST extraction (`skill-context`).
|
|
23
|
+
|
|
24
|
+
## Workflow & CLI
|
|
25
|
+
|
|
26
|
+
Execute via local script:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Validate DAG and compute topological waves
|
|
30
|
+
node scripts/dag_validator.js tasks.json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## UX & Operational Rules
|
|
34
|
+
|
|
35
|
+
- Tasks must declare strict `depends_on` lists referencing valid IDs.
|
|
36
|
+
- Never execute cyclical DAGs; validate with Kahn's algorithm before running.
|
|
37
|
+
|
|
38
|
+
## References
|
|
39
|
+
|
|
40
|
+
- Topological waves: [references/topological-waves.md](references/topological-waves.md)
|
|
41
|
+
- DAG decomposition rules: [references/dag-decomposition-rules.md](references/dag-decomposition-rules.md)
|
|
42
|
+
- Auto-healing patterns: [references/auto-healing-patterns.md](references/auto-healing-patterns.md)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Auto-Healing Patterns
|
|
2
|
+
|
|
3
|
+
Deterministic remediation patterns for test failures and execution anomalies.
|
|
4
|
+
|
|
5
|
+
## Failure Classification
|
|
6
|
+
|
|
7
|
+
1. **Assertion Failure**: Code output deviates from expected contract.
|
|
8
|
+
- *Remediation*: Inspect AST diff, locate mutated function, revert to last known green contract.
|
|
9
|
+
2. **Environment Failure**: Missing dependency or uninitialized database/service.
|
|
10
|
+
- *Remediation*: Trigger idempotent initialization hook; re-verify preflight prerequisites.
|
|
11
|
+
3. **Flaky / Timing Failure**: Race condition or asynchronous event timeout.
|
|
12
|
+
- *Remediation*: Isolate concurrent promises, replace arbitrary sleep with deterministic event listener.
|
|
13
|
+
|
|
14
|
+
## Remediation Protocol
|
|
15
|
+
|
|
16
|
+
- Maximum 3 auto-healing cycles per subtask.
|
|
17
|
+
- If cycle count exceeds threshold, escalate to parent orchestrator with full error trace.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# DAG Decomposition Rules
|
|
2
|
+
|
|
3
|
+
Rules for breaking complex engineering goals into parallelizable execution units.
|
|
4
|
+
|
|
5
|
+
## Core Rules
|
|
6
|
+
|
|
7
|
+
1. **Atomic Boundaries**: Each task touches at most 3 related source files.
|
|
8
|
+
2. **Explicit Verification**: Every task must define at least one executable check (unit test or command).
|
|
9
|
+
3. **Strict Acyclicity**: No task may directly or transitively depend on its own output.
|
|
10
|
+
4. **Declared Dependencies**: All inputs from previous tasks must be listed in `depends_on`.
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
[
|
|
14
|
+
{ "id": "task_1", "description": "Define data schema", "depends_on": [] },
|
|
15
|
+
{ "id": "task_2", "description": "Implement repository", "depends_on": ["task_1"] },
|
|
16
|
+
{ "id": "task_3", "description": "Create HTTP routes", "depends_on": ["task_2"] }
|
|
17
|
+
]
|
|
18
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Topological Waves Specification
|
|
2
|
+
|
|
3
|
+
Topological wave computation partitions tasks into ordered parallel batches using Kahn's algorithm.
|
|
4
|
+
|
|
5
|
+
## Computation Algorithm
|
|
6
|
+
|
|
7
|
+
1. Calculate in-degrees (number of incoming dependencies) for each node.
|
|
8
|
+
2. Wave 0 contains all nodes with `in_degree == 0`.
|
|
9
|
+
3. Process Wave N: decrement in-degrees of dependent nodes.
|
|
10
|
+
4. Nodes reaching `in_degree == 0` form Wave N+1.
|
|
11
|
+
5. If processed node count does not equal total nodes, the graph contains cycles.
|
|
12
|
+
|
|
13
|
+
## Execution Model
|
|
14
|
+
|
|
15
|
+
- Tasks within the same wave run concurrently up to configured `max_concurrency`.
|
|
16
|
+
- Progression to Wave N+1 is blocked until all tasks in Wave N pass their verification gates.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-product-manager
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
description: "Synthesize user intent and business needs into unambiguous requirements, scope boundaries, and acceptance criteria."
|
|
5
|
+
allowed-tools: ["terminal"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Product Manager
|
|
9
|
+
|
|
10
|
+
Synthesize product vision into crisp, testable requirements and explicit boundary constraints.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- Translating high-level feature requests into formal requirement contracts.
|
|
15
|
+
- Defining bounded scope (`in_scope`, `out_of_scope`) before engineering kickoff.
|
|
16
|
+
- Establishing verifiable acceptance criteria and risk classifications.
|
|
17
|
+
|
|
18
|
+
## NOT for
|
|
19
|
+
|
|
20
|
+
- Generating code patches (`skill-software-engineer`).
|
|
21
|
+
- Arbitrating architectural trade-offs (`skill-tech-lead`).
|
|
22
|
+
- Slicing repository ASTs (`skill-context`).
|
|
23
|
+
|
|
24
|
+
## Workflow & CLI
|
|
25
|
+
|
|
26
|
+
Execute via `esquadrao role`:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 1. Inspect role definition and constraints
|
|
30
|
+
esquadrao role info product-manager
|
|
31
|
+
|
|
32
|
+
# 2. Generate calibrated prompt for requirements synthesis
|
|
33
|
+
esquadrao role prompt product-manager "Build headless authentication with OAuth2"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## UX & Operational Rules
|
|
37
|
+
|
|
38
|
+
- Scope must be concrete: name specific workflows or modules, not open-ended epics.
|
|
39
|
+
- Acceptance criteria must be binary and verifiable (true/false).
|
|
40
|
+
- Classify risk objectively based on data sensitivity and operational blast radius.
|