A skill decidia a edição sem saber que o JSON dela agora passa por uma tela de revisão antes de virar FCPXML. Isso não é detalhe de fluxo: a etapa 5 traduz cada ação para o vocabulário dela, e sem conhecer essa tradução a intenção da IA se perde no caminho — que é exatamente como uma decisão vira "arbitrária" aos olhos de quem revisa. Novo criterios/10-revisao-humana.md, com o que o app faz com cada ação: - cut cobrindo >=60% da frase remove a linha; tocando só uma borda vira trim encaixado na fronteira de palavra. Corte de meia frase é ambíguo — passa do limiar e apaga a linha toda quando a intenção era aparar a hesitação. - zoom ou text sobre uma frase marca ênfase, e ênfase significa DUAS coisas: zoom mais legenda dinâmica; as demais frases ficam com legenda comum. A escala vira o nível (1.15→leve, 1.3→média, 1.5→forte). - sem ação, o nível é derivado do peak_emphasis; a decisão da IA sempre ganha. - reason é exibido ao lado da frase na tela — é o que o editor lê antes de manter ou desfazer. Deixou de ser campo de log. Consequência prática que faltava em 05-zoom.md: não espalhar zoom "por segurança", porque cada um promove a frase em duas dimensões ao mesmo tempo. Na dúvida, deixar sem — promover custa uma tecla, despromover custa mais. Cada arquivo de critério ganhou cabeçalho de escopo (o que cobre, em que fase), no mesmo padrão dos docs do Engine, para ler só o necessário. Todas as afirmações numéricas do novo critério foram verificadas contra fcpxml/phrase_review.py rodando, não assumidas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
2.9 KiB
Markdown
82 lines
2.9 KiB
Markdown
# 08 — Formato de saída
|
|
|
|
> **Escopo:** O JSON de entrega: estrutura, regras e como o programa trata erros.
|
|
> **Quando:** Fase 8 — ver a ordem de trabalho em `../SKILL.md`.
|
|
|
|
O produto do seu trabalho é **este JSON**. É ele que vai para o programa
|
|
gerar o FCPXML. Você nunca escreve XML.
|
|
|
|
## Estrutura
|
|
|
|
```json
|
|
{
|
|
"source": "0E6A8290.mp4",
|
|
"actions": [
|
|
{"kind": "cut", "start": 21.9, "end": 127.6,
|
|
"reason": "tomadas descartadas, frases interrompidas e conversa com a equipe"},
|
|
{"kind": "zoom", "start": 2.0, "end": 10.7,
|
|
"params": {"scale": 1.15}, "reason": "abertura: \"Aquela mama\" (ênfase 0.42)"},
|
|
{"kind": "text", "start": 127.7, "end": 129.0,
|
|
"params": {"content": "MASTOPEXIA"}, "reason": "fixa o termo central"},
|
|
{"kind": "marker", "start": 21.85, "end": 22.0,
|
|
"reason": "EMENDA 1 — conferir junção entre tomadas"}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Regras
|
|
|
|
### 1. Tempos em segundos da mídia ORIGINAL
|
|
Exatamente como aparecem no `voice_timeline.json`.
|
|
|
|
**Nunca compense para "depois do corte".** O programa faz esse deslocamento
|
|
sozinho: ele resolve os cortes primeiro e reposiciona todo o resto. Se você
|
|
compensar por conta própria, **todo destaque cai no frame errado** — e o
|
|
erro é silencioso.
|
|
|
|
### 2. `end` sempre maior que `start`
|
|
Ambos ≥ 0. Um `end <= start` é rejeitado.
|
|
|
|
### 3. Tipos
|
|
`cut` · `zoom` · `text` · `marker`
|
|
|
|
### 4. Parâmetros por tipo
|
|
|
|
| Tipo | `params` |
|
|
|---|---|
|
|
| `cut` | nenhum |
|
|
| `zoom` | `scale` entre 1.0 e 3.0 (padrão 1.3 se omitido) |
|
|
| `text` | `content` **obrigatório**, até 120 caracteres |
|
|
| `marker` | opcional: `content` vira o nome do marcador |
|
|
|
|
### 5. `reason` — sempre preencha
|
|
É o que o usuário lê para revisar sua decisão, e o que te obriga a **ter**
|
|
uma. Um `reason` vazio é sinal de decisão sem critério.
|
|
|
|
Inclua o dado que embasou: *"abertura: 'Aquela mama' (ênfase 0.42)"* é útil;
|
|
*"zoom"* não é.
|
|
|
|
Não é campo de log: o texto é **exibido na tela de revisão**, ao lado da frase,
|
|
e é o que o editor lê antes de manter ou desfazer o que você decidiu.
|
|
|
|
### 6. Corte: alinhe à intenção
|
|
A tela lê cada `cut` contra as frases da transcrição:
|
|
|
|
- cobre **≥ 60%** de uma frase → aquela frase é **removida**;
|
|
- toca só o **começo** ou só o **fim** → vira **trim** (a frase fica, aparada).
|
|
|
|
Então corte a frase **inteira** quando quiser removê-la, e corte **só da borda
|
|
até a palavra** quando quiser aparar uma hesitação. Um corte de meia frase é
|
|
ambíguo — passa de 60% e apaga a linha toda. Detalhe: `10-revisao-humana.md`.
|
|
|
|
## Como o programa trata erros
|
|
|
|
- **Ação inválida** → rejeitada e reportada **individualmente**. Uma linha
|
|
malformada nunca derruba as outras.
|
|
- **Ação apontando para material cortado** → descartada e reportada, nunca
|
|
deslizada para o conteúdo vizinho.
|
|
- **Ação fora da mídia** → reportada como não colocada.
|
|
|
|
Você recebe o relatório dos três casos. **Repasse ao usuário** — nunca
|
|
relate só os acertos.
|