```yaml
id: UJ-005
title: Delete an unused language
actors: [administrator]
surface: admin-spa
goal: Administrator removes one unused non-default language and fresh state excludes it.
trigger: Activate Delete for a non-default language at /wp-admin/admin.php?page=international-press-zone#/languages and confirm.
fixtures: [authenticated-admin, unused-nondefault-language]
success_state:
  visible: "Language deleted successfully" renders and row disappears.
  durable: wp_ipz_languages contains no target row.
  persistence: Fresh GET /wp-json/international-press-zone/v1/languages returns no target code.
source_specs: [admin/src/pages/languages.js, includes/API/LanguagesRestController.php, includes/Core/LanguageManager.php]
readiness: draft
canonical: false
blockers: []
```

## Path

| Hop | Evidence |
|---|---|
| UI trigger | `admin/src/pages/languages.js:218` |
| Request construction | `admin/src/pages/languages.js:680` |
| Endpoint auth and parse | `includes/API/LanguagesRestController.php:198` |
| Authoritative write | `includes/Core/LanguageManager.php:530` |
| Response | `includes/API/LanguagesRestController.php:563` |
| Terminal render | `admin/src/pages/languages.js:682` |

## Happy path

### H1
- Setup: Administrator authenticated; target language is non-default and has zero translations.
- Action: Activate target `Delete` and confirm.
- Request: `DELETE /wp-json/international-press-zone/v1/languages/{code}`.
- Response: `200` with `{success:true,message:"Language deleted successfully."}`.
- Visible: `Language deleted successfully` renders; target row disappears.
- Durable: `wp_ipz_languages` contains no target code or ID.
- Fresh read: `GET /wp-json/international-press-zone/v1/languages` returns `200` without target.
- Forbidden: Default and other language rows remain unchanged; no translation row is deleted.
- Evidence:
  - Setup: `includes/Core/LanguageManager.php:515`
  - Action: `admin/src/pages/languages.js:218`
  - Request: `admin/src/pages/languages.js:680`
  - Response: `includes/API/LanguagesRestController.php:563`
  - Visible: `admin/src/pages/languages.js:682`
  - Durable: `includes/Core/LanguageManager.php:530`
  - Fresh read: `admin/src/pages/languages.js:85`
  - Forbidden: `includes/Core/LanguageManager.php:515`

## Alternate and failure paths

### A1
- Setup: Administrator authenticated; target language is current default.
- Action: Attempt to delete target.
- Request: `DELETE /wp-json/international-press-zone/v1/languages/{code}`.
- Response: `400` with `{code:"cannot_delete_default",message:"Cannot delete default language. Set another language as default first.",data:{status:400}}`.
- Visible: Default-language denial renders; target row remains.
- Durable: Target remains sole default row.
- Fresh read: `GET /wp-json/international-press-zone/v1/languages` returns `200` with target unchanged.
- Forbidden: No language or translation row is deleted.
- Evidence:
  - Setup: `includes/API/LanguagesRestController.php:552`
  - Action: `admin/src/pages/languages.js:218`
  - Request: `admin/src/pages/languages.js:680`
  - Response: `includes/API/LanguagesRestController.php:553`
  - Visible: `admin/src/pages/languages.js:685`
  - Durable: `includes/API/LanguagesRestController.php:552`
  - Fresh read: `admin/src/pages/languages.js:85`
  - Forbidden: `includes/API/LanguagesRestController.php:552`

## Permissions and boundaries

### P1
- Setup: No authenticated WordPress session.
- Action: Submit delete request for unused non-default language.
- Request: `DELETE /wp-json/international-press-zone/v1/languages/{code}`.
- Response: `401` with `{code:"rest_forbidden",message:"Sorry, you are not allowed to do that.",data:{status:401}}`.
- Visible: REST denial exposes no mutation result.
- Durable: Target row remains unchanged.
- Fresh read: Anonymous mutation retry returns the same `401` denial.
- Forbidden: No row is deleted; no administrator nonce is disclosed.
- Evidence:
  - Setup: `includes/API/LanguagesRestController.php:736`
  - Action: `includes/API/LanguagesRestController.php:203`
  - Request: `includes/API/LanguagesRestController.php:198`
  - Response: `includes/API/LanguagesRestController.php:736`
  - Visible: `includes/API/LanguagesRestController.php:736`
  - Durable: `includes/API/LanguagesRestController.php:736`
  - Fresh read: `includes/API/LanguagesRestController.php:736`
  - Forbidden: `includes/API/LanguagesRestController.php:736`

## Source specs

- `admin/src/pages/languages.js`
- `includes/API/LanguagesRestController.php`
- `includes/Core/LanguageManager.php`
