Files
gart/code/Engine/docs/06_BOAS_PRATICAS.md
T
João HenriqueandClaude Opus 5 dcdd73edb5 docs: varredura geral, documentação por função e regra de atualização
A documentação descrevia um sistema que não existe mais: 62/73 ferramentas
(são 74), writer.py e models.py como arquivos (viraram pacotes), 1032 testes
(são 1454), models_api.py descrito como "API FastAPI" (é ponte JSON) e o app
SwiftUI ausente por completo — 5.500 linhas que o usuário opera todo dia sem
uma linha de documentação.

Cada arquivo passa a ter uma função específica, com cabeçalho de escopo
dizendo o que cobre e o que NÃO cobre (com a seta para quem cobre). O objetivo
é ler só o necessário: doc fora do assunto custa tempo e processamento sem
entregar nada.

    01 arquitetura   camadas, duas portas de entrada, regras transversais
    02 módulos       mapa do engine, incluindo o pipeline de voz
    03 server/tools  as 74 tools, helpers e como criar uma nova
    08 app macOS     NOVO — build por swiftc, telas, ponte, etapa 5
    09 manutenção    NOVO — por onde começar, o que está aberto, sintoma→arquivo

CLAUDE.md ganha a seção "Documentação (MANDATORY)": tabela de roteamento
(qual arquivo abrir para cada tarefa) e a regra de que toda alteração de
código atualiza a doc no mesmo commit, com o mapa de o-que-mexeu → o-que-
atualizar. Doc velha engana mais que doc ausente.

O índice do 05_EXPERIENCIAS subiu para o topo: consultar "isso já quebrou
antes?" custava carregar 1.281 linhas antes de chegar na tabela.

Dívidas levantadas na varredura e registradas em 09 §2: etapa 6 ainda ignora
o phrase_review.json, offset de ~400ms do Whisper, MacApp sem teste, admin/
fora do lint, confirmações visuais pendentes no FCP, submódulo WHISPERX sujo.

Também corrigidos dois links quebrados no Engine/README que apontavam um
nível acima do certo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 22:51:33 -04:00

4.1 KiB

06 — Boas Práticas de Programação (G-ART)

Escopo: Checklist de qualidade a aplicar antes de dar algo por pronto. Não cobre: Por onde começar uma tarefa (→ 09) · o que já quebrou (→ 05)

Propósito: registrar as melhores práticas de programação a serem aplicadas sempre que qualquer alteração ou correção for feita neste programa. Servem de checklist obrigatório antes de concluir qualquer mudança.

Regra: antes de considerar uma alteração concluída, confira os itens abaixo. Eles são o mesmo espírito do fluxo de validação pós-correção (Engine/run_after_fix.sh), mas cobrem também qualidade de código e convenções do projeto.


1. Correções de código

  1. Sempre valide após corrigir — rode ./Engine/run_after_fix.sh (lint + testes). Nunca declare uma correção pronta sem que lint e a suíte passem.
  2. Toda correção já corrigida vira registro — registre o problema em Engine/docs/05_EXPERIENCIAS.md para que não se repita.
  3. Mude o mínimo necessário — altere apenas o que resolve o problema; evite refatorar código não relacionado na mesma mudança.

2. Tempo e FCPXML

  1. Nunca use float para tempo — toda duração/offset é TimeValue (fração racional "600/2400s"). Float introduz erro de arredondamento.
  2. offset é a posição na timeline; start é o in-point na origem — não confundir nas edições de clip.
  3. Markers são filhos dos clips, não irmãos — e <spine> é a storyline primária; connected clips penduram-se com atributo lane.
  4. Preserve sidecars em bundles .fcpxmld — ao gravar um bundle, copie os arquivos de dados; caso contrário destrói object-tracking/Cinematic.

3. Estrutura e arquitetura

  1. Mantenha o núcleo desacoplado — fcpxml/ não conhece o protocolo MCP; server.py é a camada de transporte. Não vazem lógica MCP para o núcleo.
  2. Use o padrão de dispatch — sem cadeias gigantes de if/elif; use TOOL_HANDLERS (dicionário nome → handler assíncrono).
  3. Reaproveite os helpers centrais — _parse_project(), _resolve_io_paths(), _setup_modifier(), etc. Não duplique parse/validação de caminho.
  4. Nunca sobrescreva o original — use generate_output_path() e crie _modified, _chapters, etc.
  5. Mantenha o MarkerType como single source of truth — a serialização (parse/escrita) vive no enum, não espalhada por handlers.

4. Segurança

  1. Sempre use safe_xml.py (defusedxml) — todos os entry points de parse; jamais xml.etree cru com input não confiável.
  2. Valide caminhos com _validate_filepath / _validate_output_path — o sandbox de I/O existe para impedir escrita fora do permitido.
  3. Rejeite payloads excessivamente aninhados — _check_json_depth protege contra payloads além de 50 níveis.
  4. Nunca registre/commite segredos ou chaves — nem em logs, nem em código.

5. Qualidade e clareza

  1. Sem comentários desnecessários — código deve ser autoexplicativo; comente o porquê, não o o quê.
  2. Mimice as convenções do projeto — mesma estrutura de imports, nomes, padrões e bibliotecas já usadas nas vizinhas.
  3. Lazy import de dependências opcionais — media_intel (librosa) e transcribe (Whisper) importam sob demanda e degradam com graça (None).
  4. Convenções de teste — use examples/sample.fcpxml + fixtures XML inline; sample.fcpxml NÃO é DTD-conformante, não o use como fixture de validade DTD.

6. Checklist final antes de concluir uma alteração

  • ./Engine/run_after_fix.sh passou (lint zero erros + todos os testes).
  • Problema registrado em Engine/docs/05_EXPERIENCIAS.md (se aplicável).
  • Nenhum float usado em matemática de tempo.
  • Nenhum caminho original sobrescrito.
  • safe_xml.py usado em todo parse de input não confiável.
  • Nenhum segredo registrado ou commitado.
  • Mudança mínima, sem refatoração não relacionada.
  • Boa prática nova aprendida adicionada a esta lista.