From a680a325fc621bff2fdf646790c238e5332deef6 Mon Sep 17 00:00:00 2001 From: Dudu Jarra Date: Fri, 1 May 2026 00:00:15 -0300 Subject: [PATCH 1/3] SPEC-001 v2: reframe AUTOEDIT como ferramenta pessoal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Tese: ferramenta pessoal Dudu, não produto pra vender - Escopo V0 encolhido: Modo 1 + Modo 3 (trivial) - Modo 2 → V0.5; Multicam → V1 - Métrica única: Dudu monta vídeo 10-30min em <50% tempo manual - Prior art consultado: buttercut (referência), claude-code-video-toolkit (descartado), Monet (descartado V0), Adobe Media Intelligence (avaliar) - ADR-004 adicionado (buttercut = ref, não fork) - Riscos reduzidos: multicam fora de V0 elimina 2 dos 5 riscos críticos Harness: 30/30 pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 55 +++++--- specs/arquitetura/SPEC-001-arquitetura-v0.md | 141 +++++++++++++------ 2 files changed, 135 insertions(+), 61 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 6ec6018..34c5461 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,11 +18,19 @@ Este projeto opera sob **Modo Akita** (regras universais do Dudu, ver `~/.claude --- -## Visão V0 +## Visão V0 (reframe 2026-04-30) -Editor que aceita material de vídeo + uma de três entradas (decupagem doc estruturada, briefing casual, ou XML pronto) e devolve sequência montada no Adobe Premiere Pro 2026. Suporte a 1 câmera e multicam. +**AUTOEDIT é ferramenta pessoal do Dudu, não produto pra vender.** Objetivo: Claude controla Premiere Pro 2026 ao vivo via MCP, igual controla Blender (3D) ou After (motion). -**Dudu interage via chat com Claude Code (Max20).** Claude usa Adobe_Premiere_Pro_MCP (97 tools sobre Premiere) + helpers Python locais (transcrição, parsing, sync). +Editor aceita material de vídeo + decupagem doc estruturada e devolve sequência montada no Premiere Pro 2026 aberto. + +**V0 mínimo:** Modo 1 (decupagem doc) + Modo 3 (XML direto, trivial). 1 câmera. +**V0.5:** Modo 2 (briefing casual). +**V1:** Multicam. + +**Dudu interage via chat com Claude Code (Max20).** Claude usa Adobe_Premiere_Pro_MCP (~97 tools sobre Premiere) + helpers Python locais (transcrição, parsing, sync). + +**Métrica única de sucesso:** Dudu monta vídeo 10-30min em <50% do tempo sem AUTOEDIT. Sem isso, projeto não está pronto — não importa quantas specs aprovadas. --- @@ -75,19 +83,19 @@ Editor que aceita material de vídeo + uma de três entradas (decupagem doc estr --- -## Modos de input (V0) +## Modos de input -### Modo 1 — Decupagem doc estruturada +### Modo 1 — Decupagem doc estruturada (V0) Dudu manda PDF/DOCX/MD com decisões editoriais. Sistema parseia + monta. -### Modo 2 — Briefing casual -Dudu fala em texto livre ("monta corte de 90s focando momentos sobre X"). Sistema transcreve material, mapeia briefing↔segmentos, propõe cortes. - -### Modo 3 — XML direto +### Modo 3 — XML direto (V0, trivial) Dudu já tem xmeml pronto. Sistema só ingere e aplica via MCP. -### Multicam (transversal aos 3 modos) -audalign sincroniza câmeras → LLM decide switching → sequência multicam. +### Modo 2 — Briefing casual (V0.5, adiado) +Dudu fala em texto livre ("monta corte de 90s focando momentos sobre X"). Sistema transcreve material, mapeia briefing↔segmentos, propõe cortes. Adiado até V0 estar confiável. + +### Multicam (V1, adiado) +audalign sincroniza câmeras → LLM decide switching → sequência multicam. Problema de pesquisa, alta complexidade. Adiado até dor real. --- @@ -191,13 +199,14 @@ AUTOEDIT/ --- -## Riscos ativos (V0) +## Riscos ativos (V0 reframe) -1. **Multicam V0 = 70% chance virar V1** — complexidade alta, problema de pesquisa -2. **3 modos paralelos = QA explode** — alta probabilidade um modo virar V1 -3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe, mitigação via OTIO fallback +1. ~~Multicam V0 = 70% chance virar V1~~ → resolvido: saiu de V0 pra V1 +2. ~~3 modos paralelos = QA explode~~ → resolvido: V0 = Modo 1 + Modo 3 trivial +3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe, mitigação via OTIO fallback (FCPXML offline igual buttercut) 4. **qwen3:14b limite** em transcrições longas (30min+) — chunking + Haiku fallback -5. **Estimativa V0**: 6-8 semanas otimista, 10-12 realista +5. **MCP pode falhar mid-edit** — sempre salvar estado intermediário em FCPXML antes de aplicar +6. **Estimativa V0 reframe**: 1-2 semanas pra F2+F3 (F0+F1 já prontos) --- @@ -209,9 +218,21 @@ ADRs ficam em `specs/arquitetura/ADR-NNN-titulo.md`. Cada uma documenta: - Decisão + justificativa - Consequências -ADR-001: MCP-first vs CLI próprio → MCP-first (97 tools prontas) +ADR-001: MCP-first vs CLI próprio → MCP-first (~97 tools prontas) ADR-002: LLM local + Haiku Max20 → ver `feedback_llm_strategy.md` em memory ADR-003: xmeml (FCP7 XML) via OTIO como fallback → Premiere não importa FCPXML moderno direto +ADR-004: Buttercut como referência, não fork → buttercut faz FCPXML offline; AUTOEDIT precisa controle MCP ao vivo. Estudar arquitetura, implementar próprio. + +--- + +## Prior art / referências + +| Projeto | URL | Status | Por quê | +|---------|-----|--------|---------| +| buttercut | github.com/barefootford/buttercut | Referência | Claude Code + WhisperX → FCPXML offline. Falta controle MCP ao vivo. | +| claude-code-video-toolkit | github.com/digitalsamba/claude-code-video-toolkit | Descartado | Gera vídeo do zero (Remotion/AI), não edita footage real. | +| Monet | mindstudio.ai | Descartado V0 | NLE novo agente-first; migrar workflow é caro, Premiere já é tooling do Dudu. | +| Adobe Media Intelligence | nativo Premiere 26 | A avaliar antes F2 | Search nativo por conteúdo. Pode reduzir parser próprio via MCP. | --- diff --git a/specs/arquitetura/SPEC-001-arquitetura-v0.md b/specs/arquitetura/SPEC-001-arquitetura-v0.md index 221d150..b39aa78 100644 --- a/specs/arquitetura/SPEC-001-arquitetura-v0.md +++ b/specs/arquitetura/SPEC-001-arquitetura-v0.md @@ -1,59 +1,83 @@ -# SPEC-001 — Arquitetura V0 (MCP-first) +# SPEC-001 — Arquitetura V0 (MCP-first, ferramenta pessoal) -**Status:** Aprovado pelo Dudu (plan mode 2026-04-30) -**Plan file de origem:** `~/.claude/plans/cozy-snacking-sifakis.md` +**Status:** v2 aprovado pelo Dudu (reframe 2026-04-30) +**Versão anterior:** v1 (escopo expandido com 3 modos + multicam) — superseded +**Plan file de origem v1:** `~/.claude/plans/cozy-snacking-sifakis.md` **Harness:** `scripts/spec-001-harness.sh` --- +## Tese (v2 reframe) + +AUTOEDIT é **ferramenta pessoal do Dudu**, não produto pra vender. Objetivo: Claude controla Premiere Pro 2026 ao vivo via MCP, igual controla Blender (3D) ou After (motion). Sem competir com mercado, sem distribuir, sem multi-usuário. + +Implicação: encolher escopo V0 ao mínimo que economiza tempo real do Dudu editando. Tudo que não economiza tempo dele agora vai pra V1+ ou nunca. + +--- + ## O que é -Arquitetura V0 do AUTOEDIT: editor automático de vídeo no Premiere Pro 2026 via chat natural com Claude Code (Max20). Suporta 3 modos de input (decupagem doc, briefing casual, XML direto), 1 câmera e multicam. +Editor automático que aceita material de vídeo + decupagem doc estruturada e devolve sequência montada no Premiere Pro 2026 aberto. **Diferencial vs prior art (buttercut, claude-code-video-toolkit):** controle MCP ao vivo sobre Premiere, não só geração de FCPXML offline. -A escolha arquitetural central: **MCP-first**, usando `Adobe_Premiere_Pro_MCP` (hetpatel-11) que expõe 97 tools sobre Premiere via protocolo MCP, ao invés de construir UXP plugin custom (UXP API ainda imatura, leva meses). +Escolha arquitetural central: **MCP-first**, usando `Adobe_Premiere_Pro_MCP` (hetpatel-11) que expõe ~97 tools sobre Premiere via protocolo MCP, ao invés de UXP plugin custom (UXP API ainda imatura, leva meses). -## Input +--- + +## Input (V0 mínimo) -- **Material de vídeo:** arquivos `.mp4`, `.mov`, `.wav` em pasta local (`material_teste/` em dev) -- **Instrução editorial** (uma das três): - - **Modo 1 — Decupagem doc:** PDF/DOCX/MD com decisões editoriais estruturadas - - **Modo 2 — Briefing casual:** texto livre via chat ("monta corte 90s focando momentos sobre X") - - **Modo 3 — XML direto:** xmeml (FCP7 XML) pronto pra import +- **Material de vídeo:** arquivos `.mp4`, `.mov`, `.wav` em pasta local +- **Instrução editorial:** decupagem doc estruturada (PDF/DOCX/MD com TC IN/OUT por momento) - **Premiere Pro 2026 aberto** com projeto ativo -## Output esperado +--- + +## Output esperado (V0 mínimo) - Sequência montada na timeline do projeto Premiere ativo, com: - Clipes importados (se ainda não estavam na bin) - Cortes nos timecodes corretos - - Tracks corretos (V1/V2, A1/A2) + - Tracks corretos (V1+A1) - Marcadores opcionais nos pontos-chave -- Para Modo 3 e fallback: arquivo `.xml` (xmeml) salvo em `outputs/` que Premiere importa -**Exemplo concreto Modo 1:** +**Exemplo concreto:** - Input: `material_teste/1cam/entrevista-longa.mp4` (30min) + `material_teste/1cam/briefing-exemplo.md` (markdown listando 8 momentos com TC IN/OUT) - Output: timeline Premiere com 8 cuts em V1+A1, ordem do briefing, total ~12min -## Regras de validação +--- -- [ ] Adobe_Premiere_Pro_MCP responde a `list_projects` via Claude Code (gate F0) +## Regras de validação (V0 mínimo) + +- [ ] Adobe_Premiere_Pro_MCP responde a `list_projects` via Claude Code (gate F0) ✅ feito - [ ] Helper `transcribe.py` retorna JSON pydantic-válido com `[{tc_in, tc_out, text}, ...]` em <2x duração do vídeo - [ ] Helper `parse_decupagem.py` extrai estrutura editorial de markdown teste com ≥80% recall vs labels manuais -- [ ] Modo 1 end-to-end: decupagem + 1cam → sequência montada que bate ≥70% com edição manual do Dudu -- [ ] Modo 2 end-to-end: briefing casual + 1cam → cortes coerentes (validação manual Dudu) -- [ ] Modo 3 end-to-end: xmeml exportado de outro Premiere → reimport idêntico -- [ ] Multicam: 2 câmeras + áudio mestre → sync com offset < 1 frame (audalign) +- [ ] Helper `xml_export.py` gera xmeml válido que Premiere importa sem erro +- [ ] **Modo 1 end-to-end**: decupagem + 1cam → sequência montada que bate ≥70% com edição manual do Dudu - [ ] CI verde em todos os PRs durante desenvolvimento - [ ] Nenhuma chamada à API Anthropic paga em todo o codebase +--- + +## Métrica de sucesso pessoal + +**Único critério que importa:** Dudu monta vídeo de 10-30min em **menos da metade do tempo** que sem AUTOEDIT, com qualidade subjetiva equivalente. + +Sem essa métrica batida, projeto não está "pronto". Não importa quantas specs aprovadas, harnesses verdes, ou linhas de código escritas. + +Medição: cronometrar 3 edições manuais (baseline) vs 3 edições com AUTOEDIT (mesmo tipo de material). Comparar tempo total chat→sequência aprovada. + +--- + ## Forbidden - ❌ Construir UXP plugin custom em V0 (escopo expandido) - ❌ Usar `import anthropic` com `ANTHROPIC_API_KEY` (Mandamento 7) - ❌ Spec em `specs/` sem harness correspondente (Regra 0) -- ❌ PR sem issue linkada (Mandamento 6 quando aplicável) - ❌ Material de teste committed no git (>50MB típico) - ❌ One-shot prompt sem entender resultado (Mandamento 3 — anti-vibe) +- ❌ Adicionar features "pra outros usarem" — V0 é só pra Dudu +- ❌ Otimizar pra escala / multi-usuário / pricing — não é produto + +--- ## Stack autorizada @@ -63,44 +87,65 @@ A escolha arquitetural central: **MCP-first**, usando `Adobe_Premiere_Pro_MCP` ( | LLM fallback | `claude -p` subprocess | Claude Code CLI Max20 | shell | | Transcrição | faster-whisper | 1.0.0 | PyPI | | MCP Premiere | hetpatel-11/Adobe_Premiere_Pro_MCP | testado v26 | GitHub | -| Multicam sync | audalign | 1.2.0 | PyPI | +| Multicam sync | audalign | 1.2.0 | PyPI (V1, não V0) | | Silêncio | auto-editor | 25.0.0 | PyPI | | XML export | OpenTimelineIO + otio-fcp-adapter | 0.17.0 / 0.1.0 | PyPI | | Schema | pydantic | 2.7.0 | PyPI | | Package mgr | uv | 0.9+ | já instalado | -## Fases de execução +--- -| Fase | Escopo | Estimativa | Specs derivadas | -|------|--------|-----------|-----------------| -| F0 | Setup SDD + infra + GitHub | 3-5 dias | SPEC-001 (esta) | -| F1 | Helpers Python | 4-7 dias | SPEC-002 a SPEC-006 (1 por helper) | -| F2 | Modo 1 (decupagem doc) | 5-7 dias | SPEC-007 | -| F3 | Modo 2 (briefing casual) | 4-6 dias | SPEC-008 | -| F4 | Modo 3 (XML direto) | 2-3 dias | SPEC-009 | -| F5 | Multicam ⚠️ | 8-12 dias | SPEC-010 | -| F6 | Polish + memory | 3-5 dias | SPEC-011 | +## Fases de execução (v2 reframe) -**Total V0 realista:** 6-8 semanas se tudo corre. 10-12 com bugs reais. +| Fase | Escopo | Status | Specs | +|------|--------|--------|-------| +| F0 | Setup SDD + infra + GitHub + Adobe MCP | ✅ feito | SPEC-001 | +| F1 | Helpers Python (5 módulos) | ✅ feito | SPEC-002 a SPEC-006 | +| **F2** | **Modo 1 (decupagem doc) — V0 final** | **próximo** | SPEC-007 | +| F3 | Modo 3 (XML direto) — trivial | depois F2 | SPEC-009 | +| **V0.5** | Modo 2 (briefing casual) | adiado | SPEC-008 quando V0 confiável | +| **V1** | Multicam ⚠️ | adiado | SPEC-010 quando dor real | +| V1+ | Polish, novas features | sob demanda | — | -## Riscos +**Total V0 realista:** 1-2 semanas pra F2+F3 (já temos F0+F1 prontos). + +--- -1. **Multicam V0 = 70% chance virar V1** — sync + switching = problema de pesquisa -2. **3 modos paralelos = QA cresce 3x** — alta probabilidade um modo virar V1 -3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe; mitigação OTIO fallback +## Riscos (v2 reduzidos) + +1. ~~Multicam V0 = 70% chance virar V1~~ → **resolvido**: multicam saiu de V0 +2. ~~3 modos paralelos = QA cresce 3x~~ → **resolvido**: V0 = 1 modo (Modo 1) + Modo 3 trivial +3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe; mitigação OTIO fallback (FCPXML offline igual buttercut) 4. **qwen3:14b limite** em transcrições longas — chunking + Haiku fallback -5. **Adobe MCP install mexe em Claude Desktop config** — gated, requer aprovação Dudu +5. **MCP pode falhar mid-edit** — sempre salvar estado intermediário em FCPXML antes de aplicar + +--- + +## Prior art consultado (2026-04-30) + +| Projeto | URL | Útil pra V0? | Por quê | +|---------|-----|--------------|---------| +| **buttercut** (barefootford) | github.com/barefootford/buttercut | Referência conceitual, não fork | Faz roughcut→FCPXML offline com Claude Code+WhisperX. Falta controle MCP ao vivo. Estudar arquitetura Ruby/XML, mas implementar próprio com MCP. | +| **claude-code-video-toolkit** (digitalsamba) | github.com/digitalsamba/claude-code-video-toolkit | Não | Gera vídeo do zero (Remotion/AI). Não edita footage real. | +| **Monet** (NLE AI-first) | mencionado em mindstudio.ai | Não V0 | NLE novo feito pra agentes. Migrar workflow é caro. Premiere já é tooling do Dudu. | +| **Adobe Media Intelligence** (Premiere 26) | nativo | **Avaliar antes F2** | Pode reduzir parser próprio. Search nativo por conteúdo via MCP. | + +--- ## Dependências externas -- Premiere Pro 2026 instalado (`/Applications/Adobe Premiere Pro 2026.app`) ✅ confirmado +- Premiere Pro 2026 instalado ✅ confirmado - Ollama rodando + qwen3:14b puxado ✅ confirmado -- Node 18+ + npm (pra MCP server) ✅ confirmado (Node 25) -- gh CLI logado (pra GitHub workflow) ✅ confirmado (`dudujarra`) +- Node 18+ + npm (pra MCP server) ✅ confirmado +- gh CLI logado ✅ confirmado (`dudujarra`) - Claude Code CLI funcional (pra Haiku Max20 fallback) -## Out of scope V0 (V1+) +--- + +## Out of scope V0 (adiado pra V1+) +- Modo 2 (briefing casual) → V0.5 +- Multicam (sync + switching) → V1 - UXP plugin custom com painel UI dentro Premiere - Web interface - Integração Resolve/FCP @@ -110,7 +155,15 @@ A escolha arquitetural central: **MCP-first**, usando `Adobe_Premiere_Pro_MCP` ( - SRT/burn-in legendas - Export final (Dudu exporta manual) - Multi-projeto / batch processing +- **Distribuição pra outros usuários** (não é produto) + +--- + +## Histórico + +- **v1 — 2026-04-30 plan mode:** escopo "3 modos + multicam desde V0", 6-8 semanas otimista. Aprovado mas Dudu reconheceu riscos. +- **v2 — 2026-04-30 reframe:** Dudu clarificou que AUTOEDIT é ferramenta pessoal, não produto. Multicam foi pra V1. Modo 2 foi pra V0.5. Foco V0 = Modo 1 + Modo 3. Prior art (buttercut) consultado e classificado como referência, não fork. ## Aprovação -Dudu aprovou via plan mode em 2026-04-30 com escopo "3 modos + multicam desde V0" mesmo após aviso de riscos. Decisão registrada. +v2 aprovado pelo Dudu via chat 2026-04-30 (sessão reframe). Decisão registrada. From 4380b0436f3412b49d6a23173e73660030f3d72a Mon Sep 17 00:00:00 2001 From: Dudu Jarra Date: Fri, 1 May 2026 00:05:27 -0300 Subject: [PATCH 2/3] SPEC-007: Modo 1 end-to-end + Adobe MI finding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SPEC-007 (Modo 1 decupagem doc → sequência Premiere) escrita - Harness scripts/spec-007-harness.sh (5 PASS / 0 FAIL / 3 SKIP) - Fixture tests/fixtures/decupagens/exemplo-modo1.md - SPEC-001 v2.1: Adobe Media Intelligence descartada V0 (hetpatel-11 MCP só wrappa ExtendScript, sem AI features Adobe) - CLAUDE.md atualizado com finding MI - Total harnesses: 2/2 PASS Refs #2 (F2 implementação) Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 2 +- scripts/spec-007-harness.sh | 99 +++++++++++++ specs/arquitetura/SPEC-001-arquitetura-v0.md | 3 +- .../SPEC-007-modo1-decupagem-end-to-end.md | 134 ++++++++++++++++++ tests/fixtures/decupagens/exemplo-modo1.md | 46 ++++++ 5 files changed, 282 insertions(+), 2 deletions(-) create mode 100755 scripts/spec-007-harness.sh create mode 100644 specs/modos/SPEC-007-modo1-decupagem-end-to-end.md create mode 100644 tests/fixtures/decupagens/exemplo-modo1.md diff --git a/CLAUDE.md b/CLAUDE.md index 34c5461..b2c2e1b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -232,7 +232,7 @@ ADR-004: Buttercut como referência, não fork → buttercut faz FCPXML offline; | buttercut | github.com/barefootford/buttercut | Referência | Claude Code + WhisperX → FCPXML offline. Falta controle MCP ao vivo. | | claude-code-video-toolkit | github.com/digitalsamba/claude-code-video-toolkit | Descartado | Gera vídeo do zero (Remotion/AI), não edita footage real. | | Monet | mindstudio.ai | Descartado V0 | NLE novo agente-first; migrar workflow é caro, Premiere já é tooling do Dudu. | -| Adobe Media Intelligence | nativo Premiere 26 | A avaliar antes F2 | Search nativo por conteúdo. Pode reduzir parser próprio via MCP. | +| Adobe Media Intelligence | nativo Premiere 26 | Descartado V0 | Avaliado 2026-04-30: hetpatel-11 MCP só wrappa ExtendScript. AI features (MI, Object Mask, Generative Extend, Speech-to-Text) não expostos. Parser próprio segue necessário. | --- diff --git a/scripts/spec-007-harness.sh b/scripts/spec-007-harness.sh new file mode 100755 index 0000000..8ed8b67 --- /dev/null +++ b/scripts/spec-007-harness.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +# Harness pra SPEC-007 (Modo 1 end-to-end). +# Valida pré-condições + smoke tests. SKIPs viram PASS quando implementação chegar. + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$REPO_ROOT" + +PASS=0 +FAIL=0 +SKIP=0 + +ok() { echo " ✓ $1"; PASS=$((PASS+1)); } +fail() { echo " ✗ $1"; FAIL=$((FAIL+1)); } +skip() { echo " ⊙ SKIP: $1"; SKIP=$((SKIP+1)); } + +echo "=== SPEC-007 harness — Modo 1 end-to-end ===" +echo + +echo "[1/5] Spec + fixture existem" +SPEC_FILE="specs/modos/SPEC-007-modo1-decupagem-end-to-end.md" +FIXTURE_FILE="tests/fixtures/decupagens/exemplo-modo1.md" +if [ -f "$SPEC_FILE" ]; then ok "spec existe: $SPEC_FILE"; else fail "spec faltando: $SPEC_FILE"; fi +if [ -f "$FIXTURE_FILE" ]; then ok "fixture existe: $FIXTURE_FILE"; else fail "fixture faltando: $FIXTURE_FILE"; fi + +echo +echo "[2/5] Helpers de dependência (SPEC-003, SPEC-006)" +for f in helpers/parse_decupagem.py helpers/xml_export.py helpers/schemas.py; do + if [ -f "$f" ]; then ok "dep existe: $f"; else fail "dep faltando: $f"; fi +done + +echo +echo "[3/5] Implementação Modo 1 (skipa até existir)" +if [ -f "helpers/modo1.py" ]; then + ok "helpers/modo1.py existe" + if command -v uv >/dev/null 2>&1; then + if uv run python -c "from helpers import modo1" 2>/dev/null; then + ok "helpers.modo1 importável" + else + fail "helpers.modo1 não importa (erro de sintaxe ou deps)" + fi + else + skip "uv não disponível pra testar import" + fi +else + skip "helpers/modo1.py ainda não implementado (esperado durante F2)" +fi + +echo +echo "[4/5] Smoke test parse_decupagem em fixture" +if command -v uv >/dev/null 2>&1 && [ -f "$FIXTURE_FILE" ]; then + set +e + PARSE_OUTPUT=$(uv run python helpers/parse_decupagem.py "$FIXTURE_FILE" 2>&1) + PARSE_EXIT=$? + set -e + if [ $PARSE_EXIT -eq 0 ]; then + if echo "$PARSE_OUTPUT" | grep -q '"cuts"'; then + ok "parse_decupagem produz JSON com 'cuts' pra fixture" + else + fail "parse_decupagem rodou mas output não tem campo 'cuts'" + fi + else + skip "parse_decupagem retornou erro (esperado se LLM local indisponível em CI)" + fi +else + skip "uv ou fixture não disponível" +fi + +echo +echo "[5/5] Smoke test FCPXML fallback (skipa até modo1.py existir)" +if [ -f "helpers/modo1.py" ] && command -v uv >/dev/null 2>&1; then + set +e + AUTOEDIT_MCP=off uv run python helpers/modo1.py "$FIXTURE_FILE" 2>&1 | tail -5 + M1_EXIT=$? + set -e + if [ $M1_EXIT -eq 0 ]; then + XML_COUNT=$(find outputs -maxdepth 1 -name "modo1_*.xml" -newer "$SPEC_FILE" 2>/dev/null | wc -l | tr -d ' ') + if [ "$XML_COUNT" -ge 1 ]; then + ok "modo1 fallback gerou FCPXML em outputs/" + else + fail "modo1 rodou mas nenhum modo1_*.xml em outputs/" + fi + else + fail "modo1 fallback retornou erro $M1_EXIT" + fi +else + skip "modo1.py não implementado — smoke test FCPXML adiado" +fi + +echo +echo "=================================" +echo " PASS: $PASS FAIL: $FAIL SKIP: $SKIP" +echo "=================================" +if [ $FAIL -gt 0 ]; then + echo "✗ SPEC-007 harness FAILED" + exit 1 +fi +echo "✓ SPEC-007 harness OK (SKIPs viram PASS quando F2 implementar modo1.py)" diff --git a/specs/arquitetura/SPEC-001-arquitetura-v0.md b/specs/arquitetura/SPEC-001-arquitetura-v0.md index b39aa78..ff18230 100644 --- a/specs/arquitetura/SPEC-001-arquitetura-v0.md +++ b/specs/arquitetura/SPEC-001-arquitetura-v0.md @@ -128,7 +128,7 @@ Medição: cronometrar 3 edições manuais (baseline) vs 3 edições com AUTOEDI | **buttercut** (barefootford) | github.com/barefootford/buttercut | Referência conceitual, não fork | Faz roughcut→FCPXML offline com Claude Code+WhisperX. Falta controle MCP ao vivo. Estudar arquitetura Ruby/XML, mas implementar próprio com MCP. | | **claude-code-video-toolkit** (digitalsamba) | github.com/digitalsamba/claude-code-video-toolkit | Não | Gera vídeo do zero (Remotion/AI). Não edita footage real. | | **Monet** (NLE AI-first) | mencionado em mindstudio.ai | Não V0 | NLE novo feito pra agentes. Migrar workflow é caro. Premiere já é tooling do Dudu. | -| **Adobe Media Intelligence** (Premiere 26) | nativo | **Avaliar antes F2** | Pode reduzir parser próprio. Search nativo por conteúdo via MCP. | +| **Adobe Media Intelligence** (Premiere 26) | nativo | **Descartado V0** | Avaliado 2026-04-30: hetpatel-11 MCP não expõe MI/Object Mask/Generative Extend/Speech-to-Text — só ExtendScript wrapping. Parser próprio continua necessário. Reavaliar quando MCP expor AI features. | --- @@ -163,6 +163,7 @@ Medição: cronometrar 3 edições manuais (baseline) vs 3 edições com AUTOEDI - **v1 — 2026-04-30 plan mode:** escopo "3 modos + multicam desde V0", 6-8 semanas otimista. Aprovado mas Dudu reconheceu riscos. - **v2 — 2026-04-30 reframe:** Dudu clarificou que AUTOEDIT é ferramenta pessoal, não produto. Multicam foi pra V1. Modo 2 foi pra V0.5. Foco V0 = Modo 1 + Modo 3. Prior art (buttercut) consultado e classificado como referência, não fork. +- **v2.1 — 2026-04-30 finding:** Avaliação Adobe Media Intelligence via MCP concluída — hetpatel-11 MCP só expõe ExtendScript, sem AI features Adobe. Parser próprio confirmado necessário V0. MI reavaliada quando/se MCP expor. ## Aprovação diff --git a/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md b/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md new file mode 100644 index 0000000..e913aa6 --- /dev/null +++ b/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md @@ -0,0 +1,134 @@ +# SPEC-007 — Modo 1 end-to-end (decupagem doc → sequência Premiere) + +**Status:** Rascunho — aguarda aprovação Dudu +**Fase:** F2 (V0 final) +**Depende de:** SPEC-001 v2, SPEC-003 (parse_decupagem), SPEC-006 (xml_export) +**Harness:** `scripts/spec-007-harness.sh` +**Branch sugerido:** `feat/SPEC-007-modo1-end-to-end` +**Issue:** a abrir + +--- + +## O que é + +Modo 1 end-to-end: orquestra parse de decupagem doc estruturada + import de material + criação de sequência Premiere com cortes nos timecodes corretos. Implementado como helper Python `helpers/modo1.py` invocável via Bash, mais wiring com Adobe_Premiere_Pro_MCP via Claude Code. + +Modo 1 é o **caminho principal V0**. Sucesso aqui = AUTOEDIT pronto pra uso pessoal Dudu (combinado com Modo 3 trivial). + +--- + +## Input + +- **Decupagem doc:** `.md`, `.pdf`, ou `.docx` com estrutura mínima (cuts com TC IN/OUT + clip path) +- **Material de vídeo:** arquivos referenciados pelos `clip_path` em `decupagem.cuts[*]` +- **Premiere Pro 2026 aberto** com projeto ativo (verificável via MCP `get_project_info`) + +Fixture canônica: `tests/fixtures/decupagens/exemplo-modo1.md` + +--- + +## Output esperado + +### Caminho feliz (MCP ao vivo) + +Sequência criada no projeto Premiere ativo: +- Nome `AUTOEDIT_modo1_` +- Clipes importados em bin `AUTOEDIT/Modo1` +- Cortes na timeline V1+A1 (ou tracks especificados nos cuts) nos TCs do decupagem +- Marcadores opcionais nos pontos da seção `## Marcadores` +- Project salvo + +### Caminho fallback (MCP indisponível) + +FCPXML gerado em `outputs/modo1_.xml` (xmeml via OTIO/otio-fcp-adapter), Dudu importa manual. + +--- + +## Pipeline interno + +``` +1. parse_decupagem.py(doc) → DecupagemResult (pydantic) + ├─ valida schema + ├─ resolve clip_paths absolutos + └─ verifica arquivos existem + +2. Pré-flight MCP + ├─ tenta get_project_info via MCP + └─ se falhar → modo fallback FCPXML + +3a. Modo MCP ao vivo: + ├─ create_bin "AUTOEDIT/Modo1" + ├─ import_media (cuts.clip_path únicos) + ├─ create_sequence (settings do primeiro clip importado) + ├─ pra cada cut: add_to_timeline(clip, tc_in, tc_out, V_track, A_track) + ├─ pra cada cut com transition_*: add_transition_to_clip + ├─ pra cada marker: add_marker(tc, label) + └─ save_project + +3b. Modo FCPXML fallback: + ├─ xml_export.py(decupagem) → xmeml string + └─ salva em outputs/modo1_.xml + +4. Retorna JSON com {sequence_name, n_cuts, n_markers, mode: "mcp"|"fcpxml", elapsed_s} +``` + +--- + +## Regras de validação + +- [ ] Helper `helpers/modo1.py` existe e é importável (`uv run python -c "from helpers import modo1"`) +- [ ] CLI `uv run python helpers/modo1.py ` retorna JSON válido em stdout +- [ ] Fixture `tests/fixtures/decupagens/exemplo-modo1.md` parseia sem erro (schema `DecupagemResult` válido) +- [ ] Smoke test FCPXML: rodar Modo 1 em fixture com MCP forçado off → arquivo `outputs/modo1_*.xml` gerado, parse OTIO sem erro +- [ ] Smoke test MCP (gated, só com Premiere aberto): rodar em fixture → sequência criada com 4 clips na timeline, ≥0 marcadores +- [ ] Pipeline completo termina em <30s pra fixture de 4 cuts +- [ ] LLM não chamado em Modo 1 happy-path (decupagem é estruturada — qwen3 só pra fallback caso parse_decupagem falhe) +- [ ] Nenhum `import anthropic` em código modo1 +- [ ] Pytest `tests/test_spec_007_modo1.py` passa + +--- + +## Forbidden + +- ❌ Implementar lógica de seleção/ranking — Modo 1 é puramente declarativo (decupagem dita) +- ❌ Modificar source clips — apenas referenciar, não cortar/encodar +- ❌ Hardcodar tracks (V1/A1) — respeitar o que decupagem declara em `Cut.track_video/audio` +- ❌ Falhar silenciosamente em MCP error — sempre cair pro fallback FCPXML, nunca abortar +- ❌ Chamada à API Anthropic paga (Mandamento 7) +- ❌ One-shot prompt sem entender resultado (Mandamento 3) +- ❌ Usar input do usuário em path sem validação (path traversal — `Path.resolve()` + verificar dentro de cwd ou caminho absoluto whitelisted) + +--- + +## Stack autorizada + +| Componente | Origem | Notas | +|------------|--------|-------| +| `helpers/parse_decupagem.py` | SPEC-003 | já implementado | +| `helpers/xml_export.py` | SPEC-006 | já implementado | +| `helpers/schemas.py::DecupagemResult` | F1 | reusa direto | +| Adobe_Premiere_Pro_MCP | hetpatel-11 | tools: `get_project_info`, `create_bin`, `import_media`, `create_sequence`, `add_to_timeline`, `add_transition_to_clip`, `add_marker`, `save_project` | +| Click ou argparse | Python stdlib/PyPI | CLI parsing | + +--- + +## Não inclui (V0.5+) + +- Modo 2 (briefing casual) — SPEC-008 +- Multicam — SPEC-010 +- Auto-detecção de silêncio integrada — usuário pode pré-rodar `silence_detect.py` e excluir trechos manualmente da decupagem +- Renderização final — Dudu exporta manual + +--- + +## Riscos + +1. **MCP `add_to_timeline` semântica de TC** — pode usar source-relative ou sequence-relative. Validar empiricamente antes de implementar fully. +2. **Bin path `AUTOEDIT/Modo1`** — MCP pode não suportar paths nested. Fallback: bin flat `AUTOEDIT_Modo1`. +3. **Project não salvo automaticamente** — sempre chamar `save_project` no fim, mas Premiere pode prompt diálogo (UX issue, não funcional). + +--- + +## Aprovação + +Pendente Dudu. diff --git a/tests/fixtures/decupagens/exemplo-modo1.md b/tests/fixtures/decupagens/exemplo-modo1.md new file mode 100644 index 0000000..5ec16e3 --- /dev/null +++ b/tests/fixtures/decupagens/exemplo-modo1.md @@ -0,0 +1,46 @@ +# Decupagem teste — Modo 1 SPEC-007 + +Fixture mínima pra validar pipeline Modo 1 end-to-end. Não usa material real (paths apontam pra arquivos sintéticos gerados no harness). + +**Título:** Entrevista exemplo — corte 90s +**Duração alvo:** 90 segundos + +## Cuts + +### 1. Abertura — saudação +- **Clip:** `material_teste/1cam/entrevista-sintetica.mp4` +- **TC IN:** 00:00:05.000 +- **TC OUT:** 00:00:18.500 +- **Track vídeo:** V1 +- **Track áudio:** A1 +- **Label:** abertura + +### 2. Conceito principal +- **Clip:** `material_teste/1cam/entrevista-sintetica.mp4` +- **TC IN:** 00:01:22.000 +- **TC OUT:** 00:01:55.300 +- **Track vídeo:** V1 +- **Track áudio:** A1 +- **Label:** conceito + +### 3. Exemplo concreto +- **Clip:** `material_teste/1cam/entrevista-sintetica.mp4` +- **TC IN:** 00:03:10.500 +- **TC OUT:** 00:03:38.000 +- **Track vídeo:** V1 +- **Track áudio:** A1 +- **Label:** exemplo + +### 4. Encerramento +- **Clip:** `material_teste/1cam/entrevista-sintetica.mp4` +- **TC IN:** 00:08:42.000 +- **TC OUT:** 00:08:57.500 +- **Track vídeo:** V1 +- **Track áudio:** A1 +- **Label:** encerramento +- **Transição saída:** dip_to_black_24 + +## Marcadores + +- **00:00:18.500** — fim_abertura +- **00:01:55.300** — fim_conceito From cfc8e2159bfa51f412c0ffe1db5878d9d9543b42 Mon Sep 17 00:00:00 2001 From: Dudu Jarra Date: Fri, 1 May 2026 00:10:41 -0300 Subject: [PATCH 3/3] SPEC-009 + ADR-005: Modo 3 antes de Modo 1, ExtendScript EOL tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decisões pós-pesquisa profunda 2026-04-30: 1. **Modo 3 ANTES de Modo 1** — Modo 3 (XML direto) é canário de fumaça MCP: sem decisão editorial, sem LLM, só import XML. Valida pipeline antes do investimento maior em Modo 1. 2. **ADR-005: ExtendScript EOL Setembro 2026** — Adobe oficializou em Nov/2025. hetpatel-11 MCP é ExtendScript-based. V0 vive ~5 meses. V1 obrigatoriamente migra UXP (já em Premiere 25.6+) ou forka MCP UXP-based. 3. **Mitigação bug Premiere 2025 "random footage"** — `import_media` pode linkar arquivo errado em naming collisions. SPEC-007 e SPEC-009 agora exigem `get_clip_properties` pós-add pra validar que clip adicionado é o esperado. 4. **Path traversal hardening explícito** em SPEC-007/SPEC-009 — resolver paths absolutos, allowlist de diretórios, validar suffix de arquivo. Artefatos: - SPEC-009 (Modo 3 XML direto) — escrita - spec-009-harness.sh (4 PASS / 1 SKIP) - Fixture exemplo-modo3.xml (xmeml FCP7 válido) - SPEC-007 atualizada (path hardening + bug Premiere mitigação + EOL note) - SPEC-001 v2 atualizada (riscos 6/7/8 novos) - CLAUDE.md ADR-005 adicionada Total harnesses: 3/3 PASS. Refs #2 (F2 strategy update), #3 (V1 UXP migration tracking) Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 1 + scripts/spec-009-harness.sh | 78 ++++++++++ specs/arquitetura/SPEC-001-arquitetura-v0.md | 3 + .../SPEC-007-modo1-decupagem-end-to-end.md | 8 +- specs/modos/SPEC-009-modo3-xml-direto.md | 133 ++++++++++++++++++ tests/fixtures/decupagens/exemplo-modo3.xml | 56 ++++++++ 6 files changed, 278 insertions(+), 1 deletion(-) create mode 100755 scripts/spec-009-harness.sh create mode 100644 specs/modos/SPEC-009-modo3-xml-direto.md create mode 100644 tests/fixtures/decupagens/exemplo-modo3.xml diff --git a/CLAUDE.md b/CLAUDE.md index b2c2e1b..6202ebf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -222,6 +222,7 @@ ADR-001: MCP-first vs CLI próprio → MCP-first (~97 tools prontas) ADR-002: LLM local + Haiku Max20 → ver `feedback_llm_strategy.md` em memory ADR-003: xmeml (FCP7 XML) via OTIO como fallback → Premiere não importa FCPXML moderno direto ADR-004: Buttercut como referência, não fork → buttercut faz FCPXML offline; AUTOEDIT precisa controle MCP ao vivo. Estudar arquitetura, implementar próprio. +ADR-005: ExtendScript V0 + UXP V1 → Adobe oficializou EOL ExtendScript Setembro 2026 (Nov/2025). hetpatel-11 MCP usa ExtendScript. V0 entrega valor antes da deadline (5 meses). V1 migra pra UXP (já em Premiere 25.6+) ou forka MCP UXP-based. --- diff --git a/scripts/spec-009-harness.sh b/scripts/spec-009-harness.sh new file mode 100755 index 0000000..a06343d --- /dev/null +++ b/scripts/spec-009-harness.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# Harness pra SPEC-009 (Modo 3 XML direto). +# Valida pré-condições + smoke tests. SKIPs viram PASS quando implementação chegar. + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$REPO_ROOT" + +PASS=0 +FAIL=0 +SKIP=0 + +ok() { echo " ✓ $1"; PASS=$((PASS+1)); } +fail() { echo " ✗ $1"; FAIL=$((FAIL+1)); } +skip() { echo " ⊙ SKIP: $1"; SKIP=$((SKIP+1)); } + +echo "=== SPEC-009 harness — Modo 3 XML direto ===" +echo + +echo "[1/4] Spec + fixture existem" +SPEC_FILE="specs/modos/SPEC-009-modo3-xml-direto.md" +FIXTURE_FILE="tests/fixtures/decupagens/exemplo-modo3.xml" +if [ -f "$SPEC_FILE" ]; then ok "spec existe: $SPEC_FILE"; else fail "spec faltando: $SPEC_FILE"; fi +if [ -f "$FIXTURE_FILE" ]; then ok "fixture existe: $FIXTURE_FILE"; else fail "fixture faltando: $FIXTURE_FILE"; fi + +echo +echo "[2/4] Fixture xmeml válido (parse XML)" +if command -v python3 >/dev/null 2>&1 && [ -f "$FIXTURE_FILE" ]; then + if python3 -c "import xml.etree.ElementTree as ET; t = ET.parse('$FIXTURE_FILE'); r = t.getroot(); assert r.tag == 'xmeml', f'root not xmeml: {r.tag}'; print('OK')" 2>/dev/null | grep -q "OK"; then + ok "fixture xmeml parse OK + root é " + else + fail "fixture xmeml parse falhou" + fi +else + skip "python3 não disponível" +fi + +echo +echo "[3/4] Implementação Modo 3 (skipa até existir)" +if [ -f "helpers/modo3.py" ]; then + ok "helpers/modo3.py existe" + if command -v uv >/dev/null 2>&1; then + if uv run python -c "from helpers import modo3" 2>/dev/null; then + ok "helpers.modo3 importável" + else + fail "helpers.modo3 não importa" + fi + else + skip "uv não disponível" + fi +else + skip "helpers/modo3.py ainda não implementado (esperado durante F2)" +fi + +echo +echo "[4/4] OTIO + otio-fcp-adapter disponíveis" +if command -v uv >/dev/null 2>&1; then + if uv run python -c "import opentimelineio; import opentimelineio_fcp_adapter" 2>/dev/null; then + ok "OTIO + otio-fcp-adapter importáveis" + elif uv run python -c "import opentimelineio" 2>/dev/null; then + ok "OTIO importável (otio-fcp-adapter pode estar faltando — verificar pyproject)" + else + skip "OTIO não instalado (rodar uv sync)" + fi +else + skip "uv não disponível" +fi + +echo +echo "=================================" +echo " PASS: $PASS FAIL: $FAIL SKIP: $SKIP" +echo "=================================" +if [ $FAIL -gt 0 ]; then + echo "✗ SPEC-009 harness FAILED" + exit 1 +fi +echo "✓ SPEC-009 harness OK (SKIPs viram PASS quando F2 implementar modo3.py)" diff --git a/specs/arquitetura/SPEC-001-arquitetura-v0.md b/specs/arquitetura/SPEC-001-arquitetura-v0.md index ff18230..596da5a 100644 --- a/specs/arquitetura/SPEC-001-arquitetura-v0.md +++ b/specs/arquitetura/SPEC-001-arquitetura-v0.md @@ -118,6 +118,9 @@ Medição: cronometrar 3 edições manuais (baseline) vs 3 edições com AUTOEDI 3. **Adobe_Premiere_Pro_MCP é third-party** — sem SLA Adobe; mitigação OTIO fallback (FCPXML offline igual buttercut) 4. **qwen3:14b limite** em transcrições longas — chunking + Haiku fallback 5. **MCP pode falhar mid-edit** — sempre salvar estado intermediário em FCPXML antes de aplicar +6. 🔴 **ExtendScript EOL Setembro 2026** — Adobe anunciou fim oficial em Nov/2025. hetpatel-11 MCP usa ExtendScript via ScriptUI. ~5 meses de vida útil V0. V1 migra pra UXP (já disponível em Premiere 25.6+) ou forka. Ver ADR-005. +7. 🟠 **Bug Premiere 2025 "random footage insertion"** — `import_media` pode linkar arquivo errado quando há naming overlap. Mitigação SPEC-007: usar paths absolutos + validar nome do clip pós-`add_to_timeline`. +8. 🟢 **OTIO nativo Premiere em BETA** — interchange OTIO disponível em Premiere Beta. Quando GA, pode eliminar conversão xmeml. Reavaliar V1. --- diff --git a/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md b/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md index e913aa6..1f17362 100644 --- a/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md +++ b/specs/modos/SPEC-007-modo1-decupagem-end-to-end.md @@ -96,7 +96,11 @@ FCPXML gerado em `outputs/modo1_.xml` (xmeml via OTIO/otio-fcp-adapte - ❌ Falhar silenciosamente em MCP error — sempre cair pro fallback FCPXML, nunca abortar - ❌ Chamada à API Anthropic paga (Mandamento 7) - ❌ One-shot prompt sem entender resultado (Mandamento 3) -- ❌ Usar input do usuário em path sem validação (path traversal — `Path.resolve()` + verificar dentro de cwd ou caminho absoluto whitelisted) +- ❌ Usar input do usuário em path sem validação. Hardening obrigatório: + - `Path(p).resolve()` em todo `clip_path` + - Rejeitar paths que escapam: `..`, symlinks pra fora, paths absolutos fora de allowlist (`material_teste/`, `~/Movies/`, `~/Documents/`, `/Volumes/`) + - Verificar `path.is_file()` e `path.suffix in {'.mp4', '.mov', '.wav', ...}` antes de passar pro MCP +- ❌ Confiar em retorno MCP sem validar — sempre cross-check com `get_clip_properties` (mitigação bug Premiere 2025) --- @@ -126,6 +130,8 @@ FCPXML gerado em `outputs/modo1_.xml` (xmeml via OTIO/otio-fcp-adapte 1. **MCP `add_to_timeline` semântica de TC** — pode usar source-relative ou sequence-relative. Validar empiricamente antes de implementar fully. 2. **Bin path `AUTOEDIT/Modo1`** — MCP pode não suportar paths nested. Fallback: bin flat `AUTOEDIT_Modo1`. 3. **Project não salvo automaticamente** — sempre chamar `save_project` no fim, mas Premiere pode prompt diálogo (UX issue, não funcional). +4. 🟠 **Bug Premiere 2025 "random footage from other projects"** — `import_media` pode linkar arquivo errado quando há naming collisions. **Mitigação obrigatória:** usar `clip_path` absoluto sempre + após `add_to_timeline`, validar via `get_clip_properties` que o clip adicionado tem nome esperado. Se mismatch → abortar e cair pro fallback FCPXML. +5. 🔴 **ExtendScript EOL Setembro 2026** (ADR-005) — V0 vive ~5 meses até deprecação. Implementação NÃO pode assumir longevidade indefinida. V1 migra UXP. --- diff --git a/specs/modos/SPEC-009-modo3-xml-direto.md b/specs/modos/SPEC-009-modo3-xml-direto.md new file mode 100644 index 0000000..be6ba6f --- /dev/null +++ b/specs/modos/SPEC-009-modo3-xml-direto.md @@ -0,0 +1,133 @@ +# SPEC-009 — Modo 3 (XML direto → sequência Premiere) + +**Status:** Rascunho — aguarda aprovação Dudu +**Fase:** F2 (canário MCP, antes de SPEC-007) +**Depende de:** SPEC-001 v2, SPEC-006 (xml_export — só pra schemas/validação) +**Harness:** `scripts/spec-009-harness.sh` +**Branch sugerido:** `feat/SPEC-009-modo3-xml-direto` +**Issue:** a abrir + +--- + +## O que é + +Modo 3 = caminho mais simples. Dudu já tem xmeml (FCP7 XML) pronto. Sistema: +1. Valida XML (parse OTIO) +2. Importa via MCP / abre via Premiere +3. Verifica sequência apareceu no projeto + +**Por que fazer Modo 3 ANTES de Modo 1:** +- Trivial (sem decisão editorial, sem parse, sem LLM) +- Valida pipeline MCP end-to-end com material real +- Se Modo 3 falha → Modo 1 também falha. Modo 3 = canário de fumaça pro F2. +- Custo: 1-2 dias. Modo 1: 5-7 dias. + +--- + +## Input + +- **Arquivo XML:** `.xml` (xmeml FCP7) válido. Premiere espera `` ou similar. +- **Material referenciado** existindo nos paths declarados no XML +- **Premiere Pro 2026 aberto** com projeto ativo + +Fixture canônica: `tests/fixtures/decupagens/exemplo-modo3.xml` + +--- + +## Output esperado + +### Caminho feliz (MCP ao vivo) + +Sequência importada no projeto Premiere: +- Nome conforme `` do XML +- Clipes em bin (Premiere cria automático no import XML) +- Timeline reproduz ordem/cortes/tracks do XML + +### Caminho fallback (MCP indisponível) + +Erro estruturado retornado em stdout indicando falha MCP. Modo 3 não tem fallback offline (XML já É o fallback dos outros modos). + +--- + +## Pipeline interno + +``` +1. Validar XML + ├─ parse via OTIO (otio-fcp-adapter) → schema check + ├─ extrair pathurls referenciados + └─ verificar arquivos existem (path traversal hardening) + +2. Pré-flight MCP + ├─ get_project_info → projeto ativo? + └─ se falhar → erro + +3. Import XML + ├─ tentar MCP tool de import XML (research: nome exato — list_available_effects? import_media com .xml?) + └─ se MCP não tem tool dedicada: usar AppleScript bridge ou ScriptUI .jsx via execute_script + +4. Validação pós-import + ├─ list_sequences → confirmar sequência apareceu + ├─ list_sequence_tracks → confirmar tracks esperados + └─ pra cada clip: get_clip_properties → confirmar nome esperado (mitigação bug Premiere 2025) + +5. Retornar JSON {sequence_name, n_clips, mode: "mcp", elapsed_s} +``` + +--- + +## Regras de validação + +- [ ] Helper `helpers/modo3.py` existe e é importável (`uv run python -c "from helpers import modo3"`) +- [ ] CLI `uv run python helpers/modo3.py ` retorna JSON em stdout +- [ ] Fixture `tests/fixtures/decupagens/exemplo-modo3.xml` parseia via OTIO sem erro +- [ ] Path hardening: rejeitar XML com pathurls fora de allowlist +- [ ] Smoke test MCP (gated, Premiere aberto): rodar fixture → sequência aparece no projeto +- [ ] Pós-import validation detecta caso "wrong file linked" (bug Premiere 2025) — abortar com erro claro +- [ ] Pipeline completo termina em <10s pra fixture +- [ ] Pytest `tests/test_spec_009_modo3.py` passa + +--- + +## Forbidden + +- ❌ Modificar o XML antes de importar (Modo 3 é passthrough, não transforma) +- ❌ Criar sequência manual via MCP (deixa Premiere fazer via import XML nativo) +- ❌ Path sem validação: + - Resolver `pathurl` (file://localhost/...) → `Path.resolve()` + - Rejeitar paths fora allowlist (`material_teste/`, `~/Movies/`, `/Volumes/`) + - Verificar `is_file()` antes de passar pro Premiere +- ❌ Confiar em retorno MCP sem cross-check `get_clip_properties` +- ❌ `import anthropic`, API paga (Mandamento 7) + +--- + +## Stack autorizada + +| Componente | Origem | +|------------|--------| +| OpenTimelineIO + otio-fcp-adapter | já em pyproject.toml | +| Adobe_Premiere_Pro_MCP | hetpatel-11; tools: `get_project_info`, `list_sequences`, `list_sequence_tracks`, `get_clip_properties`, + tool de import XML (a confirmar empiricamente) | +| Click ou argparse | CLI parsing | + +--- + +## Riscos + +1. **MCP pode não ter tool dedicada de import XML** — Premiere ExtendScript tem `app.openDocument()` ou `app.project.importFiles()`. Validar empiricamente quais tools hetpatel-11 expõe pra import.xml. Se não houver, escrever .jsx custom + executar via outra tool. +2. **Bug "random footage" Premiere 2025** — mesmo via import XML, pode linkar arquivo errado se houver naming collision. Mitigação: validação pós-import obrigatória. +3. 🔴 **ExtendScript EOL Set/2026** (ADR-005) — Modo 3 também afetado. + +--- + +## Não inclui + +- Modo 1 (decupagem doc) — SPEC-007 +- Modo 2 (briefing casual) — SPEC-008 (V0.5) +- Geração de XML (Modo 3 só importa, não cria) +- Multicam — V1 + +--- + +## Aprovação + +Pendente Dudu. diff --git a/tests/fixtures/decupagens/exemplo-modo3.xml b/tests/fixtures/decupagens/exemplo-modo3.xml new file mode 100644 index 0000000..2df2b1f --- /dev/null +++ b/tests/fixtures/decupagens/exemplo-modo3.xml @@ -0,0 +1,56 @@ + + + + + AUTOEDIT_modo3_fixture + 900 + + 30 + FALSE + + + + + +