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
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:
co-authored by
Claude Fable 5
parent
1fd0c1b3d6
commit
93a506b636
@@ -184,6 +184,31 @@ def test_silence_window_cannot_run_past_the_end():
|
||||
assert any("se sale de la duración total" in e for e in errors_of(bad))
|
||||
|
||||
|
||||
def test_the_live_palette_widens_what_a_preset_may_be():
|
||||
"""Con la paleta de GET /audio, un preset nuevo en shortsmith llega aquí
|
||||
sin tocar este repo — el mismo pacto que las plantillas."""
|
||||
doc = spec_with(shot(duration=25.0))
|
||||
doc["audio"] = {"preset": "pulse"}
|
||||
validate_spec(doc, TEMPLATES, presets=("sonar", "pulse", "static", "none"))
|
||||
|
||||
|
||||
def test_without_the_palette_only_the_baseline_presets_pass():
|
||||
"""El default es conservador a propósito: nunca acepta lo que un shortsmith
|
||||
viejo no renderice."""
|
||||
doc = spec_with(shot(duration=25.0))
|
||||
doc["audio"] = {"preset": "pulse"}
|
||||
assert any("audio.preset" in e for e in errors_of(doc))
|
||||
|
||||
|
||||
def test_an_unknown_preset_error_names_the_palette():
|
||||
doc = spec_with(shot(duration=25.0))
|
||||
doc["audio"] = {"preset": "vaporwave"}
|
||||
with pytest.raises(SpecInvalid) as exc:
|
||||
validate_spec(doc, TEMPLATES, presets=("sonar", "pulse", "none"))
|
||||
line = next(e for e in exc.value.errors if "audio.preset" in e)
|
||||
assert "pulse" in line and "vaporwave" in line
|
||||
|
||||
|
||||
def test_extra_root_key_is_rejected():
|
||||
bad = spec_with(shot(duration=25.0)); bad["narrative_shape"] = "case_file"
|
||||
assert any(e.startswith("narrative_shape:") for e in errors_of(bad))
|
||||
|
||||
Reference in New Issue
Block a user