# E2.M2 — XpAwardAndLevelEngine ## Summary | Field | Value | |--------|--------| | **Module ID** | E2.M2 | | **Epic** | [Epic 2 — Skills and Progression Framework](../epics/epic_02_skills_and_progression.md) | | **Stage target** | Prototype | | **Status** | Planned (see [dependency register](module_dependency_register.md)) | ## Purpose Central server-authoritative engine for **non-combat skill** progression: applying XP grants, resolving levels against data-driven curves, and emitting level-up events. **Gathering** and **crafting** integrate as callers for **skill** XP. **Combat encounters** advance **gigs** (gig XP), not `SkillDef` lines. **Mission rewards** may call this API for **skill** XP when the payout lists a skill grant. Callers are not hard dependencies for implementing the engine core (see Epic 2 Slice 2 vs Slice 3). ## Responsibilities - Apply `XpGrantEvent` (or equivalent) per skill with validated **`skillId`** from [E2.M1](E2_M1_SkillDefinitionRegistry.md). Reject grants when **`sourceKind`** is not in the target `SkillDef.allowedXpSourceKinds`. - Resolve experience against `LevelCurve` / threshold tables. - Emit `LevelUpEvent` when thresholds are crossed. - Support data-driven curves; **reload policy:** [Data reload and telemetry operations policy](data_and_ops_policy.md#content-and-gameplay-data-reload) (boot load default; optional dev reload). ## Key contracts | Contract | Role | |----------|------| | `XpGrantEvent` | Structured XP award: **`skillId`** (must exist in registry), **amount**, **`sourceKind`** (must appear in that skill’s **`allowedXpSourceKinds`**), optional modifiers. | | `LevelCurve` | Thresholds or formula per skill or global policy. | | `LevelUpEvent` | Notification for UI, unlocks, and downstream systems. | ## Module dependencies - **E2.M1** — [SkillDefinitionRegistry](E2_M1_SkillDefinitionRegistry.md): `SkillDef`, categories, **allowedXpSourceKinds**, and validation of skill IDs. ## Dependents (by design) - **E5.M1** — CombatRulesEngine: **gig XP** from combat (not `SkillDef` XP via E2.M2). - **E3.M1 / E3.M2** — Gathering and crafting award XP when wired in Slice 3. - **E7.M2** — RewardAndUnlockRouter routes quest rewards including XP through E2.M2. - **E2.M3 / E2.M4** — Mastery and pacing layers build on level/XP state (pre-production). ## Related implementation slices - **Epic 2 Slice 2 — XP engine (E2.M2 core)**: implement contracts and tests without requiring Epic 3 or 5 modules. - **Epic 2 Slice 3 — XP award integration**: E3.M1 / E3.M2 call the skill XP API with **`sourceKind`: `activity`** (where allowed per skill); E7.M2 / mission rewards use **`mission_reward`** (etc.) as configured; combat resolves **gig** progression separately from E2.M2. ## Risks and telemetry - Runaway leveling in one skill: diminishing returns per slice; monitor distribution via E9.M2 when available. - Telemetry: `xp_grant`, `level_up`, time-to-first-level-up once real activity fires. ## Source anchors - Master plan: [`neon_sprawl_vision.plan.md`](../../../neon_sprawl_vision.plan.md) — Core Epic Map, Epic 2. - [Module dependency register](module_dependency_register.md)