---
description: Canonical content IDs for enemies, map objects, sounds, and VFX — use exact IDs from docs/specification-content-catalog.md
alwaysApply: true
---

# Content Catalog IDs

**Source of truth:** `docs/specification-content-catalog.md`. Always use exact IDs from the catalog. Do not invent new IDs without extending the catalog first.

## Naming Conventions

- Enemies: `enemy.<slug>` where `<slug>` is the unique DB `enemies.type` (220 templates); examples: `enemy.wolf_l1_10_forest`, `enemy.titan_l41_50_sky`
- Monster models: `monster.<class>.<slug>.v1` (e.g. `monster.base.wolf_forest.v1`, `monster.elite.demon_fire.v1`)
- Map objects: `obj.<category>.<variant>.v1` (e.g. `obj.tree.pine_tall.v1`, `obj.road.dirt_curve.v1`)
- Equipment slots: `gear.slot.<slug>` (e.g. `gear.slot.head`, `gear.slot.cloak`, `gear.slot.finger`)
- Equipment forms (per-slot garment/weapon archetypes): `gear.form.<slotKey>.<formSlug>` (e.g. `gear.form.feet.boots`, `gear.form.finger.ring`, `gear.form.head.helmet`) — full table in `docs/specification-content-catalog.md` §0a
- Quiver slot: `gear.slot.quiver`; ammunition families: `gear.ammo.<slug>.v1` (e.g. `gear.ammo.iron_bodkin.v1`) — table in §0d; scaling formulas in `docs/specification.md` §6.4
- Neutral NPCs: `npc.<role>.<slug>.v1` (e.g. `npc.traveler.worn_merchant.v1`)
- World/social events: `event.<kind>.<slug>.v1` (e.g. `event.duel.offer.v1`, `event.quest.alms.v1`)
- Sound cues: `sfx.<domain>.<intent>.v1` (e.g. `sfx.combat.hit.v1`, `sfx.progress.level_up.v1`)

## Enemy templates (220 slugs, 22 archetypes)

**Archetypes (`enemies.archetype`):** `wolf`, `boar`, `zombie`, `spider`, `orc`, `skeleton`, `battle_lizard`, `element`, `demon`, `skeleton_king`, `forest_warden`, `titan`, `golem`, `wraith`, `bandit`, `cultist`, `treant`, `basilisk`, `wyvern`, `harpy`, `manticore`, `shade`.

**Full slug list:** SQL migration `backend/migrations/000006b_enemy_data.sql`. Do not invent slugs; extend the generator/migration and `docs/specification-content-catalog.md` first.

## Sound Cue IDs

| ID | Trigger |
|----|---------|
| `sfx.combat.hit.v1` | normal hit |
| `sfx.combat.crit.v1` | critical hit |
| `sfx.combat.death_enemy.v1` | enemy dies |
| `sfx.loot.pickup.v1` | loot granted |
| `sfx.status.buff_activate.v1` | buff applied |
| `sfx.status.debuff_apply.v1` | debuff applied |
| `sfx.ambient.forest_loop.v1` | forest biome (loop) |
| `sfx.ui.click.v1` | button tap |
| `sfx.progress.level_up.v1` | level up |
| `sfx.social.emote.v1` | player meet / NPC short interaction |
| `sfx.ui.duel_prompt.v1` | duel offer shown |

## MVP Defaults

- One shared hit/death sound for all base enemies; unique status sounds for elites only.
- `soundCueId` optional per entity; use `ambientSoundCueId` at chunk/biome level.
- Client visuals key off **slug** (`enemy.<type>`); archetype may inform fallback styling. Asset IDs `monster.*.v1` optional per template.
- Map objects non-interactive in MVP (visual/navigation only).
- IDs (`enemyId`, `modelId`, `soundCueId`) are **content-contract keys** — keep stable across backend/client.
