v0.5.0 — ### Added
- **T-005** Event normalization (`ingest/events.py`): `ingest_events_for_report` walks all 7 PLAN §7 dataTypes (DamageDone, DamageTaken, Casts, Buffs, Debuffs, Deaths, CombatantIn…
- T-005 Event normalization (
ingest/events.py):ingest_events_for_reportwalks all 7 PLAN §7 dataTypes (DamageDone, DamageTaken, Casts, Buffs, Debuffs, Deaths, CombatantInfo), paginates onnextPageTimestamp, stores each event as a row keyed onability_game_id. Resumable viaingestion_ledger.last_event_ts. Death events usekillingAbilityGameIDas the ability-id source when present. - CombatantInfo events backfill
combatants.statsJSONB (left null by T-004). - 6 unit tests covering all-dataTypes, pagination, resume cursor, missing ledger, unknown-fight skipping, cursor-stuck break. 31 tests total.
scripts/verify_events.pylive AC harness: 244k events ingested over a 34-fight M5S report, 100% ability_game_id coverage.
Changed
scripts/verify_delta.pynow prefers non-frozen FFLogs zones (archived reports paywallevents()behind the paid/userendpoint).
Fixed
- Test isolation bug in
tests/test_schema.py::test_report_fight_event_roundtrip— query for ability id 7535 (Reprisal) wasn't scoped to the test's fight; clashed with real Reprisal events committed byverify_events. Now scoped tofight_id.