What it is
When a configured voice endpoint starts failing (expired key, revoked key, provider outage), Director.synthesizeOrSkip (src/director.ts:599-610) retries, then prints "voice synthesis failed (…); skipping this segment" — per segment, forever. The setup offer never reopens because detectGaps only checks that a URL exists, not that it works. A user whose free-tier key lapses gets a silently mute radio with no path back to the guide short of the shell. Surfaced by the 2026-08-01 fish.audio onboarding research (suspected broader than fish.audio: any hosted endpoint can rot).
Spec
specs/spec03/03-03-guide-harness.md §7.1 (gap detection / trigger policy).
Done when
Repeated auth-shaped synth failures (401/402/403) surface as a named gap — one info line pointing at --setup, or the next boot's offer includes the voice gap again. Not a blocker, no auto-reopen mid-broadcast, no retry-storm. Unit test at the director/startup seam.
What it is
When a configured voice endpoint starts failing (expired key, revoked key, provider outage),
Director.synthesizeOrSkip(src/director.ts:599-610) retries, then prints "voice synthesis failed (…); skipping this segment" — per segment, forever. The setup offer never reopens becausedetectGapsonly checks that a URL exists, not that it works. A user whose free-tier key lapses gets a silently mute radio with no path back to the guide short of the shell. Surfaced by the 2026-08-01 fish.audio onboarding research (suspected broader than fish.audio: any hosted endpoint can rot).Spec
specs/spec03/03-03-guide-harness.md§7.1 (gap detection / trigger policy).Done when
Repeated auth-shaped synth failures (401/402/403) surface as a named gap — one info line pointing at
--setup, or the next boot's offer includes the voice gap again. Not a blocker, no auto-reopen mid-broadcast, no retry-storm. Unit test at the director/startup seam.