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
+16 -3
View File
@@ -464,12 +464,25 @@ def _claims_message(result) -> str:
else "no se llegó a escribir un spec")
lines.append(f"⚠️ Sin comprobación de fundamento: {why}.")
if result.render_warnings:
# shortsmith manda dos cosas por el mismo canal: textos que no cupieron al
# dibujar y avisos de la narración. Se separan aquí porque piden acciones
# distintas — uno se arregla acortando una cadena, el otro puede significar
# que el Short salió mudo.
trimmed = [w for w in (result.render_warnings or []) if not w.get("kind")]
spoken = [w for w in (result.render_warnings or []) if w.get("kind")]
if trimmed:
lines.append("")
lines.append(f"✂️ {len(result.render_warnings)} textos recortados al dibujar:")
for w in result.render_warnings[:5]:
lines.append(f"✂️ {len(trimmed)} textos recortados al dibujar:")
for w in trimmed[:5]:
lines.append(f" • [{w.get('template', '?')}] {str(w.get('text', ''))[:60]}")
if spoken:
lines.append("")
for w in spoken[:5]:
icon = "🔇" if w.get("kind") == "narration" else ""
lines.append(f"{icon} {str(w.get('text', ''))[:160]}")
if result.notes:
lines.append("")
lines.extend(f"📏 {n}" for n in result.notes)