feat: criado repositório jhonny-editor no Gitea

criado repositório jhonny-editor no Gitea
adicionado script admin/deploy.command com commit automático
atualizado admin/DEV-NOTES.md com template limpo

Resumo:
- 32 arquivos alterados
- 16 novos
- 15 modificados
- 0 removidos

 16 files changed, 638 insertions(+), 61 deletions(-)

Arquivos:
  - code/engine/skills/boas-praticas-oo.md -> .agents/skills/boas-praticas-oo/SKILL.md
  - AGENTS.md
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
  - code/engine/integracoes/visual/apple_vision.py
  - code/engine/integracoes/visual/apple_vision_runner.swift
  - code/engine/integracoes/visual/extrator_ffmpeg.py
  - code/engine/scanner/__init__.py
  - code/engine/scanner/configuracao_visual.py
  - code/engine/scanner/coordenacao/__init__.py
  - code/engine/scanner/retakes/adaptador_de_falas.py
  - code/engine/scanner/retakes/agrupador_de_takes.py
  - code/engine/scanner/retakes/detector_de_reinicios.py
  - code/engine/scanner/retakes/modelos_de_retakes.py
  - code/engine/scanner/visual.py
  - .jhonny/
  - .retakes/
  - CODING_STANDARDS.md
  - code/engine/executar_retakes.py
  - code/engine/persistencia/
  - code/engine/scanner/retakes/__init__.py
  - code/engine/scanner/retakes/carregador_de_artefatos.py
  - code/engine/scanner/retakes/classificador_de_retakes.py
  - code/engine/scanner/retakes/coordenador_de_retakes.py
  - code/engine/scanner/retakes/deteccao_de_retakes.py
  - code/engine/scanner/retakes/gerador_de_evidencias.py
  - code/engine/scanner/retakes/repositorio_de_retakes.py
  - code/engine/testes/test_consultas_de_persistencia.py
  - code/engine/testes/test_deteccao_de_retakes.py
  - code/engine/testes/test_persistencia_sqlite.py
  - code/relatorios/audio/arquivos/92f97877259a86a8095b1eecafdefe357212a12247d04b78df60e0c0ae38b2ea/
This commit is contained in:
João Henrique
2026-09-08 17:13:19 -04:00
parent b9bf3b2863
commit ee181360c8
40 changed files with 3674 additions and 61 deletions
@@ -0,0 +1,87 @@
"""Geração de evidências legíveis para cada grupo de retakes.
Produz uma lista estruturada ``{tipo, descricao, valor}`` que explica por
que duas falas foram consideradas retake — pronto para a interface do
painel descrever os motivos ao usuário.
"""
from __future__ import annotations
from .modelos_de_retakes import AgrupamentoDeFalas, ClassificacaoDeRetake, EvidenciaDeRetake
class GeradorDeEvidencias:
"""Monta as evidências de um grupo a partir do agrupamento e da categoria."""
def gerar(
self,
agrupamento: AgrupamentoDeFalas,
classificacao: ClassificacaoDeRetake,
) -> list[EvidenciaDeRetake]:
evidencias: list[EvidenciaDeRetake] = []
if not agrupamento.pares:
return evidencias
par = max(agrupamento.pares,
key=lambda item: item.comparacao.similaridade_final)
comp = par.comparacao
estado = "É um retake provável." if classificacao.tipo == "retake_confirmado" else (
"Pode ser um retake." if classificacao.tipo == "possivel_retake" else "Repetição detectada.")
evidencias.append(EvidenciaDeRetake(
tipo="similaridade_textual",
descricao=(
f"As duas falas possuem {comp.similaridade_jaccard * 100:.0f}% "
f"de palavras em comum e {comp.similaridade_final * 100:.0f}% de "
f"similaridade textual geral."
),
valor=comp.similaridade_final,
))
if par.similaridade_semantica > 0:
evidencias.append(EvidenciaDeRetake(
tipo="similaridade_semantica",
descricao=f"Semanticamente, as falas têm {par.similaridade_semantica * 100:.0f}% de afinidade.",
valor=par.similaridade_semantica,
))
if comp.similaridade_do_inicio >= 0.8:
evidencias.append(EvidenciaDeRetake(
tipo="repeticao_do_inicio",
descricao="As duas falas começam com as mesmas palavras.",
valor=comp.similaridade_do_inicio,
))
evidencias.append(EvidenciaDeRetake(
tipo="proximidade_temporal",
descricao=(
f"A segunda tentativa começa {par.intervalo.intervalo_em_segundos:.1f} "
f"segundos após a primeira."
),
valor=par.intervalo.proximidade_temporal,
))
for sinal in agrupamento.sinais_de_reinicio:
for detalhe in sinal.evidencias:
evidencias.append(EvidenciaDeRetake(
tipo="reinicio",
descricao=detalhe,
valor=sinal.intensidade,
))
if par.mudanca_visual_proxima:
evidencias.append(EvidenciaDeRetake(
tipo="mudanca_visual_proxima",
descricao=(
"Há um corte visual próximo: as tentativas podem estar em "
"tomadas diferentes, reforçando a hipótese de retake."
),
valor=1.0,
))
evidencias.append(EvidenciaDeRetake(
tipo="classificacao",
descricao=f"{estado} Confiança de {classificacao.confianca * 100:.0f}%.",
valor=classificacao.confianca,
))
return evidencias