🔥 The gap
Firing a persona blocked only by a dated special returns the honest-but-generic 409 ("…still appears in the format-clock schedule or a dated special…" — wording widened at T259 review). It cannot NAME the special the way the show-delete guard names its referencing specials, because PersonaWriteResult.ScheduledElsewhere carries IReadOnlyList<ScheduledSlot> whose row shape (DayOfWeek/StartMinute/EndMinute) has no date field — naming a special needs a domain-shape change across PersonaRepository + its specs, not a filter.
📍 In-code notes (predate this issue; add the ref when next touched)
src/GenWave.Host/Api/PersonaController.cs — Delete's remarks
src/GenWave.Host/Api/SpecialsController.cs — class remarks (the why-not-cheap rationale)
🔧 Fix shape
Widen ScheduledSlot (or add a dated sibling) so ScheduledElsewhere can carry both weekly slots and dated specials; ScheduledPersonaProblem renders both. The show-side guard (ShowsController.Delete + ScheduledSlotText.FormatSpecial) is the pattern to mirror.
🔥 The gap
Firing a persona blocked only by a dated special returns the honest-but-generic 409 ("…still appears in the format-clock schedule or a dated special…" — wording widened at T259 review). It cannot NAME the special the way the show-delete guard names its referencing specials, because
PersonaWriteResult.ScheduledElsewherecarriesIReadOnlyList<ScheduledSlot>whose row shape (DayOfWeek/StartMinute/EndMinute) has no date field — naming a special needs a domain-shape change acrossPersonaRepository+ its specs, not a filter.📍 In-code notes (predate this issue; add the ref when next touched)
src/GenWave.Host/Api/PersonaController.cs—Delete's remarkssrc/GenWave.Host/Api/SpecialsController.cs— class remarks (the why-not-cheap rationale)🔧 Fix shape
Widen
ScheduledSlot(or add a dated sibling) soScheduledElsewherecan carry both weekly slots and dated specials;ScheduledPersonaProblemrenders both. The show-side guard (ShowsController.Delete+ScheduledSlotText.FormatSpecial) is the pattern to mirror.