feat(short): la paleta de audio viva — GET /audio en el contrato, el prompt y el bucle de edición
Build & Deploy ResearchOwl / build-and-push (push) Successful in 9s

shortsmith ya compone la banda sonora (sonar); ahora publica una paleta
(pulse, static) y este repo la consume en vivo: el prompt la ofrece con sus
notas de mood, validate_spec la usa como fuente de verdad para audio.preset,
y editar el preset en /short_spec es la manera gratis de escucharlas. Sin
/audio (404 o caída) todo cae a la paleta base y nada deja de renderizar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
ChemaVX
2026-08-06 14:41:27 +00:00
co-authored by Claude Fable 5
parent 1fd0c1b3d6
commit 93a506b636
11 changed files with 259 additions and 34 deletions
+17
View File
@@ -118,6 +118,23 @@ def test_prompt_says_out_loud_that_there_is_no_article_yet():
assert "No article URL yet" in w.build_prompt("X", "m", None, "X.TEST")
def test_prompt_offers_the_live_audio_palette():
"""La mitad de audio del contrato vivo: los presets y sus notas de mood
vienen de GET /audio, no de este repo."""
palette = {"sonar": "the case-file mood", "pulse": "tension, built for debunks"}
w, _ = writer("{}", presets=palette)
prompt = w.build_prompt("X", "m", None, "X.TEST")
assert '"pulse" — tension, built for debunks' in prompt
assert "whose mood fits the shape" in prompt
def test_prompt_without_a_palette_only_offers_the_baseline():
w, _ = writer("{}")
prompt = w.build_prompt("X", "m", None, "X.TEST")
assert '"sonar"' in prompt and '"none"' in prompt
assert '"pulse"' not in prompt
# --- bucle ------------------------------------------------------------------
@pytest.mark.asyncio