jamiepine/voicebox · warning · ValueError
Cannot delete built-in presets
Error message
Cannot delete built-in presets
What it means
delete_preset() refuses to remove any row with is_builtin True. Built-in presets are managed by application seed data and are not user-deletable. The check runs before db.delete().
Source
Thrown at backend/services/effects.py:116
chain_dicts = [e.model_dump() for e in data.effects_chain]
error = validate_effects_chain(chain_dicts)
if error:
raise ValueError(error)
preset.effects_chain = json.dumps(chain_dicts)
db.commit()
db.refresh(preset)
return _preset_response(preset)
def delete_preset(preset_id: str, db: Session) -> bool:
"""Delete a user effect preset. Cannot delete built-in presets."""
preset = db.query(DBEffectPreset).filter_by(id=preset_id).first()
if not preset:
return False
if preset.is_builtin:
raise ValueError("Cannot delete built-in presets")
db.delete(preset)
db.commit()
return True
View on GitHub (pinned to 51f49dea19)
Solutions
- Hide the delete control for presets where is_builtin is true.
- Filter the deletable list to is_builtin == False.
- If a built-in must be hidden, add a visibility flag instead of deleting it.
Example fix
# before
delete_preset(builtin_id, db) # raises
# after — only delete user presets
p = get_preset(pid, db)
if p and not p.is_builtin:
delete_preset(pid, db) Defensive patterns
Strategy: validation
Validate before calling
from backend.services.effects import get_preset
def is_deletable(preset_id, db) -> bool:
p = get_preset(preset_id, db)
return p is not None and not p.is_builtin Type guard
def is_builtin_preset(p) -> bool:
return bool(getattr(p, "is_builtin", False)) Try / catch
try:
delete_preset(preset_id, db)
except ValueError as e:
if "built-in" in str(e):
# return 403, suppress the delete control in UI
...
raise Prevention
- Filter the delete action by is_builtin on the client.
- Don't expose delete affordances on read-only presets.
When it happens
Trigger: DELETE /presets/{id} where {id} resolves to a built-in preset (is_builtin=True).
Common situations: Bulk-delete UI; user trying to 'clean up' the default preset list; DELETE on a preset whose id was assumed to be user-owned.
Related errors
- Cannot modify built-in presets
- {exception message from delete_preset (ValueError)}
- Unknown effect type '{effect_type}' at index {i}. Available:
- A preset named '{data.name}' already exists
- Effect '{effect_type}' at index {i}: param '{param_name}' mu
AI-assisted analysis of jamiepine/voicebox@51f49dea19 (2026-08-12).
Data as JSON: /api/errors/347636a0cc9320eb.
Report an issue: GitHub.