feat(short): narración — el grounding la cubre, el contrato la admite y el prompt la guía
Build & Deploy ResearchOwl / build-and-push (push) Successful in 10s

El comprobador va primero, antes que el campo (fase 2 §12): la narración es
prosa que el modelo redacta, no una etiqueta que copia, y es donde se cuela
una cifra sin fuente. De paso, la huella de una cifra pasa a ser número +
unidad canónica: con la voz repitiendo la pantalla, '35,000 FT' y '35,000
feet' son el mismo dato y contarlos dos veces inflaría el informe del que
depende la revisión humana.

editorial_notes estima la duración CON la voz: la declarada es un suelo y sin
esto el modelo escribiría 40 s de shots, les colgaría narración y se enteraría
del Short de 65 s cuando ya está pagado.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
ChemaVX
2026-08-06 15:38:34 +00:00
co-authored by Claude Fable 5
parent 93a506b636
commit a13c3062b6
9 changed files with 375 additions and 13 deletions
+25
View File
@@ -140,3 +140,28 @@ class TestSessionFromFilename:
assert _session_from_filename("myspec.json") is None
assert _session_from_filename("") is None
assert _session_from_filename(None) is None
class TestNarrationWarnings:
"""shortsmith manda por el mismo canal los textos recortados y los avisos
de la voz. Piden acciones distintas, así que se muestran distintos."""
def test_a_silent_shot_is_reported_as_such(self):
text = _claims_message(result_with(render_warnings=[
{"kind": "narration", "text": "shots.2.narration not spoken: piper exited 1"}]))
assert "🔇" in text and "shots.2.narration" in text
assert "recortados" not in text
def test_a_stretched_video_says_so(self):
text = _claims_message(result_with(render_warnings=[
{"kind": "timing",
"text": "narration stretched the video from 32.0s to 41.5s"}]))
assert "41.5s" in text
assert "recortados" not in text
def test_trimmed_text_and_narration_do_not_get_mixed_up(self):
text = _claims_message(result_with(render_warnings=[
{"template": "data_card", "text": "FILA LARGA", "requested": 44, "size": 38},
{"kind": "narration", "text": "no voice installed"}]))
assert "1 textos recortados" in text # sólo cuenta el de dibujo
assert "🔇 no voice installed" in text