v0.12.0 — ### Added
- **T-108** Ability DB + classifier + review queue (Phase 1 — unblocks T-105 M-BURST and T-303 M-MIT). - Two new tables (alembic `eb34cac3f775`): `abilities` (XIVAPI metadata keye…
- T-108 Ability DB + classifier + review queue (Phase 1 — unblocks T-105 M-BURST and T-303 M-MIT).
- Two new tables (alembic
eb34cac3f775):abilities(XIVAPI metadata keyed onability_game_id, withkind = action|status|unknown) andability_labels(label,confidence,source ∈ {auto, user}). 14 tables in dev DB. ingest/xivapi.py— paced HTTP client + bootstrap that routes each ability to the right XIVAPI namespace (Action vs Status) based on dominant event type in theeventstable; handles FFLogs'+1,000,000status-id offset (fflogs id1002216→ Status2216"The Wanderer's Minuet").analysis/ability_classifier.py— rule-based labeler emitting(label, confidence)acrossraid_buff / personal_buff / mit_party / mit_boss_debuff / mit_self / damage_down / ignore / unknown. Cleans XIVAPI's HTML +<If(…)>templates before matching.relabel_all()upserts intoability_labelsand never overwritessource='user'rows.- Three API endpoints:
GET /api/abilities/review-queue(low-confidence + missing-label rows),GET /api/abilities/labels(filterable by label),PATCH /api/abilities/{id}/label(user override →source='user', conf=1.0). - React
Abilities.jsx(new tab inApp.jsx) — review-queue list + per-ability label-button row + all-labels filtered view; reads XIVAPI icon URLs directly. scripts/bootstrap_abilities.pylive ingest harness (--force,--limit,--skip-fetchflags + summary output).- 30 new tests: 13 XIVAPI client (mocked transport, classify_namespace, fetch_one routing, FFLogs status-offset handling), 12 classifier (Rampart / Shake It Off / Reprisal / Feint / Divination / Inner Release / Damage Down / potency-as-ignore), 6 API (review queue, user override, label-vocab validation, 404, filtering, create-on-PATCH). 107 tests total.
- Live AC against 608 distinct ability IDs in the dev DB's M5S+FRU events: 264 resolved as XIVAPI Actions, 174 as Statuses (post offset-fix), 170 stayed unknown (boss-only mechanics / environmental damage — expected). Classifier auto-labeled 204 at ≥0.85 confidence. Correctly picked up real raid mechanics: Divination / Mage's Ballad / Radiant Finale (raid_buff), Collective Unconscious / Intervention / Troubadour (mit_party), Reprisal (mit_boss_debuff), Rampart / Holy Sheltron / Guardian (mit_self), Damage Down itself.